استخراج عناوين IP الخاصة بالبروكسي والمنافذ الست عشرية من JSON المضمّن
فك حِزم JSON المعروفة من نداءات السكربتات في قوائم البروكسي، وفسّر المنفذ الست عشري فقط عندما يصرّح تنسيق المصدر بذلك.
لا يعني جدول 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 هذا. استخراج العنوان والمنفذ لا يثبت أن نقطة النهاية تقدّم حاليًا خدمة بروكسي صالحة.