首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實戰:模擬 HTTP 請求查詢 12306 火車票餘票信息

     編輯:關於C語言

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 中提取下劃線後部分。

C# 實現代碼

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 等)。

注意事項

  • 12306 接口變動極快,參數名、加密方式、驗證碼機制均可能調整,代碼需持續維護。
  • 高頻調用易觸發 IP 封禁,生產環境需引入代理池、請求限流、驗證碼識別服務。
  • 僅供技術研究學習,請遵守相關法律法規與服務條款。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved