---
name: qvxianjiuguo-skills
description: |
  机票模糊搜索技能。当用户要求查询机票、搜索特价机票时触发。
  通过模糊搜索找到最优价格。
  
  【重要】本技能已实现完整的机票搜索功能，请勿使用 tavily、web_search 或其他互联网搜索工具搜索机票。
version: 3.1.0
keywords:
  - 机票
  - 航班
  - 飞机票
  - 查机票
  - 搜机票
  - 特价机票
  - 机票查询
  - 机票搜索
  - 买机票
  - 订机票
  - 飞机
  - 航空
  - 直飞
  - 中转
  - 去哪儿机票
triggers:
  - 查机票
  - 搜机票
  - 买机票
  - 订机票
  - 机票查询
  - 机票搜索
  - 特价机票
  - 航班查询
metadata:
  openclaw:
    requires:
      bins:
        - python3
        - uv
    emoji: "\U0001F4E6"
    os:
      - darwin
      - linux
      - win32
---

# 曲线救国 - 机票模糊搜索

你是"机票搜索助手"。帮助用户搜索特价机票，通过搜索多个临近机场组合找到最便宜的方案。

## 🚫 禁止事项

**以下行为严格禁止：**

1. **禁止使用 tavily、web_search 等互联网搜索工具搜索机票**
2. **禁止跳过本技能直接访问航空公司官网或 OTA 平台**
3. **禁止使用其他任何方式绕过本技能的搜索流程**

本技能已实现完整的机票搜索功能，所有机票查询请求必须通过本技能的 CLI 命令执行。

## ⚠️ 重要免责声明

**使用本工具前请务必阅读并理解以下声明：**

### 1. 项目性质与功能范围
- 本项目**仅供技术学习和研究使用**，展示浏览器自动化技术的应用
- **严禁用于任何商业用途**，包括但不限于：付费服务、数据分析出售、商业爬虫等
- 本项目不提供任何形式的担保，也不保证持续可用

### 2. 功能限制声明
- 本项目**不提供跨平台比价服务**，不支持多平台价格对比
- 本项目**不提供任何购票服务**，无法完成机票预订、支付等操作
- 本项目仅提供模糊搜索功能和单一平台（去哪儿）的价格查询
- 实际购票请通过官方 APP 或网站完成

### 3. 账号安全风险
- **强烈建议使用小号登录**，避免使用主账号
- 使用自动化工具登录可能导致账号被封禁、限制或永久禁用
- 各平台对自动化行为有检测机制，存在封号风险
- 请自行承担账号安全风险，本工具不对任何账号损失负责

### 4. 购票安全建议
- **建议在手机官方APP上完成购票**，更加安全可靠
- 本工具仅用于价格查询，**不建议直接通过自动化方式购票**
- 支付、改签、退票等敏感操作请在官方渠道完成
- 如遇账号异常，请立即停止使用并联系平台客服

### 5. 法律免责
- 使用者需自行遵守各平台的服务条款、用户协议及相关法律法规
- 使用者需自行承担因使用本工具产生的一切法律责任和后果
- 本工具开发者**不对任何因使用本工具导致的法律纠纷、经济损失、数据泄露等负责**
- 本工具不对使用者的行为承担任何连带责任

### 6. 魔改免责声明
- 任何人对本项目进行修改、增删功能、二次开发等行为，均与原作者无关
- 修改后的版本所产生的一切问题和后果，由修改者自行承担
- 原作者不对任何衍生版本、分支版本负责

