Trip Planner CN

行程规划助手,支持往返/单程行程规划。触发词:规划行程、高铁查询、航班查询、机场周边、时间安排、出行方案、当天往返。 涵盖:航班/高铁时刻查询、中转方案、时间约束筛选、详细时间线生成。

Audits

Pass

Install

openclaw skills install trip-planner-cn

Trip Planner Skill

行程规划助手,支持往返行程(当天/隔天/多天)和单程行程规划。

前置条件

本技能使用DuMate自带的携程connector查询交通信息,无需额外安装依赖。

可选配置

  • BMAP_WEBAPI_AK - 百度地图API密钥,用于驾车时间查询(如未配置将使用估算值)

可用工具

工具功能数据源
___query_flight查询航班携程
___query_train查询高铁/火车携程
___query_hotel查询酒店携程
___query_ticket查询景点门票携程

触发场景

用户需要规划行程,涉及飞机、高铁、驾车等交通方式的选择和组合。

行程类型

  • 往返:可能是当天往返,也可能是隔天或多天
  • 单程:按"可以出发的时间"或"需要到达的时间"推算

核心规则

一、硬性约束(必须满足)

  • 明确了出发时间 → 不能比那个时间更早出发
  • 明确了到达时间 → 不能比那个时间更晚到达
  • 停留时间 → 必须满足
  • 说了"当天往返" → 必须找当天往返的方案(定义:早上6:30可以从出发地出发,晚上23:00前回到出发地)

二、软性约束(尽量满足)

  • 用户说"早去早回" → 在满足硬性约束下尽量早出发、早返回

三、时间预留

  • 国内航班:提前1小时到机场
  • 高铁:提前30分钟到站
  • 中转:预留足够时间(建议30分钟以上)

四、交通方式选择

  • 优先直达
  • 无直达时,考虑出发地或目的地周边城市的机场/火车站
  • 选择标准:总时长最短(从最初出发地到最终目的地)

五、驾车限制

  • 驾车时间不超过2.5小时
  • 例外情况:没有其他交通方式可选,或替代方案(飞机/高铁)比驾车多出1小时以上

六、不考虑价格因素

时间最关键,不因价格差异改变推荐方案。

航班查询规则(携程)

1. 打开页面

  • 访问携程航班搜索页面
  • 等待页面加载完成(sleep 3-5秒)

2. 按时间排序

  • 点击"起飞时间早-晚"排序
  • 便于后续筛选

3. 滚动加载完整数据(关键!)

携程等网站使用懒加载,必须滚动到底部才能获取所有航班。

操作步骤

  1. 获取初始快照
  2. 滚动页面:playwright-cli mousewheel 0 500
  3. 等待2秒让数据加载
  4. 获取新快照
  5. 重复步骤2-4,直到页面不再加载新内容

判断是否加载完成

  • 快照中的航班数量不再增加
  • 页面底部出现"没有更多"提示
  • 滚动后快照内容与上次相同

常见错误

  • 只获取第一屏数据就停止 → 遗漏后面的航班
  • 假设数据已完整 → 实际还有更多航班未加载

实际案例

  • 查询烟台→北京返程航班时,第一屏只显示到14:00的航班
  • 继续滚动后,发现19:30起飞的航班(这才是当天往返的关键)

4. 数据提取

  • 提取所有直飞航班
  • 区分虹桥机场(SHA)和浦东机场(PVG)
  • 区分直飞、经停、中转
  • 标注次日到达(+1)

携程connector数据解析规则

使用 ___query_flight 工具时,返回的 routeList 中每个 route 包含 flights 数组:

  • 直飞flights 数组长度为1,且 aport.name 为目标机场
  • 经停flights 数组长度为1,但 stops 不为空
  • 中转flights 数组长度大于1

筛选直飞航班时,必须同时满足:

  1. len(flights) == 1
  2. flights[0].aport.name == 目标机场名称

错误示例:只按 len(flights) == 1 筛选,未检查到达机场,导致遗漏部分直飞航班

5. 数据完整性验证

  • 提取后,对比"应该有多少航班"vs"实际提取了多少"
  • 关键决策前,抽查几个航班确认数据准确
  • 验证方法:用户提及某个航班时,立即在原始数据中搜索确认是否存在

6. 出发机场优先

  • 优先选择离用户出发地最近的机场
  • 例如:用户在浦东,优先选浦东机场出发的航班

高铁查询规则(12306)

1. 查询实时数据

  • 使用浏览器自动化访问12306

2. 未开售处理

  • 如目标日期未开售,查询历史同期/相近日期的时刻表作为参考
  • 标注"参考历史时刻表,实际以开售后为准"

穷尽周边机场

触发条件

  • 目的地城市进出港航班较少(如小城市、县城)
  • 目的地没有机场或机场航班选择有限

