Proxy IP ir šešioliktainių prievadų išgavimas iš įterpto JSON
Iššifruokite žinomus JSON duomenis iš proxy sąrašų scenarijų kvietimų ir šešioliktainį prievadą interpretuokite tik tada, kai šaltinio formatas tai nurodo.
Tuščia HTML lentelė ne visada reiškia, kad atsakyme nėra proxy įrašų. Kai kurie sąrašai deda JSON objektus į JavaScript kvietimus ir eilutes užpildo vėliau.
Jei jau gautas šaltinis naudoja konkretų apvalkalą gp.insertPrx, po kurio eina JSON objektas:
import ipaddress
import json
import re
decoder = json.JSONDecoder()
endpoints = set()
for marker in re.finditer(r"gp[.]insertPrx\(\s*", html):
try:
row, end = decoder.raw_decode(html, marker.end())
if not isinstance(row, dict):
continue
address = ipaddress.ip_address(row["PROXY_IP"])
port = int(row["PROXY_PORT"], 16)
except (ValueError, KeyError, TypeError):
continue
if 1 <= port <= 65535 and html[end:].lstrip().startswith(");"):
endpoints.add((str(address), port))
html yra šaltinio tekstas, o ne naršyklės objektas. Reguliarusis reiškinys randa žinomą apvalkalą; JSONDecoder nustato, kur baigiasi JSON reikšmė. Taip išvengiama bandymo analizuoti įterptą JSON vien tik reguliariuoju reiškiniu.
Pavyzdžio prievado laukas yra aiškiai šešioliktainis: C38 reiškia dešimtainį 3128. Netikėkite 16 pagrindo kito teikėjo dešimtainiam laukui vien todėl, kad abu vadinami prievadu.
Tai nurodyto formato analizatorius, o ne JavaScript interpretatorius. Objektų literalai su viengubomis kabutėmis, apskaičiuotos reikšmės ir kiti JavaScript reiškiniai reikalauja kitos dokumentuotos duomenų sąsajos. Nevykdykite savavališko puslapio kodo, kad gautumėte galinių taškų sąrašą.
Patikrinkite šaltinio sutartį ir protokolo laukus laikykite atskirai. Jei šaltinyje vietoj to yra užpildytos HTML eilutės, naudokite galinių taškų išgavimą pagal eilutes, o ne šį JavaScript apvalkalo analizatorių. Adreso ir prievado išgavimas neįrodo, kad galinis taškas šiuo metu siūlo naudojamą proxy paslaugą.