12306 餘票查詢接口採用 HTTP GET 方式,無需登錄即可調用。本文記錄抓包分析參數、構造請求 URL、解析 JSON 響應的完整流程,附 C# 核心代碼。
使用 IE9 F12 捕獲查詢請求:
https://dynamic.12306.cn/otsquery/query/queryRemanentTicketAction.do?
method=queryLeftTicket
&orderRequest.train_date=2013-11-25
&orderRequest.from_station_telecode=GZQ
&orderRequest.to_station_telecode=XAY
&orderRequest.train_no= # 可選,車次電報碼
&trainPassType=QB
&trainClass=QB%23D%23Z%23T%23K%23QT%23
&includeStudent=00
&seatTypeAndNum=
&orderRequest.start_time_str=00%3A00--24%3A00
train_date:乘車日期(yyyy-MM-dd)from_station_telecode:出發站局碼(如 GZQ=廣州)to_station_telecode:到達站局碼(如 XAY=西安)train_no:車次電報碼(非車次號),可選。若指定則只查該車次。https://dynamic.12306.cn/otsquery/js/common/favorite_name.js?version=1.55,返回格式 @bji|北京|BJP|0@sha|上海|SHH|1...,第三段為局碼。trainCode=K1168_6b000K116801 中提取下劃線後部分。public static string DoGetTrainTicketLeft(string date, string from, string to, string trainTeleCode) {
string url = string.Format(
@"https://dynamic.12306.cn/otsquery/query/queryRemanentTicketAction.do?
method=queryLeftTicket
&orderRequest.train_date={0}
&orderRequest.from_station_telecode={1}
&orderRequest.to_station_telecode={2}
&orderRequest.train_no={3}
&trainPassType=QB
&trainClass=QB%23D%23Z%23T%23K%23QT%23
&includeStudent=00
&seatTypeAndNum=
&orderRequest.start_time_str=00%3A00--24%3A00",
date, from, to, trainTeleCode);
var request = (HttpWebRequest)WebRequest.Create(url);
request.Accept = "application/json, text/javascript, */*";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
request.Referer = "https://dynamic.12306.cn/otsquery/query/queryRemanentTicketAction.do?method=init";
request.Method = "GET";
using (var response = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
return reader.ReadToEnd();
}
// 查詢 2013-11-26 廣州→西安 K1168 次餘票
string json = DoGetTrainTicketLeft("2013-11-26", "GZQ", "XAY", "6b000K116801");
返回 JSON 片段:
{"datas":"0,<span id='id_6b000K116801' ...>...8,181,--,156,198,--,...","time":"20:19"}
datas 字段為 HTML 片段,需進一步正則/HTML 解析提取各席別餘票數(如二等座 181、軟臥 156 等)。