---
name: roadtrip-planner
description: 出行路书规划通用工作流——用户只需说「从 A 到 B 去玩」（可选人数/天数/日期），即可产出：自驾/高铁/飞机费用对比（含往返口径与落地租车反转）、自驾分段路线与过路费油费、目的地与沿途天气+穿衣指南、推荐景点（网红+免费博物馆）串联动线、景点官方电话+急救电话、周一闭馆自检、车辆保障与出发前 Checklist，输出结论先行的单文件 HTML（可选腾讯地图路线图）。无技术门槛：没有地图 key 也能用。触发词：旅游规划、自驾路书、自驾游攻略、帮我规划旅行、去哪玩怎么去、两点之间怎么走、路费多少、油费过路费、交通方式对比、旅游路线、roadtrip。
author: 214520626@qq.com
agent_created: true
---

# 出行路书规划（roadtrip-planner）

自包含的出行规划工作流：用户一句话说起点终点 → 反问合并为一次 → 完整路书 + 单文件 HTML 报告。无地图 key 也能完成约 80% 产出（WebSearch 降级），key 只是地图与精确里程的增强项。

## 非技术用户交互规范（SkillHub 受众，优先级最高）

- **最小启动集**：只有起点+终点就开工。人数未给默认按 2 人并在报告标注「按 2 人估算，说个数即可重算」；天数/日期/往返全部用带标注的假设，产出后邀请「改一个数字即可重算」。
- **问题合并一次问**：确需确认时，用一次性选择题（≤4 个、口语化选项），绝不连环追问、不用术语。
- **结论先行**：每页开头 3 句以内人话总结（哪个方案最省 / 总花费 / 共几天），表格只做支撑；估算与待确认项集中放页尾清单。
- **术语不出门**：polyline、GCJ-02、key、JSAPI 等词只存在于 agent 内部与代码里；用户可见文案只说「路线」「地图」。
- **失败即告知**：接口/搜索失败时明说「这部分用了估计值 / 暂时缺失」，绝不静默编数。

## 铁律：一切信息来自用户或实时查询，不写死

- **入参只有用户给的**：起点、终点、人数为必答；总天数、出发日期、单程/往返、交通方式偏好为选答（缺就问一句，或给带标注的假设）。
- **所有数字 = 接口返回值 / 当日搜索结果**，必须标查询日期；估算项（油耗、房价、餐饮）标「估算」并给可替换参数。
- 报告中**不得出现**本 skill 自带的示例城市、示例金额作为结论；示例仅用于解释算法。
- 查不到的数据写「未检索到可靠来源」，禁止编造（电话、门票、政策尤其如此）。

## 输入参数表

| 参数 | 必填 | 缺省处理 |
|---|---|---|
| 起点 / 终点 | ✅ | 终点有歧义（如省市同名）时合并进「一次性确认」或声明默认假设并给延伸距离 |
| 人数 | 建议 | 未给默认 2 人并标注；结论对人数敏感（自驾临界点）时才追问 |
| 单程 / 往返 | 建议 | 规则：**开车去则开车回，高铁/飞机则同方式往返**；拿不准按往返 |
| 总天数 | 可选 | 未定则按常见值给假设并显式标注（如「沿海去 N 天 + 目的地 M 天 + 返程 K 天」） |
| 出发日期 | 可选 | 未定则天气只给「最近实测」并提示按实际日期重查；闭馆核对输出「自检表」而非逐日判定 |
| 油耗/油价 | 可选 | 默认 8L/100km、92# ¥7.5/L，标注为可替换估算口径 |

## 前置：双地图供应商 + 临时授权（自包含，无外部 skill 依赖）

自带零依赖客户端 `scripts/tmap_api.py`（纯 urllib），**统一接口支持腾讯 / 高德两家**，已抹平差异（坐标顺序、过路费字段、polyline 格式、时长单位）：

```python
import sys; sys.path.insert(0, "<本skill目录>/scripts")
from tmap_api import MapClient
tm = MapClient("tencent")            # 默认腾讯；用户有高德 key 时 MapClient("amap")
tm.geocode("上海人民广场")            # -> {"lat","lng","adcode"}
tm.direction("31.23,121.47","43.88,125.32")   # -> distance_m/duration_min/toll_yuan/polyline
tm.poi_search("博物馆", region="长春")
tm.weather("43.88,125.32")           # -> {"days":[...]}，约 4 天
```

**供应商与临时授权选择逻辑**（按优先级）：
1. **用户明确给了某家 key** → 用那家（`MapClient("amap", key=...)`）。
2. **本机已有临时授权** → 腾讯读 `~/.tencentmap/tempkey.json`（AI 场景临时 Key：手机验证码申请、1 年有效、PV 5000/天、QPS 5/s；申请流程用环境里的 `tencentmap-map-assistant` skill 四脚本，未安装则引导 lbs.qq.com）；高德读 `~/.amap/key.json`（约定路径）。
3. **都没有** → 默认腾讯走 WebSearch 降级（80% 产出不受阻）；用户想要真地图/精确里程时再给一句话申请指引。**绝不因缺 key 中断任务。**
- 供应商差异已内置：坐标顺序（腾讯 lat,lng / 高德 lng,lat）、过路费字段（toll / tolls）、polyline 格式（压缩差值 / 分号字符串）、时长单位（分钟 / 秒）。
- 两家天气都只回约 4 天，7 天预报用 weather.com.cn 城市页补全。
- **坑**：`status!=0` 先分辨真错误还是 key 过期误判——旧 key 常仍可用，先 curl 验证再显式传 key。HTML 内嵌 key 必须附安全提示。
- 输出 HTML 以 `assets/report_skeleton.html` 为底版（暗色单文件、地图加载失败静默降级不阻塞表格；占位符 `__TITLE__/__TENCENT_MAP_KEY__/__SEGMENTS__` 等由生成脚本替换）。

