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

第三方火車票購票實現原理:模擬 12306 接口調用

     編輯:程式設計綜合問答

核心機制

12306 官方未公開開放 API。第三方(携程、360、飛豬等)通過逆向工程實現:

實現步驟

  1. 抓包分析:使用 Fiddler/Charles/瀏覽器開發者工具捕獲 12306 官網/客戶端的 HTTP/HTTPS 請求
    • 登錄接口:/passport/web/login 等
    • 查詢接口:/otn/leftTicket/query
    • 下單接口:/otn/confirmSingleForQueue
    • 支付接口:/pay/payOrder
  2. 提取關鍵參數:
    • 請求 Headers:User-Agent, Referer, Cookie, Content-Type
    • 表單數據:用戶名、密碼、驗證碼、設備指紋、_json_att 等
    • 加密參數:密碼 RSA 加密、設備指紋算法
  3. 模擬完整流程:
    # 伪代碼流程
    session = requests.Session()
    session.headers.update(browser_headers)
    
    # 1. 獲取驗證碼圖片 → OCR/人工識別
    captcha = solve_captcha(session.get(captcha_url).content)
    
    # 2. 登錄
    login_data = {
        'username': encrypt_rsa(username),
        'password': encrypt_rsa(password),
        'captcha': captcha,
        'device_fingerprint': gen_fingerprint()
    }
    session.post(login_url, data=login_data)
    
    # 3. 查票
    tickets = session.post(query_url, data=query_params).json()
    
    # 4. 下單
    order = session.post(confirm_url, data=order_params).json()
    
    # 5. 支付(通常跳轉銀行/支付寶,需回調確認)
    pay_result = handle_payment_callback()
    
  4. 應對反爬機制:
    • IP 限流 → 代理池輪換
    • 驗證碼升級 → 滑塊/點選驗證碼識別服務
    • 設備指紋檢測 → 模擬真實設備參數
    • 請求頻率控制 → 隨機延時、分佈式協調

法律與風險提示

  • 灰色地帶:繞過官方驗證機制、大規模佔用公共資源
  • 用戶數據安全:第三方平台獲取用戶 12306 賬號密碼,存在洩露風險
  • 官方打擊:12306 持續升級反爬、封禁異常 IP/賬號
  • 合規方向:部分鐵路局嘗試開放合作接口,正規代理商可申請授權

技術棧參考

  • 語言:Python (Requests/Scrapy), Java (HttpClient/OkHttp), Go, Node.js
  • 驗證碼:商業打碼平台、深度學習自建模型
  • 部署:分佈式爬蟲集群、消息隊列協調
  • 監控:實時成功率、封禁率告警

總結

第三方購票 = 逆向 12306 私有接口 + 模擬瀏覽器行為 + 對抗反爬策略。技術門檻在於持續維護接口兼容性與反爬對抗,而非業務邏輯本身。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved