首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP 采集天天快遞軌跡:破解 AJAX 動態載入與 16 進位編碼回傳

     編輯:程式設計綜合問答

問題分析

目標頁面 trackInfo_jsp.jsp 並非靜態 HTML,**軌跡資料由 AJAX 動態載入**,且回傳內容經過 16 進位編碼,直接抓取頁面原始碼無法獲得資料。

關鍵發現

  • 真實資料介面:https://chaxun.ttk.cn:8084/BarScanRecord/search.jsp
  • 請求參數:code='560230596486'&opecate=7&ope=domore
  • 回傳格式:JSON 字串經 16 進位編碼(如 \u8FD0\u5355\u7F16\u53F7 = "運單編號")

完整解決方案 (Classic ASP + JScript 解碼)

1. 伺服器端 ASP 程式碼

<%
' 主邏輯
url = "https://chaxun.ttk.cn:8084/BarScanRecord/search.jsp?code=%27560230596486%27&opecate=7&ope=domore"
str = getHTTPPage(url)

if str <> "" then
    ' 呼叫 JScript 解碼函數
    response.Write getKV(str, "運單狀態") & "<br/>"
    response.Write getKV(str, "寄件網點") & "<br/>"
    response.Write getKV(str, "寄件人")
end if

' HTTP 取得函數
Function getHTTPPage(url)
    On Error Resume Next
    dim http
    set http = Server.CreateObject("Msxml2.XMLHTTP")
    http.open "GET", url, false
    http.send()
    if http.readyState = 4 then
        getHTTPPage = bytesToBSTR(http.responseBody, "utf-8")
    else
        getHTTPPage = ""
    end if
    set http = nothing
    If Err.number <> 0 then
        Err.Clear
        getHTTPPage = ""
    End If
End Function

' 二進位轉字串
Function bytesToBSTR(body, charset)
    dim objstream
    set objstream = Server.CreateObject("adodb.stream")
    objstream.Type = 1
    objstream.Mode = 3
    objstream.Open
    objstream.Write body
    objstream.Position = 0
    objstream.Type = 2
    objstream.Charset = charset
    bytesToBSTR = objstream.ReadText
    objstream.Close
    set objstream = nothing
End Function
%>

2. JScript 解碼模組 (<script runat="server" language="jscript">)

<script runat="server" language="jscript">
var parsedCache = false;

function getKV(jsonStr, key) {
    if (!parsedCache) {
        try {
            // 第一層解析
            var outer = eval('(' + jsonStr + ')');
            if (outer.result && outer.result.length > 0) {
                // 第二層:result[0] 是 16 進位編碼的 JSON 字串
                var innerStr = outer.result[0];
                var inner = eval('(' + innerStr + ')');
                // 第三層:inner 是陣列,取第一個物件
                parsedCache = inner[0];
            }
        } catch (ex) {
            Response.Write("解析錯誤: " + ex.Message);
            parsedCache = {};
        }
    }
    return parsedCache[key] || '';
}
</script>

核心技術點總結

挑戰解決方法
AJAX 動態載入直接呼叫後端 AJAX 介面 search.jsp
16 進位 Unicode 編碼JScript eval() 自動解碼 Unicode 轉義序列
多層 JSON 巢狀分層 eval:outer.result[0] → inner JSON → 陣列[0]
Classic ASP 無原生 JSON 解析用 runat="server" language="jscript" 互補

現代化建議

Classic ASP 已停止維護,建議遷移至 ASP.NET Core / Node.js / Python:

  • 內建 JSON 解析,無需 JScript 繞路
  • 支援 async/await,並發採集效率高
  • 更好的錯誤處理與除錯體驗

遷移參考 (C#)

var client = new HttpClient();
var resp = await client.GetStringAsync(url);
var outer = JsonSerializer.Deserialize(resp);
var innerJson = outer.GetProperty("result")[0].GetString();
var data = JsonSerializer.Deserialize(innerJson);
var first = data[0];
Console.WriteLine(first.GetProperty("運單狀態").GetString());
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved