#536·py12306

下单卡在 initDc,12306 直接 302 到 error.html,requests 下单确认链路疑似已失效

Author: loyputhCreated Mar 20, 2026Updated Mar 20, 2026

问题描述

项目当前在下单确认阶段稳定失败,现象如下:

  • 用户登录正常
  • 查票正常
  • submitOrderRequest 成功
  • 随后请求 /otn/confirmPassenger/initDc
  • 12306 直接跳转到: https://www.12306.cn/mormhweb/logFiles/error.html
  • 导致拿不到后续下单必须字段:
    • globalRepeatSubmitToken
    • ticketInfoForPassengerForm

日志表现

检查完成 开始提交订单
提交订单成功
请求初始化订单页面返回异常页,第 1 次重试 ...
请求初始化订单页面返回异常页,第 2 次重试 ...
请求初始化订单页面失败,页面解析异常: 缺少字段: globalRepeatSubmitToken, ticketInfoForPassengerForm

更明确的诊断信息是:

status=200
url=https://www.12306.cn/mormhweb/logFiles/error.html

已确认结论

  1. 不是登录失效
    用户状态正常,is_loaded=trueis_ready=true

  2. 不是查票问题
    查询正常,能持续发现有票车次

  3. 不是 submitOrderRequest 没发出
    日志已明确出现“提交订单成功”

  4. 不是单纯正则解析失败
    initDc 原始响应不是正常确认页,而是错误页

  5. 纯 requests 链路疑似已被 12306 现网逻辑拦截
    当前旧的 submitOrderRequest -> initDc -> checkOrderInfo 流程可能已经不兼容

进一步排查结果

我还做过一组对比:

  • requests 访问 initDc:会被 302/跳转到 error.html
  • 尝试用浏览器上下文兜底:现象明显不同,说明问题核心不只是 cookie,而是当前 12306 可能已经依赖真实浏览器运行态 / 新链路上下文

期望

  1. 重构 submitOrderRequest -> initDc -> checkOrderInfo 这段兼容逻辑
  2. 增加更完整的调试输出:
    • 状态码
    • 最终 URL
    • 重定向链
    • 原始 HTML 落盘
  3. 如果纯 requests 已不兼容,希望支持真实浏览器上下文兜底
  4. 建议按当前 12306 官网真实“点击预订 -> 确认订单页”链路重新适配

结论

当前真正的阻塞点不是没票,也不是没登录,而是:

initDc 被 12306 直接导向 error.html,无法进入确认订单流程