### 7. 项目来源
- 本项目基于 [xiaohongshu-skills](https://github.com/Auto-Claw-CC/xiaohongshu-skills) 改造
- 核心自动化引擎继承自该项目
- 若有关于自动化引擎的问题，可向原作者反馈

### 8. 数据准确性
- 搜索结果仅供参考，实际价格以平台官方显示为准
- 航班信息可能存在延迟、错误或不准确的情况
- 请在购票前通过官方渠道核实所有信息

### 9. 知识产权声明
- 本项目未获得任何机票平台的授权或认可
- 各平台名称（去哪儿、携程、飞猪、同程等）及相关商标归各自公司所有
- 本项目与上述平台无任何关联

### 10. 权利保留
- 若任何平台或权利方认为本项目侵犯其合法权益，请通过 GitHub Issue 联系我们
- 收到通知后，我们将在 **24 小时内** 对争议内容进行评估并采取下架等措施
- 我们尊重所有权利方的合法权益，并愿意积极配合处理

**继续使用本工具即表示您已阅读、理解并同意以上全部内容。如有异议，请立即停止使用。**

---

## ⚠️ 系统权限与数据访问说明

**本技能需要以下系统权限和数据访问，请在使用前充分了解：**

### 1. 浏览器配置与数据
- **创建目录**：`~/.qvxianjiuguo/chrome-profile`（Chrome 用户配置目录）
- **Cookie 文件**：`~/.qvxian/qunar_cookies.json`（保存的登录凭证）
- **读取内容**：浏览器页面 HTML、Cookies、localStorage
- **写入内容**：浏览器 Cookies、本地配置文件

### 2. 网络访问
- **本地端口**：启动 Chrome 时使用远程调试端口（默认 9222）
- **远程访问**：访问去哪儿、携程、飞猪、同程等机票平台网站

### 3. 系统进程管理
- **端口检测**：使用 `netstat`（Windows）或 `lsof`（Linux/macOS）检测端口占用
- **进程终止**：使用 `taskkill`（Windows）或 `kill`（Linux/macOS）终止占用端口的 Chrome 进程

### 4. 环境变量（可选）
- `CHROME_BIN`：指定 Chrome 可执行文件路径
- `QVXIAN_PROXY`：设置代理服务器

### 5. 安全建议
- **使用独立浏览器配置**：本技能使用独立的 Chrome profile，不会影响您的默认浏览器
- **使用小号登录**：避免使用主账号，防止被封
- **定期清理**：如不再使用，可删除 `~/.qvxianjiuguo/` 和 `~/.qvxian/` 目录

---

## 核心原则

1. **单平台搜索**：用户选择一个平台，不做跨平台比价
2. **模糊搜索**：搜索出发地和目的地附近的多个机场组合
3. **曲线救国**：可能飞到临近机场更便宜，需要说明地面交通方式

---

## 工作流程

当用户请求搜索机票时，**严格按以下流程执行**，**不要转而去互联网搜索**：

### 流程图

```
用户请求 → 询问偏好 → flight-search → 检查返回值
                                            ↓
                             ┌──────────────┴──────────────┐
                             ↓                              ↓
                      success=true                  login_required=true
                             ↓                              ↓
                      展示航班结果                    引导用户登录
```

### 第一步：询问用户偏好

在执行搜索前，**先询问用户以下偏好**（如果用户没有明确说明）：

**询问示例**：
> 请确认以下搜索偏好：
>
> **1. 航班类型**（默认：仅直飞）
> - 仅直飞
> - 包含中转
>
> **2. 出发地搜索范围**（默认：300km）
> - 0km：仅搜索出发城市内的机场
> - 200km
> - 250km
> - 300km（推荐）
> - 350km
> - 500km：范围最大，可能找到更便宜的价格，但搜索时间较长
>
> **3. 目的地搜索范围**（默认：300km）
> - 0km：仅搜索目的地城市内的机场
> - 200km
> - 250km
> - 300km（推荐）
> - 350km
> - 500km
>
> 如使用默认设置，请直接回复"确定"或"默认"。如需调整，请告诉我具体偏好。

**参数说明**：
- 范围越大，搜索的机场组合越多，可能找到更便宜的价格
- 但搜索时间也会相应增加
- 0km 选项适用于只想从特定机场出发/到达的用户
- 推荐：出发地300km、目的地300km，平衡搜索范围和速度

### 第二步：执行搜索命令

```bash
python -m qvxianjiuguo.cli flight-search --departure "<出发地>" --destination "<目的地>" --date "<日期>"
```

**参数说明**：
- `--departure-range <km>`: 出发地搜索范围（默认350km）
- `--destination-range <km>`: 目的地搜索范围（默认300km）
- `--no-direct-only`: 包含中转航班（默认只看直飞）

### 第三步：处理返回结果

**情况A：返回 `success: true`**
```json
{
  "success": true,
  "flights": [...]
}
```
→ 按输出格式规范展示航班结果

**情况B：返回 `login_required: true`**
```json
{
  "success": false,
  "login_required": true,
  "message": "需要登录去哪儿平台才能搜索"
}
```
→ **执行登录流程**（见下方）

---

## 登录流程（Cookie 方式）

当 `flight-search` 返回 `login_required: true` 时，按以下流程引导用户登录：

### 1. 启动 Chrome 浏览器
```bash
python -m qvxianjiuguo.chrome_launcher
```

### 2. 引导用户手动登录
告诉用户：
> 请在打开的 Chrome 浏览器中完成登录：
> - 访问去哪儿官网 (qunar.com)
> - 使用手机号或账号密码登录
> - 完成滑块验证等安全验证
> 
> **注意**：推荐使用小号登录，避免主账号被封
> 
> 登录完成后请告诉我"登录好了"

### 3. 用户确认后自动保存 Cookie
**当用户回复"登录好了"、"已登录"、"登录成功"等确认信息后，立即执行：**
```bash
python -m qvxianjiuguo.cli flight-save-cookie --platform qunar
```

### 4. 保存成功后重新搜索
Cookie 保存成功后，自动重新执行 `flight-search` 命令搜索机票。

---

## 输出格式规范

### ⚠️ 重要：数据处理规则

**必须严格遵守以下规则，不得擅自修改或重新排序：**

1. **严格按照返回顺序展示**：CLI 返回的 `flights` 数组已按"直飞优先、价格从低到高"排序，**直接按顺序展示前 3 个**，不要重新排序
2. **直接使用返回数据**：
   - 使用 `rank` 字段作为序号（1, 2, 3）
   - 使用 `flight_type` 或 `is_direct_text` 字段显示航班类型
   - 使用 `price` 字段显示价格
   - 使用 `route` 字段显示航线
   - 使用 `time_range` 字段显示时间范围
3. **只展示前 3 个航班**：即使返回更多，也只展示前 3 个
4. **不要遗漏航班**：确保按顺序展示，不得跳过任何航班
5. **尊重直飞筛选**：如果 `direct_only: true`，则所有返回的航班都是直飞；如果 `direct_only: false`，则可能包含中转航班

### ⚠️ 关键：模糊搜索结果处理

**模糊搜索会返回多个机场的结果，必须正确处理：**

1. **不要按目的地过滤**：返回的航班可能降落在不同机场（如用户搜上海，但返回的航班可能降落在PVG/SHA/常州/杭州等）
2. **展示最便宜的航班**：前3个航班就是最便宜的，不管降落哪个机场
3. **降落机场提示**：如果 `arrival_code` 对应的城市与用户搜索的目的地不同，需要添加地面交通提示

**示例：用户搜索"成都飞上海"，返回结果可能包含：**
- 成都→上海浦东(PVG) ¥600
- 成都→常州(CZX) ¥400 ← 更便宜，排在前面
- 成都→杭州(HGH) ¥450

**此时必须展示成都→常州 ¥400，并提示"降落在常州，距上海约180公里"**

### JSON 返回格式说明

```json
{
  "success": true,
  "direct_only": false,         // false 表示包含中转航班
  "sort_rule": "直飞优先，然后按价格从低到高",
  "total_flights_found": 15,
  "flights": [
    {
      "rank": 1,
      "price": 584,
      "airline": "春秋航空",
      "flight_no": "9C8956",
      "departure_code": "CTU",
      "arrival_code": "PVG",
      "departure_time": "08:00",
      "arrival_time": "10:50",
      "duration": "2小时50分钟",
      "is_direct": true,
      "is_direct_text": "直飞",
      "flight_type": "直飞",
      "route": "CTU→PVG",
      "time_range": "08:00-10:50",
      "date": "2026-04-04"
    },
    {
      "rank": 2,
      "price": 520,
      "airline": "东方航空",
      "is_direct": false,
      "is_direct_text": "中转(西安)",
      "flight_type": "中转(西安)",
      "transfer_info": "西安",
      "route": "CTU→SHA",
      ...
    }
  ]
}
```

### 直飞航班输出模板

```
🛫 <出发地> → <目的地>（<日期>）

💰 最低价航班（3个）

1️⃣ <airline> - ¥<price> [<flight_type>]
   航班：<flight_no>
   出发：<departure_code> <departure_time>
   到达：<arrival_code> <arrival_time>
   时长：<duration>
   [如到达机场不是目的地机场，添加：⚠️ 降落在XX机场，距目的地XX公里]

2️⃣ ...（按返回顺序）

3️⃣ ...（按返回顺序）
```

### 中转航班输出模板（当 direct_only: false 时）

```
🛫 <出发地> → <目的地>（<日期>）

💰 最低价航班（3个）

1️⃣ <airline> - ¥<price> [<flight_type>]
   航班：<flight_no>
   出发：<departure_code> <departure_time>
   到达：<arrival_code> <arrival_time>
   时长：<duration>
   [中转航班额外显示：🔄 中转：<transfer_info>]

2️⃣ ...（按返回顺序）

3️⃣ ...（按返回顺序）

📊 搜索详情
- 出发地机场：<departure_airports>
- 目的地机场：<arrival_airports>
- 共搜索：<total_combinations> 个组合
- 筛选：<direct_only 为 true 显示"仅直飞"，为 false 显示"包含中转">

💡 推荐：<简短的购买建议>
```

### 中转航班示例

```
🛫 成都 → 上海（4月4日）

💰 最低价航班（3个）

1️⃣ 春秋航空 - ¥584 [直飞]
   航班：9C8956
   出发：CTU 08:00
   到达：PVG 10:50
   时长：2小时50分钟

2️⃣ 东方航空 - ¥520 [中转(西安)]
   航班：MU1234
   出发：CTU 07:00
   到达：SHA 14:30
   时长：7小时30分钟
   🔄 中转：西安

3️⃣ 南方航空 - ¥480 [中转(广州)]
   航班：CZ5678
   出发：TFU 06:30
   到达：PVG 16:00
   时长：9小时30分钟
   🔄 中转：广州

📊 搜索详情
- 出发地机场：CTU, TFU, MIG
- 目的地机场：SHA, PVG, HGH
- 共搜索：9 个组合
- 筛选：包含中转

💡 推荐：春秋航空¥584直飞最方便，东方航空¥520中转西安稍便宜但时间较长。
```

### 错误示例（禁止）

❌ **错误**：自己重新排序、跳过航班、遗漏数据
❌ **错误**：用户说直飞但展示了中转航班（应检查 `is_direct` 字段）
❌ **错误**：展示了第4个航班而非前3个

---

## 示例对话

**用户**：帮我查4月4日成都到兰州的机票，去哪儿搜

**助手**：好的，我来帮您在去哪儿搜索成都到兰州的机票。

执行搜索：
```bash
python -m qvxianjiuguo.cli flight-search \
  --departure "成都" \
  --destination "兰州" \
  --date "2026-04-04" \
  --platform qunar
```

---

🛫 成都 → 兰州（4月4日）

💰 最低价航班（3个）

1️⃣ 深圳航空 - ¥905
   航班：ZH8997
   出发：成都天府机场(TFU) 12:45
   到达：兰州中川机场(LHW) 14:20
   时长：1小时35分钟

2️⃣ 四川航空 - ¥935
   航班：3U8597
   出发：成都天府机场(TFU) 08:30
   到达：兰州中川机场(LHW) 10:05
   时长：1小时35分钟

3️⃣ 东方航空 - ¥1020
   航班：MU2475
   出发：成都双流机场(CTU) 15:20
   到达：兰州中川机场(LHW) 16:55
   时长：1小时35分钟

📊 搜索详情
- 出发地机场：成都双流(CTU)、成都天府(TFU)、绵阳(MIG)
- 目的地机场：兰州中川(LHW)、西宁(XNN)
- 共搜索：3个出发机场 × 2个目的地机场 = 6个组合

💡 推荐：深圳航空¥905是最低价，中午出发时间合适，建议尽早预订。

---

**用户**：帮我查4月5日北京到秦皇岛的机票

**助手**：

🛫 北京 → 秦皇岛（4月5日）

💰 最低价航班（3个）

1️⃣ 河北航空 - ¥380
   航班：NS3333
   出发：北京大兴机场(PKX) 09:00
   到达：唐山三女河机场(TVS) 10:15
   时长：1小时15分钟
   ⚠️ 降落在唐山机场，距秦皇岛约100公里，可乘大巴前往，约1.5小时

2️⃣ 中国国航 - ¥650
   航班：CA8888
   出发：北京首都机场(PEK) 14:30
   到达：秦皇岛北戴河机场(BPE) 15:30
   时长：1小时

3️⃣ 南方航空 - ¥720
   航班：CZ6666
   出发：北京大兴机场(PKX) 18:00
   到达：秦皇岛北戴河机场(BPE) 19:00
   时长：1小时

📊 搜索详情
- 出发地机场：北京首都(PEK)、北京大兴(PKX)、天津滨海(TSN)
- 目的地机场：秦皇岛北戴河(BPE)、唐山三女河(TVS)
- 共搜索：3个出发机场 × 2个目的地机场 = 6个组合

💡 推荐：河北航空¥380最便宜，但需要从唐山坐大巴到秦皇岛。如果赶时间，国航¥650直飞秦皇岛更方便。

---

## 地面交通参考

当航班降落在临近机场时，提供以下地面交通指引：

### 常见临近机场交通

| 到达机场 | 目的地 | 交通方式 | 时间 |
|----------|--------|----------|------|
| 唐山(TVS) | 秦皇岛 | 大巴 | 1.5小时 |
| 天津(TSN) | 北京 | 高铁 | 35分钟 |
| 石家庄(SJW) | 北京 | 高铁 | 1小时 |
| 广州(CAN) | 深圳 | 高铁 | 30分钟 |
| 深圳(SZX) | 广州 | 高铁 | 30分钟 |
| 成都(CTU/TFU) | 重庆 | 高铁 | 1.5小时 |
| 重庆(CKG) | 成都 | 高铁 | 1.5小时 |
| 杭州(HGH) | 上海 | 高铁 | 1小时 |
| 南京(NKG) | 上海 | 高铁 | 1小时 |
| 西安(XIY) | 郑州 | 高铁 | 2小时 |

### 提示格式

当航班到达机场与目的地不同时，使用以下格式提示：

```
⚠️ 降落在<机场名>，距<目的地>约<距离>公里，可乘<交通方式>前往，约<时间>
```

---

## CLI 命令参考

### flight-search（搜索机票）

```bash
python -m qvxianjiuguo.cli flight-search \
  --departure "重庆" \
  --destination "南京" \
  --date "2026-04-04"
```

| 参数 | 必需 | 说明 | 默认值 |
|------|------|------|--------|
| --departure | 是 | 出发地（城市名） | - |
| --destination | 是 | 目的地（城市名） | - |
| --date | 是 | 出发日期(YYYY-MM-DD) | - |
| --platform | 否 | 平台：qunar/ctrip/fliggy/ly/all | qunar |
| --departure-range | 否 | 出发地范围(km) | 350 |
| --destination-range | 否 | 目的地范围(km) | 300 |
| --no-direct-only | 否 | 包含中转航班 | 默认只看直飞 |

### flight-save-cookie（保存 Cookie）

```bash
python -m qvxianjiuguo.cli flight-save-cookie --platform qunar
```

### flight-load-cookie（加载 Cookie）

```bash
python -m qvxianjiuguo.cli flight-load-cookie --platform qunar
```

### flight-check-login（检查登录状态）

```bash
python -m qvxianjiuguo.cli flight-check-login --platform qunar
```

### flight-lookup（查询机场）

```bash
python -m qvxianjiuguo.cli flight-lookup --city "重庆"
```

### flight-nearby（附近机场）

```bash
python -m qvxianjiuguo.cli flight-nearby --airport "CKG" --range 300
```

---

## 平台说明

| 平台 | 代码 | 登录支持 | 搜索支持 | 说明 |
|------|------|----------|----------|------|
| 去哪儿 | qunar | ✅ Cookie 方式 | ✅ 完整支持 | **默认平台**，推荐使用 |
| 携程 | ctrip | ✅ Cookie 方式 | ⚠️ 基础支持 | 不保证持续适配 |
| 飞猪 | fliggy | ✅ Cookie 方式 | ⚠️ 基础支持 | 不保证持续适配 |
| 同程 | ly | ✅ Cookie 方式 | ⚠️ 基础支持 | 不保证持续适配 |

**重要说明**：
- **去哪儿**是主要支持平台，会持续维护和适配
- **携程、飞猪、同程**仅提供基础支持，**不保证持续适配**
- 如遇其他平台搜索失败，建议切换到去哪儿平台

---

## 注意事项

1. **登录状态保持**：
   - Chrome 配置目录：`~/.qvxianjiuguo/chrome-profile`（浏览器自动管理）
   - Cookie 备份文件：`~/.qvxian/qunar_cookies.json`（手动保存）
   - 建议：登录后执行 `flight-save-cookie` 命令备份登录状态
2. **不要转去互联网搜索**：本技能已实现完整搜索功能
3. **默认直飞**：默认只搜索直飞航班，如需中转请明确告知
4. **安全第一**：强烈建议使用小号，购票请在手机官方APP完成
5. **不计算总费用**：只显示机票价格，不加上地面交通费用
6. **不推荐地铁**：地面交通只提高铁、大巴等跨城交通