## 流程（按用户需求裁剪，别一次铺全套）

**第 0 步先问清意图**：用户说「旅游规划/路费」时，大概率只要**交通方式费用对比**让自己选；说「景点/攻略」才铺全套。先给对比页，其余按需追加。

### 1. 分段路线
单程 >800km 按天切段（每天 4-6h 驾驶）。`direction(from,to,mode='driving',raw=True)` 取 `distance/duration/toll/polyline`；**过路费是接口直出字段**。另跑一次起点→终点全程作「赶路版」对照。

### 2. 交通方式对比（自驾/高铁/飞机）
- 三方案卡片：时长 + 费用构成（自驾拆过路费/油费/中途住宿）。
- **人均对比表按 `PEOPLE` 推导**——自驾是整车成本，不摊薄没法比。
- **落地租车反转**：飞机/高铁若落地要用车（周边景点），加「租车 ¥300/天×天数+本地油费」再比，结论常反转。
- 优劣表写全劣势（含己方方案）。高铁/机票用 WebSearch（携程/时刻表），**区分挂牌价与折后价、标查询日期**。

### 3. 往返口径（用户要往返时）
- 自驾往返 = 去程游玩线 + **返程直达最快线**（不重复绕路）；总里程×油耗参数 + 双程过路费 + 途中住宿（每段驾驶 >10h 记 1 晚）。
- 公式化计算（脚本算，不手算），散项求和必须与总数核对一致。
- 往返口径结论常与单程相反：纯交通费飞机最低、自驾往返最贵；自驾价值在「落地有车+自由+去程即游玩」。写清两种视角。

### 4. 天气 + 穿衣
- 腾讯天气 `type=future` **只回 4 天**；7 天用 weather.com.cn 城市页（`/weather/<城市代码>.shtml`）补全，前 4 天双源交叉校验。
- 穿衣指南按「白天档/夜间档/雨日/紫外线/下装鞋」五档分层（洋葱式），引用昼夜最大温差与雨日。
- 出发日期未定 → 给「最近实测+按日期重查」提示。

### 5. 景点与动线
- 用户要的是**景点串联动线**，不是城际干线。每城挑 3-4 个（免费馆/网红/收费），逐段 `direction` 取真实车程。
- 地图：灰细线=城际干线，彩色粗线=城内串线，圆点分类分色+序号+InfoWindow（门票/预约），城市切换按钮。
- POI 每次 `time.sleep(0.3)`；天气接口 QPS 更严（≥0.4s）。
- 预约要求用 WebSearch 核实，**只采信官网/公众号/文旅局/ncha.gov.cn 年报**；OTA 只作中低可信度并标注；口径冲突就并列展示+提示复核。

### 6. 官方电话 + 急救
- 每景点给：官方咨询/预约电话 + 景区救援/急救专线（官网「救援电话」栏常有）+ 预约口径。
- 来源硬约束：景区官网、市文旅局、ncha.gov.cn 博物馆年报；**查不到就写「未检索到」，绝不硬填**。
- 附通用急救表（全国通用公共号码：120/110/119/122/12110/12395 海上/12301/12345）。

### 7. 周一闭馆自检
- 逐馆核实闭馆日（官网/公告；**用「当天星期几 vs 实时营业状态」可实证**）。默认多数馆周一闭，但**纪念馆/景区类常不闭，必须逐个查**。
- 出发日期已定 → 直接算「第 N 天到哪城、撞不撞周一」；未定 → 给「闭馆清单 + 月历周几对照」自检表。

### 8. 车辆保障 + Checklist（自驾往返时）
- 救援：高速抛锚 12122（保险/社会拖车禁上高速，先拖离）、普通路事故 122、故障打承保公司救援热线、伤人 120、监督 12328；抛锚动作=双闪+150m 三角牌+人撤护栏外。
- 异地出险流程、车况检查项、电车按 200-250km 规划快充。
- 限行：回程终点城市的外牌限行时段/节假日规则需 WebSearch 当年现行规定（政策逐年变）。
- 三阶段 Checklist（前 1 周/前 1 天/当天），预约复核+证件+车况+离线地图。

## 输出

- 单文件 HTML（暗色、内联样式/脚本；地图块以外零外部依赖）。多主题可拆多页，但每页自洽。以 `assets/report_skeleton.html` 为底版生成。
- 内联 JS 生成后 `node --check` 校验语法（JSAPI 参数错只静默降级不报错）；`string.Template` 只认 `$VAR` 不认 `{VAR}`。
- 交付后列「估算项与待确认项」清单（预约政策、机票价格、闭馆例外）。

## 目录结构

```
roadtrip-planner/
├── SKILL.md                     # 本文件（工作流与规则）
├── scripts/tmap_api.py          # 腾讯 WebService 零依赖客户端（geocode/direction/poi/weather）
└── assets/report_skeleton.html  # 暗色单文件 HTML 底版（地图降级安全）
```
