Skip to content

Latest commit

 

History

27 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

flight-monitor-skill(机票价格监测 skill)

Hermes skill:监测 国内 + 国际 航班价格,跌破心理价位时推送到智能体 / 飞书 / 微信。

🚀 30 秒上手

第一步:把下面这段发给 Codex / Workbuddy / 任何智能体:

请阅读 https://github.com/qinthqod/flight-monitor-skill/blob/master/SKILL.md 学习这个 skill。

我要监测一个航班:乌鲁木齐到广州,10 月 5 号出发,盯 CZ6895 这班,
降到 ¥2000 以下提醒我(推飞书)。

第二步:像聊天一样告诉它你的需求:

帮我监测一下机票                              ← 最简输入
国庆回广州便宜点告诉我                          ← 自然语言
监测北京大兴到上海虹桥,11 月 20 号,低于 1500 推微信
10 月 5 号乌鲁木齐到广州 CZ6895 降到 2000 告诉我

国际机票也行:
监测下个月 PEK 到 NRT 降到 600 美元提醒我         ← v1.2.0
商务舱监测 PEK 到 LHR 降到 3000 美元            ← v1.2.0 多舱位
一次性监测三条航线                              ← v1.2.0 多航线

AI 会自动帮你抽取城市 / 日期 / 航班 / 阈值 / 舱位,缺什么问什么,然后装好 cron、自动监控,价格跌破阈值才推你,否则静默。

它能做什么

每 2 小时自动跑一次:

  1. 携程 batchSearch(国内主源,Playwright 真渲染,绕过风控)
  2. 携程 fuzzySearch(国内备源)
  3. 南航 minPrice API(特惠价备源)
  4. 携程国际(v1.2.0,国际主源)
  5. 去哪儿国际(v1.2.0,国际备源——当前不可用)
  6. 对比你盯的那个航班价 vs 你的心理价位
  7. 跌破阈值时推送到你选的渠道

v1.2.0 新增能力

  • 🌏 国际机票(携程国际,自动识别 USD/EUR/JPY/KRW 等币种)
  • 📈 价格趋势(7d/30d 均价 + 相对跌幅% + 30 天新低标记)
  • ✈️ 往返航线return_date 字段)
  • 📋 多航线同装config.jsonroutes: [] 数组)
  • 🛏️ 多舱位(Y=经济/C=商务/F=头等/W=超经)
  • 🎉 节假日错峰提示(节前 14 天 / 节中 / 节后 1-3 天窗口)
  • 每天 12:00 推 午间总结(v1.1.0)

阈值是针对单个航班,不是全航线最低 —— 所以你只在你要的那班便宜下来时才被打扰,别的航线再便宜也不打扰。

📱 推送示例

下面是 cron job 真的会推的 markdown 报告样例(基于真实抓取数据 + SQLite 历史快照):

示例 1:国内航线 + 跌破阈值 + 30 天新低

💰 BELOW THRESHOLD  ✈️ 国内 · 经济舱

航线 URC → CAN
日期 2026-10-05
抓取 2026-08-13T16:42:03

### 🎯 你盯的 CZ6895
¥1500  南方航空  2026-10-05 10:45:00 → 16:00:00

阈值:¥2000

### 📊 当日直飞最低
¥1500  `CZ6895` (南方航空)

### 📈 价格趋势
- 7d 均价:¥1963(14 个样本)
- 30d 均价:¥1963(14 个样本)
- 相对 7d 均价 🔻 -23.6%
- **🔥 30 天新低**

### 🎉 节假日提示
🎉 国庆中第 5 天(余票紧张)

示例 2:国际航线 + 往返 + 商务舱

🔥 NEW LOW  🌏 国际 · 商务舱

航线 PEK → LHR
日期 2026-12-20 → 2026-12-27(往返)
抓取 2026-08-13T16:50:01

### 🎯 你盯的 BA038
$2,800  英国航空  10:30 → 14:45

阈值:$3,000

### 📊 当日直飞最低
$2,800  `BA038` (英国航空)

### 📈 价格趋势
- 7d 均价:$3,150(8 个样本)
- 30d 均价:$3,280(22 个样本)
- 相对 7d 均价 🔻 -11.1%
- **🔥 30 天新低**

### 🎉 节假日提示
✨ 圣诞后 1 天(错峰窗口,价格通常较低)

示例 3:未破阈值(静默,不推送)

cron stdout 输出(用户看不到,只在 log 里):

