रिकामा HTML तक्ता म्हणजे प्रतिसादात प्रॉक्सी नोंदी नाहीत असे नेहमी नसते. काही याद्या JavaScript कॉलमध्ये JSON ऑब्जेक्ट ठेवतात आणि नंतर ओळी भरतात.

आधीच मिळवलेला स्रोत विशिष्ट रॅपर 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 रॅपर पार्सरऐवजी ओळीनुसार एंडपॉइंट निष्कर्षण वापरा. पत्ता आणि पोर्ट काढणे म्हणजे एंडपॉइंट सध्या वापरण्यायोग्य प्रॉक्सी सेवा देतो असा पुरावा नाही.

संबंधित लेख