12306 余票监控
实时 12306 火车票余票监控工具,多渠道报警。持续轮询铁路官方接口,余票一释放立即通知你。
环境要求
- Python 3.8+
requests库(pip install requests)- 能访问
kyfw.12306.cn的网络环境
快速开始
# 安装依赖
pip install requests
# 监控某天 G65 车次,每 30 秒查一次
python3 scripts/train_ticket_monitor.py --date 2026-08-15 --train G65 --interval 30
# 单次查询(不循环),JSON 输出便于脚本调用
python3 scripts/train_ticket_monitor.py --date 2026-08-15 --once --json
# 搜索车站名称
python3 scripts/train_ticket_monitor.py --list-stations jin
工作原理
- 加载车站字典 — 启动时从 12306 拉取完整的车站名↔三字码映射(无需硬编码)
- 初始化会话 — 访问 12306 余票页获取必要的 cookie
- 轮询 — 按设定间隔调用
leftTicket/queryZ接口 - 解析 — 从管道分隔的响应中提取车次号、时刻、历时、各席别余票
- 报警 — 当监控席别由"无票"变为"有票"时触发:
- 终端响铃(响 3 声)
- 桌面通知(macOS:通知中心;Linux:notify-send;Windows:系统托盘气泡)
- 控制台输出带订票链接的醒目提示 - 去重 — 仅在状态变化(售罄→有票)时报警。票再次售罄后重置,下次有票会再次报警
命令行参数说明
核心参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--date |
今天 | 乘车日期,格式 YYYY-MM-DD |
--from-city |
北京南 | 出发站中文名 |
--to-city |
济南西 | 到达站中文名 |
--train |
所有车次 | 按车次过滤(可多次指定:--train G65 --train G67) |
--seat |
second_class, no_seat | 监控的席别(可多次指定) |
--interval |
30 | 轮询间隔秒数 |
--log |
ticket_monitor.log | 报警日志文件路径 |
模式参数
| 参数 | 说明 |
|---|---|
--once |
单次查询后立即退出(不进入监控循环) |
--json |
以 JSON 格式输出(配合 --once 用于脚本/自动化) |
--list-stations [QUERY] |
列出/搜索车站名称(如 --list-stations bei) |
席别选项
| 值 | 中文 | 说明 |
|---|---|---|
second_class |
二等座 | 二等座 |
first_class |
一等座 | 一等座 |
business_class |
商务座 | 商务座 |
no_seat |
无座 | 无座/站票 |
使用示例
监控指定车次
python3 scripts/train_ticket_monitor.py \
--date 2026-08-15 \
--from-city 北京南 \
--to-city 济南西 \
--train G65 --train G67 \
--seat second_class --seat no_seat \
--interval 15
单次查询用于自动化(退出码 0 = 有票)
# 查一次,JSON 输出
python3 scripts/train_ticket_monitor.py --date 2026-08-15 --once --json
# 在 shell 脚本中用退出码判断
if python3 scripts/train_ticket_monitor.py --date 2026-08-15 --once; then
echo "有票啦!"
fi
查找车站名称
# 列出所有车站
python3 scripts/train_ticket_monitor.py --list-stations
# 按关键字搜索
python3 scripts/train_ticket_monitor.py --list-stations bei
运行效果演示
启动监控后,脚本会打印配置摘要并开始轮询:
$ python3 train_ticket_monitor.py --date 2026-08-14 --train G65 --interval 10
开始监控 2026-08-14 北京南(VNP) → 济南西(JGK)
车次过滤: G65
重点监控席别: 二等座, 无座
轮询间隔: 10秒 (Ctrl+C 退出)
======================================================================
[13:39:07] 2026-08-14 北京南(VNP) → 济南西(JGK) 余票快照 (车次: G65)
======================================================================
G65 北京南 19:50 → 济南西 21:20 (历时 01:30)
>>> 二等座: HAVE [有]
一等座: HAVE [有]
商务座: HAVE(5) [5]
>>> 无座: HAVE [有]
当监控席别由「无票」变为「有票」时,立即触发报警(终端响铃 + 桌面通知 + 下方醒目输出):
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
G65 北京南→济南西 19:50 二等座 available! Qty: 有
Book: https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=VNP,北京南&ts=JGK,济南西&date=2026-08-14&flag=N,N,Y
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
按 Ctrl+C 即可干净退出,并打印本次会话的总轮询次数:
^C
已停止监控,共轮询 42 次
报警输出示例
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
G65 北京南→济南西 19:50 二等座 available! Qty: 有
Book: https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=VNP,北京南&ts=JGK,济南西&date=2026-08-15&flag=N,N,Y
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
技术说明
- 无需登录:使用 12306 公开的余票查询接口(与官网余票页同源)
- 无硬编码车站码:车站字典在启动时实时拉取
- 字段索引映射:12306 接口采用管道分隔的固定索引字段。若 12306 调整格式,更新脚本中的
FIELD_INDEX即可 - 频率限制:默认 30 秒间隔。不建议低于 10 秒,避免被封 IP
- Ctrl+C:可干净退出监控循环并打印总轮询次数
平台支持
| 平台 | 桌面通知方式 |
|---|---|
| macOS | 通知中心(osascript) |
| Linux | notify-send(需 libnotify) |
| Windows | 系统托盘气泡(PowerShell) |
局限性
- 不能购票 — 仅为监控/报警工具
- 12306 可能对频繁请求临时封禁 IP
- 席别字段索引可能随 12306 接口更新而变化
- 不处理 12306 登录/验证码 — 仅查询公开余票数据