✈️ [2026-08-13 16:42:15] URC→CAN 2026-10-05 cabin=Y focus=CZ6895 ¥2000 CNY [domestic]
  [1/3] 携程 batchSearch (国内) ...
       77 班
       直飞最低 ¥1719 (GS7581)
  [2/3] 携程 fuzzySearch ...
       2 条
  [3/3] 南航 minPrice ...
       0 条
  📵 CZ6895 当前 CNY 2700 未破阈值 — 静默

没跌破阈值 → 不打扰用户。这是设计意图("有结果才推")。

示例 4:v1.3.0 国际航线(飞猪 FlyAI 数据)

🌏 [2026-08-13 19:15:24] PEK→NRT 2026-10-01 cabin=Y focus=IJ018 ¥4000 CNY [international]
  [1/2] 飞猪 FlyAI (国际主源) ...
       10 班 (飞猪官方数据)
---DRY RUN---
💰 BELOW THRESHOLD  🌏 国际 · 经济舱

航线 PEK → NRT
日期 2026-10-01
抓取 2026-08-13T19:15:25

### 🎯 你盯的 IJ018
¥3241  春秋日本航空  2026-10-01 10:45:00 → 15:30:00

阈值:¥4000

### 📊 当日直飞最低
¥3241  `IJ018` (春秋日本航空)

### 📈 价格趋势
- 7d 均价:¥3292(19 个样本)
- 30d 均价:¥3292(19 个样本)
- 相对 7d 均价 🔻 +1.5%

### 🎉 节假日提示
🎉 国庆首日出行(价格通常最高)

v1.3.0 关键变化:国际航线主源从"携程 Playwright 抓取"切到"飞猪 CLI subprocess 调"——

  • 飞猪官方数据更准(飞猪有完整航司/代理报价)
  • 不需要 Playwright(更轻)
  • 失败时自动 fallback 携程国际 + 去哪儿兜底

示例 5:v1.3.0 交叉验证(飞猪 vs 携程,模拟数据)

情景:用户盯 IJ018,3 班双源都覆盖,其中 JL020 偏离 28.2%:

💰 BELOW THRESHOLD  🌏 国际 · 经济舱

航线 PEK → NRT
日期 2026-10-01

### 🎯 你盯的 IJ018
¥3241  春秋日本

阈值:¥4000

### 📈 价格趋势
- 7d 均价:¥3298(18 个样本)

### 🎉 节假日提示
🎉 国庆首日出行

### 🔍 交叉验证(飞猪 vs 携程)
- ⚠️ 置信度:LOW
- 飞猪 3 班 ↔ 携程 3 班
- 匹配航班:3 班
  - ✅ `IJ018` ⭐ 飞猪¥3241 ↔ 携程¥3300 (偏离 1.8%)
  - ✅ `HU439` 飞猪¥4357 ↔ 携程¥4400 (偏离 1.0%)
  - ⚠️ `JL020` 飞猪¥5304 ↔ 携程¥6800 (偏离 28.2%)

- ⚠️ 价格异常(偏离 >15%):
  - `JL020` 日航 飞猪¥5304 ↔ 携程¥6800 偏离 28.2%

v1.3.0 交叉验证机制

  • 飞猪跌破阈值时后台触发携程独立验证(concurrent.futures,30s 超时熔断)
  • 同航班双源价格对比,偏离 >15% 告警"价格异常"
  • 置信度标签:high(≥3 班一致)/ medium(1-2 班)/ low(携程 0 班或异常)
  • dry-run 跳过交叉验证(避免 95s 拖慢 demo)
  • 携程超时自动熔断 → 单源参考(不告警异常)

示例 6:12:00 午间总结(v1.5.1 daily_summary 真实渲染输出)

数据源 = SQLite 同一航线的历史快照聚合,无跌破阈值也会每天推(告诉用户当前价 / 24h 变动 / 距阈值空间)。

daily_summary.py 直接打印的 markdown(未推飞书前),2026-08-14 13:00 dry-run 输出:

📊 **【机票监控·午间总结】** 2026-08-14

**航线**:乌鲁木齐 URC → 广州 CAN
**日期**:2026-10-05 | **阈值**:¥2000 | **样本**:251 次抓取(窗口 23.5h)

---

### 🎯 你盯的航班 CZ6895

| 指标 | 价格 |
|---|---|
| 当前 | **¥2330** →持平 |
| 历史最低 | ¥2140 |
| 历史最高 | ¥2700 |
| 均价 | ¥2483 |
| 距阈值 | **还差 ¥330** 才能破阈 |

---

### 📉 直飞最低价(参考)

| 航班 | 价格 |
|---|---|
| 当前最低 | **¥1989** ↓¥10 |
| 历史最低 | ¥1989 |
| 历史最高 | ¥2220 |
| 样本量 | 251 次抓取 |

