خالی 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 ریپر پارسر کے بجائے قطار کے لحاظ سے اینڈ پوائنٹ نکالنا استعمال کریں۔ پتہ اور پورٹ نکالنا یہ ثابت نہیں کرتا کہ اینڈ پوائنٹ اب قابلِ استعمال پراکسی سروس پیش کر رہا ہے۔

متعلقہ مضامین