Prokšu IP un heksadecimālo portu izguve no iegultā JSON
Atšifrējiet zināmas JSON kravas no prokšu sarakstu skriptu izsaukumiem un interpretējiet heksadecimālo portu tikai tad, kad avota formāts to norāda.
Tukša HTML tabula ne vienmēr nozīmē, ka atbildē nav prokšu ierakstu. Daži saraksti ievieto JSON objektus JavaScript izsaukumos un rindas aizpilda vēlāk.
Jau iegūtam avotam, kas izmanto konkrēto ietvaru gp.insertPrx un pēc tā JSON objektu:
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 ir avota teksts, nevis pārlūka objekts. Regulārā izteiksme atrod zināmu ietvaru; JSONDecoder nosaka, kur beidzas JSON vērtība. Tā tiek izvairīties no mēģinājuma parsēt iegultu JSON tikai ar regulāro izteiksmi.
Piemēra porta lauks ir nepārprotami heksadecimāls: C38 nozīmē decimālo 3128. Neattieciniet 16. bāzi uz cita pakalpojumu sniedzēja decimālo lauku tikai tāpēc, ka abi tiek saukti par portu.
Šis ir parsētājs norādītajam formātam, nevis JavaScript interpretators. Objektu literāļi ar vienkāršām pēdiņām, aprēķinātas vērtības un citas JavaScript izteiksmes prasa citu dokumentētu datu saskarni. Neizpildiet patvaļīgu lapas kodu, lai iegūtu galapunktu sarakstu.
Validējiet avota līgumu un turiet protokola laukus atsevišķi. Ja avotā tā vietā ir aizpildītas HTML rindas, izmantojiet galapunktu izguvi pa rindām, nevis šo JavaScript ietvara parsētāju. Adreses un porta izguve neapstiprina, ka galapunkts pašlaik piedāvā lietojamu prokšu pakalpojumu.