HTML ဇယားဗလာဖြစ်ခြင်းသည် တုံ့ပြန်မှုတွင် ပရောက်စီမှတ်တမ်းမရှိဟု အမြဲဆိုလိုခြင်းမဟုတ်ပါ။ အချို့စာရင်းများသည် JSON အရာဝတ္ထုများကို JavaScript ခေါ်ဆိုမှုများအတွင်း ထည့်ပြီး အတန်းများကို နောက်မှ ဖြည့်ပါသည်။

ယခင်က ရရှိထားသော ရင်းမြစ်သည် သီးခြား wrapper 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 သည် ရင်းမြစ်စာသားဖြစ်ပြီး ဘရောက်ဇာအရာဝတ္ထုမဟုတ်ပါ။ ပုံမှန်ဖော်ပြချက်သည် သိရှိပြီးသား wrapper ကို ရှာတွေ့သည်။ JSONDecoder က JSON တန်ဖိုး ဘယ်တွင်ဆုံးသည်ကို ဆုံးဖြတ်သည်။ ဤနည်းဖြင့် ပုံမှန်ဖော်ပြချက်တစ်ခုတည်းဖြင့် ထပ်နေသော JSON ကို ပိုင်းခြားရန် ကြိုးစားခြင်းကို ရှောင်ကွင်းနိုင်သည်။

ဥပမာရှိ ပေါ့တ်အကွက်သည် ဟက်စာဒက်စီမယ်ဖြစ်ကြောင်း ရှင်းလင်းစွာ ဖော်ပြထားသည်။ C38 သည် ဒသမ 3128 ကို ဆိုလိုသည်။ နှစ်ခုစလုံးကို ပေါ့တ်ဟု ခေါ်သည်ဟူသော အကြောင်းကြောင့်သာ အခြားဝန်ဆောင်မှုပေးသူ၏ ဒသမအကွက်တွင် အခြေ 16 ကို အသုံးမပြုပါနှင့်။

ဤသည် ဖော်ပြထားသော ပုံစံအတွက် parser ဖြစ်ပြီး JavaScript စကားပြန်မဟုတ်ပါ။ တစ်ခုတည်းသော ကိုးကားမှုရှိသော အရာဝတ္ထု literal များ၊ တွက်ချက်ထားသော တန်ဖိုးများနှင့် အခြား JavaScript ဖော်ပြချက်များအတွက် အခြားမှတ်တမ်းတင်ထားသော ဒေတာမျက်နှာပြင် လိုအပ်သည်။ endpoint စာရင်းရရှိရန် မည်သည့်စာမျက်နှာကုဒ်ကိုမျှ အတင်းအကြပ် မလုပ်ဆောင်ပါနှင့်။

ရင်းမြစ်စာချုပ်ကို စစ်ဆေးပြီး ပရိုတိုကောအကွက်များကို သီးခြားထားပါ။ ရင်းမြစ်တွင် အစား ဖြည့်ထားသော HTML အတန်းများရှိပါက ဤ JavaScript wrapper parser အစား အတန်းအလိုက် endpoint ထုတ်ယူခြင်း ကို အသုံးပြုပါ။ လိပ်စာနှင့် ပေါ့တ်ကို ထုတ်ယူခြင်းသည် endpoint သည် ယခု အသုံးပြုနိုင်သော ပရောက်စီဝန်ဆောင်မှုကို ပေးနေသည်ဟု သက်သေမပြပါ။

ဆက်စပ်ဆောင်းပါးများ