খালি 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 র‍্যাপার পার্সারের বদলে সারি-ভিত্তিক এন্ডপয়েন্ট নিষ্কাশন ব্যবহার করুন। ঠিকানা ও পোর্ট বের করা প্রমাণ করে না যে এন্ডপয়েন্টটি এখন ব্যবহারযোগ্য প্রক্সি সেবা দিচ্ছে।

সম্পর্কিত নিবন্ধ