טבלת HTML ריקה לא תמיד אומרת שהתגובה אינה מכילה רשומות פרוקסי. רשימות מסוימות שמות אובייקטי JSON בתוך קריאות JavaScript וממלאות את השורות מאוחר יותר.

עבור מקור שכבר הושג ושמשתמש בעטיפה הספציפית gp.insertPrx ואחריה אובייקט JSON:

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 הוא טקסט המקור, לא אובייקט דפדפן. הביטוי הרגולרי מוצא עטיפה מוכרת; JSONDecoder קובע היכן מסתיים ערך ה-JSON. כך נמנע ניסיון לנתח JSON מקונן רק בעזרת ביטוי רגולרי.

שדה הפורט בדוגמה הוא הקסדצימלי במפורש: C38 פירושו 3128 עשרוני. אל תחילו בסיס 16 על שדה עשרוני של ספק אחר רק מפני ששניהם נקראים פורט.

זהו מנתח לתבנית הנקובה, לא מפרש JavaScript. ליטרלים של אובייקטים במירכאות בודדות, ערכים מחושבים וביטויי JavaScript אחרים דורשים ממשק נתונים מתועד אחר. אל תריצו קוד עמוד שרירותי כדי לקבל רשימת נקודות קצה.

אמתו את חוזה המקור ושמרו את שדות הפרוטוקול בנפרד. אם במקור יש שורות HTML מלאות, השתמשו בחילוץ נקודות קצה לפי שורה ולא במנתח עטיפות ה-JavaScript הזה. חילוץ כתובת ופורט אינו מוכיח שנקודת הקצה מציעה כעת שירות פרוקסי שמיש.

מאמרים קשורים