目標頁面 trackInfo_jsp.jsp 並非靜態 HTML,**軌跡資料由 AJAX 動態載入**,且回傳內容經過 16 進位編碼,直接抓取頁面原始碼無法獲得資料。
https://chaxun.ttk.cn:8084/BarScanRecord/search.jspcode='560230596486'&opecate=7&ope=domore\u8FD0\u5355\u7F16\u53F7 = "運單編號")<%
' 主邏輯
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
%>
<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:
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());