操作方法

  1. 确定目的地具体位置
  2. 在地图上搜索周边200-300km范围内的所有机场
  3. 不能凭印象列举,要系统性地排查
  4. 逐一查询每个机场的航班

优先级

  • 先查最近的机场
  • 航班选择少时,再查周边更远的机场

示例

  • 郎酒庄园(古蔺县二郎镇)→ 周边机场:泸州、遵义、重庆、贵阳、宜宾、昭通
  • 龙口(山东烟台下辖县级市)→ 周边机场:烟台、青岛、潍坊

综合排序

  • 不是按价格排序,而是按"总耗时"排序
  • 总耗时 = 出发地到机场/车站时间 + 候机/候车时间 + 航班/高铁时间 + 机场/车站到目的地时间
  • 输出时只输出筛选后的方案,不输出完整列表

驾车时间查询

  • 使用百度地图 webapi(需配置 BMAP_WEBAPI_AK 环境变量)
  • 如未配置,可使用估算值并标注

工作流程

1. 明确需求

  • 出发地、目的地
  • 出发日期
  • 行程类型(往返/单程)
  • 时间约束(出发时间/到达时间/停留时间)
  • 其他偏好(如"早去早回")

2. 确定目的地位置

  • 查询目的地具体位置
  • 搜索周边机场(200-300km范围)

3. 调研交通方式

  • 查询各机场航班时刻表
  • 查询高铁时刻表
  • 查询驾车时间(如适用)
  • 查询目的地到机场/车站的交通时间

4. 生成方案

  • 根据约束条件筛选可行方案
  • 计算每个方案的总耗时
  • 按总耗时排序

5. 呈现方案

  • 方案对比表
  • 最优方案详细时间线
  • 注意事项

输出格式

方案对比表

方案出发时间到达时间总耗时交通方式备注
方案AXX:XXXX:XXX小时XX→XX→XX简要说明
方案BXX:XXXX:XXX小时XX→XX→XX简要说明

最优方案详细时间线

06:30-08:10  北京首都机场  值机、安检、候机
08:10-09:35  北京首都机场 → 烟台蓬莱机场  乘坐SC5069航班
09:35-10:30  烟台机场 → 龙口  打车
...

注意事项

  • 航班号、航站楼信息
  • 中转交通建议
  • 到达时间较晚时的提醒

输出前自洽性检查(必须!)

时间线输出前,逐行检查:

1. 时间段长度与耗时说明一致

  • 例:写"05:50-06:08"则时长为18分钟,不能写"地铁30分钟"
  • 例:写"地铁30分钟"则时间段必须跨越30分钟

2. 每个交通节点预留候车/候机时间

  • 高铁发车前必须预留30分钟到站检票
  • 航班起飞前必须预留1小时到机场值机
  • 例:高铁14:09发车 → 最晚13:39到站 → 出发时间往前推
  • 错误示例:写"12:30-14:09 打车到威海站"然后"14:09高铁发车"——没有预留候车时间

常见错误

  1. 只查去程不查返程:导致返程时间不合适
  2. 忽略机场/车站到目的地的交通时间:导致实际停留时间不足
  3. 不考虑值机时间:导致赶不上航班
  4. 不区分机场/车站:导致用户跑错地方
  5. 违反硬性约束:推荐了不满足用户时间要求的方案
  6. 航班数据提取不完整:只获取了部分航班,遗漏更优方案
  7. 凭印象列举周边机场:遗漏更近的机场
  8. 只按价格排序:忽略了出发机场、总耗时等因素
  9. 时间线自相矛盾:时间段长度与耗时说明不一致(如写"05:50-06:08"但说明"地铁30分钟")
  10. 数据解析错误:携程connector返回了完整数据,但解析时筛选条件不正确,遗漏了部分航班(如只按 len(flights)==1 筛选,未检查到达机场是否为目标机场)

示例

用户需求:4月25日从上海浦东去泸州郎酒庄园,9:30后出发

目的地位置分析

  • 郎酒庄园位于泸州市古蔺县二郎镇,地处川黔交界
  • 周边机场:泸州云龙(100km)、遵义新舟(150km)、重庆江北(200km)、贵阳龙洞堡(280km)

调研结果

  • 上海→泸州:仅1班直飞(MF8857,16:25-19:30,虹桥T1)
  • 上海→重庆:多班航班,CA4576(12:05-14:55,浦东T2)较优
  • 上海→遵义:需查询
  • 上海→贵阳:多班航班

方案对比

方案出发时间到达庄园时间总耗时航班价格驾车距离
A(泸州直飞)14:2521:30约7小时¥740100km
B(重庆转车)10:0018:30约7小时¥900200km

推荐:方案B,从浦东出发更方便,到达时间更早。