seat-advisor
seat-advisor:航班座位分析与推荐
前提
脚本已内置 cookie,可直接运行。cookie 有效期约数天,过期后脚本会报 401 错误,届时需更新 scripts/fetch_seatmap.ts 中的 COOKIE 常量。
输入收集
从用户消息中提取:
- 出发地(IATA,如 HKG)
- 目的地(IATA,如 SYD)
- 日期(YYYY-MM-DD)
- 人数(默认 1 人)
- 舱等偏好(默认经济舱;若用户未说明,先给经济舱建议)
- 特殊需求(靠窗/走道、带孩子、腿长、愿意加钱等)
信息不足时直接询问,一次问清。
执行流程
Step 1:查询航班列表
脚本位于 scripts/fetch_seatmap.ts(相对 SKILL.md 所在目录)。
第一步:拉取航班列表(快,不含座位图)
bun <skill_dir>/scripts/fetch_seatmap.ts flights <FROM> <TO> <DATE> [AIRLINE]
返回 JSON 数组,每个元素含:flightNo、airlineName、departureTime、arrivalTime、travelTime、aircraftName、planeId
根据返回的 airlineCode 和 airlineName,结合自身知识判断航司档次并标注。档次分三级:
| 档次 | 标签 | 典型特征 | 示例 |
|---|---|---|---|
| 全服务 | ✈ 全服务 | 含托运行李、餐食、选座通常免费 | 国泰 CX、新航 SQ、全日空 NH、澳航 QF、国航 CA |
| 中端/混合 | ✈ 中端 | 基础票可能不含行李或餐食,但服务水平介于全服务和廉航之间 | 香港航空 HX、酷航长途 TR、越捷 VJ |
| 廉航 | ⚡ 廉航 | 票价仅含座位,行李/餐食/选座均需另购 | 春秋 9C、乐桃 MM、亚航 AK/D7、捷星 3K/JQ、宿务太平洋 5J、瑞安 FR、易捷 U2 |
上表仅供参考,实际判断以你对该航司的了解为准。如果遇到不确定的航司,标注为"中端"并注明"具体政策请查航司官网"。
若只有一个航班,直接展示航司档次信息后进入 Step 2。
若有多个航班,先列出让用户选择,格式:
找到以下航班,请选择:
1. QF128 澳洲航空 ✈全服务 19:30 → 07:45 (9h 15m) | A330-300
2. HX17 香港航空 ✈中端 22:05 → 10:35 (9h 30m) | A330-300
3. CX181 国泰航空 ✈全服务 00:45 → 12:45 (9h 0m) | 777-300ER
请问你要看哪个航班的座位?
廉航专属提醒:若航班属于廉航,在航班列表后追加醒目提示:
⚡ 提醒:[航司名] 为廉航,请注意:
· 选座通常需额外付费(靠窗/前排/腿部空间座更贵)
· 托运行李需另购,仅含随身小包
· 机上餐食和饮料需付费
· 座距通常比全服务航司更紧凑(28-29" vs 31-32")
用户选择后,再执行 Step 2。记住用户选择的航司档次,后续推荐座位时会用到。
Step 2:获取座位图并展示
bun <skill_dir>/scripts/fetch_seatmap.ts seatmap <PLANE_ID> "<AIRCRAFT_NAME>"
返回完整座位图 JSON,含:
aircraftName:机型名称classFeatures:各舱等参数(间距、宽度、充电、WiFi)cabins:各舱等布局(排号范围、座位数、layout 如 "3-4-3"、windowCols、aisleCols)defaultFeature:大多数座位的 feature bitmask 值(通常是1024即 standardSeat),未出现在 seatExceptions 中的座位均为此值seatExceptions:非默认 feature 的座位,按 feature 值分组,格式为{ "32": ["13A","13K",...], "3": ["22B",...] }F:feature bitmask 解码表,用按位与解码,例如f & F.standardSeat非零表示标准座,f & F.nearGalley非零表示靠近厨房wingRows:机翼遮挡窗口的排号列表
推导规则(不在 JSON 中输出,从 cabins 推导):
- 舱等:座位排号在某个 cabin 的
rowStart~rowEnd范围内,即属于该舱等 - 靠窗:座位列字母在该舱等的
windowCols中 - 靠走道:座位列字母在该舱等的
aisleCols中 - 中间座:既不在 windowCols 也不在 aisleCols 中
展示机型信息
格式要求:专业、有料、不啰嗦。
✈ [航空公司] [航班号] · [出发]-[目的地] · [日期]
航司档次:[✈全服务 / ✈中端 / ⚡廉航] — [一句话说明特点:含托运行李+餐食,选座通常免费 / 基础票可能不含行李或餐食,服务介于全服务和廉航之间 / 票价仅含座位,行李/餐食/选座均需另购]
机型:[专业描述,见下方规则]
舱等配置
─────────────────────────────
[图例]
[各舱等一览表]
─────────────────────────────
⚠ 机翼遮挡说明
机型专业描述规则:
根据 aircraftName 中的机型代码,结合以下知识给出专业介绍:
| 机型关键词 | 描述要点 |
|---|---|
| A380 | 全球最大双层宽体客机,上下两层,四发动机,极其安静,部分航司有淋浴和酒吧——重点突出双层结构和乘坐体验 |
| B747 / 744 | 经典"驼峰"宽体,双层头部,四发,标志性机型 |
| A350 | 新一代宽体,大量碳纤维,超大舷窗,机舱湿度更高,较安静 |
| B787 / 788 / 789 | 梦想客机,碳纤维机身,超大窗户,增压更高,飞行舒适度优秀 |
| A330 / 332 / 333 | 双发中型宽体,经典双通道,经济实惠但历史较长 |
| B777 / 773 / 77W | 最大双发宽体,三舱布局通常是 3-4-3,特别宽 |
| A320 / A321 | 单通道窄体,常见短途,3-3 布局 |
| B737 | 单通道窄体,全球最常见,3-3 布局 |
从 classFeatures 读取实际舱等间距/宽度/充电数据,插入描述中。
seat_pitch、seat_width、seat_recline 均以**英寸(inch)**为单位,展示时同时给出厘米换算(1" = 2.54 cm),格式为 32"(81cm)。
舱等一览表示例(按排号从前到后):
舱等 排数 座位数 布局 间距 宽度
商务舱 11-23 45个 1-2-1 82"(208cm) 21"(53cm)
豪华经济 30-35 48个 2-4-2 38"(97cm) 19.5"(50cm)
经济舱 39-72 268个 3-4-3 32"(81cm) 17.2"(44cm)
机翼遮挡说明:
从 wingRows 计算哪些排受影响,说明影响的是哪个舱等、哪几排、影响哪侧窗口座(通常是最左列 A 和最右列 K)。举例:
⚠ 机翼遮挡:豪华经济舱 31-35 排、经济舱 40-46 排的窗口座(A/K 列)视野会被机翼部分遮挡,靠窗党需注意。
Step 3:沿途景观提示
根据出发地、目的地的地理位置、航班起飞时间和月份季节,判断靠窗能看到什么。
推断逻辑:
- 飞行方向:根据出发地→目的地的相对位置,判断航线大致走向(如"由东南飞向西北")
- 左右两侧朝向:由飞行方向推断左侧(A列)和右侧(末列)分别大致朝向哪个方向,进而判断哪侧可能看到特定地貌/城市/山脉
- 起飞时间 + 季节:
- 判断飞行期间是白天、夜晚、日出还是日落
- 季节影响云层概率(夏季多云、冬季晴天多等),以及地貌特征(积雪山脉、绿色平原等)
- 航线经过的地标:结合航路(不需要精确,大致省份/地区即可)提示沿途可能出现的山脉、河流、城市夜景、海岸线等
输出格式(简洁,3-5 条要点):
🪟 沿途景观(左侧 A 列 / 右侧 K 列)
· 航线大致走向:东南→西北
· 左侧(A):飞越珠三角城市群后进入内陆山地,夜间可见城市灯火
· 右侧(K):广东东部山区,光线较暗,景观一般
· 推荐坐:左侧(A 列)
· 备注:夜航为主,云层以下视野取决于云量;22:xx 起飞抵达西安时约 23:xx,全程夜景
若夜航或云层遮挡概率高,如实说明,不过度渲染。若景观两侧相当,说明"两侧无明显差异"。
Step 4:座位推荐
默认推荐逻辑(1 人,未指定偏好)
默认座位偏好取决于航司档次:
- 全服务/中端航司 → 默认推荐靠窗(
isWindow: true),因为座距舒适,靠窗可看风景且不被打扰 - 廉航 → 默认推荐靠走道(
isAisle: true),原因:廉航座距紧凑(通常 28-29"),走道座进出方便、不用翻越邻座,体感空间也更大;此外廉航靠窗/前排座通常要额外付费,走道座更可能是免费可选的
用户明确说了偏好则优先遵循用户意愿,以上仅为默认策略。
目标座位特征:
features中有standardSeat:+(免费标准座)- 靠窗或靠走道(按上述默认策略)
- 不在
wingRows中(避开机翼遮挡) - 不含坏 feature(
nearGalley:-、nearLavatory:-、limitedRecline:-、noFloorStorage:-、getColdByExit:-)
筛选步骤:
- 过滤出符合上述条件的座位
- 优先选靠前但避开最前两排的位置(最前排靠近厨房/厕所,噪音和人流量大)
- 推荐 2-3 个备选,简述各自优缺点
推荐输出格式(全服务航司示例):
💺 为你推荐(1人 · 经济舱 · 靠窗)
首选:42A 或 42K
· 标准座,无额外收费
· 靠窗,机翼遮挡区之外,视野良好
· 距厕所/厨房有足够距离
备选:48A / 48K(更靠后,通常更安静)
推荐输出格式(廉航示例):
💺 为你推荐(1人 · 经济舱 · 靠走道)
首选:12C 或 12D
· 标准座,通常无需额外付费
· 靠走道,进出方便——廉航座距紧凑,走道座体感更宽敞
· 距厕所/厨房有足够距离
备选:15C / 15D(更靠后,登机后上方行李架空间可能更充裕)
💡 提示:廉航靠窗座和前排座通常需额外付费,如果不想加钱,走道座是性价比最高的选择。
2 人同行
从 cabins 读取该舱等的 layout,说明布局并推荐:
- 3-4-3 布局(经济舱):推荐 A+B(左窗口组)或 J+K(右窗口组)。A/K 靠窗,B/J 紧邻,两人相邻且都靠近窗口。中间组 4 座共享,两侧各有陌生人。
- 2-4-2 布局(豪华经济):推荐 A+C 或 H+K,整组就你们两人,两侧无人打扰。
- 1-2-1 布局(商务舱):每人独立,推荐相邻的 D+G(中间组,可搭话)或对侧的 A+K(各自靠窗)。
输出要清楚说明"你们旁边还有没有陌生人"。
示例:
💺 为你推荐(2人 · 经济舱 · 3-4-3 布局)
推荐:42A + 42B(或 42J + 42K)
· 布局:[A B C] [D E F G] [H J K]
· A/K 靠窗,B/J 紧邻——你们两人相邻,旁边 C/H 位置是陌生人
· 若想完全不被打扰,考虑豪华经济 2-4-2 舱(A+C 或 H+K,整组就你们两人)
用户明确愿意加钱
推荐带 extraLegroom:+、exitRow:+ 的座位,说明额外收费原因(出口排腿部空间大、紧急出口须配合乘务员)。带婴儿可推荐 bassinet:+ 座位并说明位置特点。
注意事项
- 座位可用性(已售/未售)脚本无法获取,说明此信息仅供参考,实际选座以航司 App 为准
- 若脚本报 401 错误,说明 cookie 已过期,提示用户更新
scripts/fetch_seatmap.ts中的COOKIE常量 - 若航班列表返回空数组,告知用户该航线/日期暂无数据,建议换日期或直接到航司官网查询
- 若某排的
features为空,说明该座无特殊标注,视为普通座位处理 - 可通过 https://seatmaps.com/seatmaps/xxx.html (将
xxx替换为planeId)直接查看可视化座位图,作为补充参考