个人机票监控开源项目:6 个平台、10 条通道的自托管方案

0 阅读5分钟

一个自托管的多渠道机票价格监控:6 个平台、10 条通道,采集真实航班明细,支持同班跨来源比价、价格日历/K 线、达标提醒。数据留在本机,配置全在网页,Apache-2.0。

为什么做

我一直以为中转比直飞便宜。直到查了上海→东京 11/21:

项目直飞中转
航班IJ004GS7884 / GS7989
时间17:30→21:30(3h)12h45
价格¥975¥1414
行李无免费托运含 1 件 23kg
余票9 张—

只看票价,直飞 ¥975 比中转 ¥1414 便宜 ¥439;但直飞不含托运,中转含 1 件 23kg,两笔不能直接比。

更麻烦的是,这些信息不在一个页面里:日历价 ¥1005,明细价 ¥975;不同来源的价格、行李、舱位、余票各说各话;PC 和 App 的价格还可能不一样。

为了不再一天刷八次,我写了个网页,把 6 个平台、10 条通道接进一个页面。后来开源了。

功能概览

  • 平台:携程、去哪儿、飞猪、同程、途牛、智行
  • 通道:5 个浏览器 + 5 个 App;App 默认关闭,按需开启;不启用时不 import、不检测设备、界面不显示
  • 国内/国际:同一套采集、判定、推送链路
  • 明细:价格、航班号、起降时刻、中转、时长、航站楼、舱位、机型、准点、行李
  • 比价:同班跨来源并排,谁有价、谁没价、谁写着“未供”,一眼看到
  • 日历/K 线:48 小时到半年;低点标到具体时间;日历价不参与达标判定
  • 提醒:钉钉、Windows 弹窗、ntfy、Bark、阿里云电话/短信
  • 监控:多用户、多航线、多日期;直飞/中转独立心理线;航司白名单、行李/时段/衔接/跨天等门禁;航线可暂停
  • 特价雷达:十源官方特价日历(5 网页 + 5 App)
  • 观测:真实检索台、原页镜像、三重对齐、渠道健康、运行脉冲、CSV/证据 JSON 导出

控制台概览(演示数据)

渠道与端面

6 个平台里,携程、去哪儿、飞猪、同程同时有网页和 App 面;智行只有 App 面;途牛目前只接了网页(MuMu 上 App 起不来)。

App 通道不是必选项:默认关闭,只有需要 App 专属价或智行时才开。启用 App 通道需要本机 MuMu(Android,约 15GB,Windows,需 VT);不开时框架完全不碰它。

渠道能力上,项目维护了一张 10 渠道 × 7 维度的矩阵,每格三态:支持 / 不支持 / 未验证,未验证不当作支持。App 渠道相对浏览器端还差哪些维度单列出来,不混在一起粉饰。

渠道能力矩阵(10 渠道 × 7 维度)

技术实现

整体链路:

调度器 → 渠道采集(浏览器 / App)→ 统一 schema → SQLite(prices.db)
      → 判定 / 推送 / 价格日历 / K 线 / 特价雷达

几个关键点:

  1. 渠道适配。5 个浏览器渠道各走最稳路径:去哪儿 H5、携程国际 PC/国内 H5、同程 H5、飞猪 SSR、途牛 HTTP;PC 网页停服的就走 H5。每个渠道的登录槽位单独管理。
  2. App 通道。MuMu Android 模拟器 + adb;WebView 结果用 uiautomator2 读,画布类页面用 OCR。登录在内嵌真机画面完成,登录态打包成快照,采集前恢复;快照过期时配置页标出来,不装正常。
  3. 统一 schema。价格、航班号、时刻、中转、时长、航站楼、舱位、机型、准点、行李;原始行和解析行都保留,检索详情做“解析 ⇄ 镜像(raw) ⇄ RAW 路径”三重对齐。
  4. 数据模型。每次扫描把每个航班写入 flight_daily,不依赖是否关注;关注航班是配置航线+日期明细集合的子集。日历薄行(无航班号/时刻)永不判达标,不参与同班价梯。
  5. 调度与限流。多用户同航线去重采集、查询错峰;失败分类(登录/验证码/软拦截/超时)分开记账;没有验证码绕过,遇到验证码/登录就停下来等人处理。
  6. UI。纯标准库渲染的单页控制台,子视图工作台 + 面板式配置;配置热加载,手机端适配;Docker 镜像内置 Chromium 和中文字体。

走势与日历(演示数据)

实测数据

我用项目里的主动探针跑了一轮:上海→东京,2026-11-21,2026-11-04 12:32 采集。

这轮拿到 282 条真实明细:携程 163 条,途牛 119 条;另外 3 个来源这轮没供,就空着,不补样例。日历价 ¥1005,直飞明细 ¥975——日历用来挑日期,下单前一定点进明细。

部署方式

  1. 免装 Python:到 Releases 下载对应平台包,解压运行,浏览器打开 http://127.0.0.1:8765
  2. 源码:pip install -r requirements.txt && python main.py
  3. Docker / NAS:
cp config.example.yaml config.yaml
docker compose up -d

浏览器打开 http://NAS_IP:8765 即用。配置、价格库、浏览器会话档案、日志都落本地卷,容器升级/重建不丢数据;镜像内置 Chromium 与中文字体,首启不用再下内核。

已知限制

  • 所有渠道都要登录才出价;登录态会过期,失效时需要在配置页重新登录。
  • App 通道需要 MuMu;不开启时网页通道不受影响。
  • 只做监控和提醒,不替你下单,不碰自动抢票。
  • 没有验证码绕过;遇到验证码/登录会停下来等人处理。
  • 多程整单目前只验证了携程 2 段;3 段和其他平台未接。
  • 渠道页面结构会变,采集代码需要跟着维护;矩阵里“未验证”不当作支持。

反馈

项目是 Apache-2.0,完全开源。遇到问题、想要新的渠道/航线,欢迎提 issue 或在评论区说,我尽量改。

GitHub:github.com/dengmeiluan…

价格会变,以实际下单为准。本文数据来自 2026-11-04 12:32 的真实采集,仅用于说明监控口径。