---

### 🛫 中转最低价

| 类型 | 价格 |
|---|---|
| 当前中转最低 | **¥1650** |
| 当前全局最低 | ¥1650 |
| 当日总班次 | 10(直飞 7 / 中转 3) |

_数据来源:携程 batchSearch · 快照窗口 2026-08-11 → 2026-08-17T12:38_
_详细监控每 2h 跑一次,破阈或新低会立即推送_

快速开始

git clone https://github.com/qinthqod/flight-monitor-skill.git
cd flight-monitor-skill
# 推荐:装 Hermes cronjob(2h 监测 + 12:00 午间总结)
bash scripts/install_hermes_cron.sh
# 旧式:装系统 crontab(仅 2h 监测)
bash scripts/install_cron.sh

安装脚本会:

  • 装 Playwright Chromium
  • ~/.flight-monitor/config.json 创建默认配置
  • 写入 Hermes cronjob 或 crontab
  • 跑一次 dry-run 让你看效果

v1.0.0 单航线配置(兼容)

{
  "from_city": "URC",
  "to_city": "CAN",
  "date": "2026-10-05",
  "focus_flight": "CZ6895",
  "threshold": 2000,
  "channels": ["agent"]
}

v1.2.0 多航线配置(推荐)

{
  "routes": [
    {
      "from_city": "URC", "to_city": "CAN",
      "date": "2026-10-05",
      "focus_flight": "CZ6895", "threshold": 2000,
      "cabin": "Y"
    },
    {
      "from_city": "PEK", "to_city": "NRT",
      "date": "2026-10-01",
      "threshold": 600, "cabin": "Y"
    },
    {
      "from_city": "PEK", "to_city": "LHR",
      "date": "2026-12-20", "return_date": "2026-12-27",
      "threshold": 3000, "cabin": "C"
    }
  ]
}

