Trekk ut proxy-IP-er og hex-porter fra innebygd JSON
Dekod kjente JSON-nyttelaster fra skriptkall i proxylister, og tolk en hex-port bare når kildeformatet oppgir det.
En tom HTML-tabell betyr ikke alltid at svaret ikke inneholder proxyoppføringer. Noen lister plasserer JSON-objekter inne i JavaScript-kall og fyller radene senere.
For en allerede hentet kilde som bruker den spesifikke innpakningen gp.insertPrx etterfulgt av et JSON-objekt:
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 er kildeteksten, ikke et nettleserobjekt. Det regulære uttrykket finner en kjent innpakning; JSONDecoder avgjør hvor JSON-verdien slutter. Det unngår å prøve å parse innebygd JSON med et regulært uttrykk alene.
Eksempelets portfelt er uttrykkelig heksadesimalt: C38 betyr desimalt 3128. Ikke bruk grunntallet 16 på en annen leverandørs desimalfelt bare fordi begge kalles port.
Dette er en parser for det angitte formatet, ikke en JavaScript-tolk. Objektliteraler med enkle anførselstegn, beregnede verdier og andre JavaScript-uttrykk trenger et annet dokumentert datagrensesnitt. Ikke kjør vilkårlig sidekode for å få en endepunktliste.
Valider kildens kontrakt og hold protokollfelt adskilt. Hvis kilden i stedet har fylte HTML-rader, bruk radbasert endepunktuttrekk i stedet for denne JavaScript-innpakningsparsere. Å trekke ut en adresse og port beviser ikke at endepunktet for tiden tilbyr en brukbar proxytjeneste.