字段说明(v1.2.0):

  • from_city / to_city:出发/到达 IATA 码(国际 IATA 见 references/city-codes.md
  • date:出发日期(YYYY-MM-DD)
  • return_date:往返返程日期(可选,v1.2.0 新)
  • focus_flight:你盯的航班号(主告警对象)
  • threshold:心理价位(国内用 CNY,国际按原始币种
  • cabin:舱位 Y=经济/C=商务/F=头等/W=超经(v1.2.0 新)
  • channels:推送渠道数组

三种推送渠道

渠道 说明 配置
agent(默认) 写到 ~/.hermes/cron/output/flight-monitor/,让智能体拾取 无需配置
feishu 推到你飞书某会话(需要 lark-cli) export FEISHU_FLIGHT_CHAT_ID=oc_xxx
wechat 走 Hermes iLink gateway export WEIXIN_TOKEN=...

详细配置见 references/push-channels.md

目录结构

flight-monitor-skill/
├── SKILL.md                      # 给 AI 看的(YAML + 正文)
├── README.md                     # 本文件(含更新日志)
├── CHANGELOG.md                  # 完整更新日志
├── scripts/
│   ├── fetch.py                  # 抓取 + 告警(单文件实现,v1.2.0 866 行)
│   ├── install_cron.sh           # 旧式:系统 crontab 装
│   └── install_hermes_cron.sh    # 推荐:Hermes cronjob 装
└── references/
    ├── setup.md                  # 安装详解
    ├── push-channels.md          # 三渠道配置
    ├── city-codes.md             # 城市 IATA 码表(含 50+ 国际城市)
    ├── troubleshooting.md        # 故障排查
    ├── dual-cron.md              # v1.1.0:双 job 装法
    └── v12-features.md           # v1.2.0:5+1 大新功能详解

使用示例

# v1.0.0 单航线
python3 scripts/fetch.py --from URC --to CAN --date 2026-10-05 \
  --focus-flight CZ6895 --threshold 2000 --channel agent --dry-run

# v1.2.0 国际航线
python3 scripts/fetch.py --from PEK --to NRT --date 2026-10-01 \
  --threshold 600 --cabin Y --channel feishu --dry-run

# v1.2.0 商务舱往返
python3 scripts/fetch.py --from PEK --to LHR --date 2026-12-20 \
  --return-date 2026-12-27 --threshold 3000 --cabin C --dry-run

# v1.2.0 多航线同装
python3 scripts/fetch.py --all-routes --dry-run

# 看历史最低价
sqlite3 ~/.flight-monitor/flight.db \
  "SELECT flight_no, MIN(adult_price), datetime(fetched_at)
   FROM price WHERE flight_date='2026-10-05'
   GROUP BY flight_no ORDER BY MIN(adult_price) ASC LIMIT 10"

故障排查

最常见的问题:

  • 携程被风控(whaleguard block)references/troubleshooting.md 第 1 节
  • 10/5 这种远期日期查不到价 → OTA 一般只放出 30~60 天内的价
  • 国际航线 silent → 主源失败时 silent;手动查携程网页确认价格
  • 飞书推送失败 → 检查 FEISHU_FLIGHT_CHAT_IDlark-cli 是否装好
  • 微信推送没收到 → 看 gateway URL 和 WEIXIN_TOKEN
  • 价格趋势为空 → 新装 cron 第一次跑无历史快照,等 2h 后再跑

详细见 references/troubleshooting.md

📋 更新日志

精简:完整更新日志见 CHANGELOG.md

v1.5.5 (2026-08-17) — flyai 漏传 --transport-no

  • 症状:v1.5.4 修复后 daily_summary.py 仍报"CZ6895 当天未放出",但 flyai 直接查是有 CZ6895 的
  • 根因fetch_fliggy_international() 没传 --transport-no $focus_flight → flyai 按推荐排序返 TOP10,CZ6895(¥2700 起)被 CZ6014/CZ6883 挤出 → snapshot.focus_price 永远 NULL
  • 修复:飞猪查两次(带 + 不带 transport-no),合并去重保留最低价
  • 验证:8-17 16:26 snapshot.focus_price=2700.0,daily_summary 推"CZ6895 当前 ¥2700 ↑¥370 | 距阈值 还差 ¥700",message_id om_x100b6718114ac8a8c4e81ed7b1025cc

v1.5.4 (2026-08-17) — CZ6895 当前价误报修复

  • 症状:daily_summary.py 把 price 表里 CZ6895 全表最新记录当"当前价"。当天携程没返回 CZ6895 时,会拿前一天旧价渲染"已破阈",误导用户以为机票便宜了
  • 修复
  • focus_now 改用最新 snapshot 的 focus_price(即那次抓取实际返回的 CZ6895 价),不再回退到 price 表历史末尾
  • 缺数据时显示"⚠️ 当天未放出(携程本次未返回此航班)(@ 抓取时间)(旧价)",避免误判破阈
  • 正常数据显示时间戳 (@ YYYY-MM-DDTHH:MM),让用户看到当前价对应几点抓的
  • 回归:8-17 15:01 dry-run 输出"当前 ¥2330 ⚠️ 当天未放出...(@ 2026-08-16T21:08)(旧价)| 距阈值 还差 ¥330",message_id om_x100b671f522304b4c027cfc5db7b99f

License

MIT © 2026 qinthqod

📱 v1.5.5 真实推送示例(CZ6895 修复后)

daily_summary.py 修复后第一次正确推送(已实推飞书,2026-08-17 16:27 dry-run,message_id om_x100b6718114ac8a8c4e81ed7b1025cc):

📊 **【机票监控·午间总结】** 2026-08-17

**航线**:乌鲁木齐 URC → 广州 CAN
**日期**:2026-10-05 | **阈值**:¥2000 | **样本**:260 次抓取(窗口 23.8h)

---

### 🎯 你盯的航班 CZ6895

| 指标 | 价格 |
|---|---|
| 当前 | **¥2700** ↑¥370 _(@ 2026-08-17T16:26)_ |
| 历史最低 | ¥2140 |
| 历史最高 | ¥3750 |
| 均价 | ¥2495 |
| 距阈值 | **还差 ¥700** 才能破阈 |

---

### 📉 直飞最低价(参考)

| 航班 | 价格 |
|---|---|
| 当前最低 | **¥1989** ↓¥10 |
| 历史最低 | ¥1989 |
| 历史最高 | ¥2220 |
| 样本量 | 260 次抓取 |

---

### 🛫 中转最低价

| 类型 | 价格 |
|---|---|
| 当前中转最低 | **¥600** |
| 当前全局最低 | ¥600 |
| 当日总班次 | 20(直飞 17 / 中转 3) |

_数据来源:携程 batchSearch · 快照窗口 2026-08-11 → 2026-08-17T16:26_
_详细监控每 2h 跑一次,破阈或新低会立即推送_

修复前 → 修复后

  • ❌ v1.5.4:声称"CZ6895 当前 ¥2330 ⚠️ 当天未放出"
  • ✅ v1.5.5:CZ6895 当前 ¥2700 ↑¥370 (@ 2026-08-17T16:26),距阈值还差 ¥700

About

Hermes skill: track China domestic flight prices (Ctrip / China Southern), alert on threshold breach. Push via agent / Feishu / WeChat.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages