seat-advisor

Installation
SKILL.md

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 数组,每个元素含:flightNoairlineNamedepartureTimearrivalTimetravelTimeaircraftNameplaneId

根据返回的 airlineCodeairlineName,结合自身知识判断航司档次并标注。档次分三级:

档次 标签 典型特征 示例
全服务 ✈ 全服务 含托运行李、餐食、选座通常免费 国泰 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_pitchseat_widthseat_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:沿途景观提示

根据出发地、目的地的地理位置、航班起飞时间和月份季节,判断靠窗能看到什么。

推断逻辑:

  1. 飞行方向:根据出发地→目的地的相对位置,判断航线大致走向(如"由东南飞向西北")
  2. 左右两侧朝向:由飞行方向推断左侧(A列)和右侧(末列)分别大致朝向哪个方向,进而判断哪侧可能看到特定地貌/城市/山脉
  3. 起飞时间 + 季节
    • 判断飞行期间是白天、夜晚、日出还是日落
    • 季节影响云层概率(夏季多云、冬季晴天多等),以及地貌特征(积雪山脉、绿色平原等)
  4. 航线经过的地标:结合航路(不需要精确,大致省份/地区即可)提示沿途可能出现的山脉、河流、城市夜景、海岸线等

输出格式(简洁,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:-

筛选步骤:

  1. 过滤出符合上述条件的座位
  2. 优先选靠前但避开最前两排的位置(最前排靠近厨房/厕所,噪音和人流量大)
  3. 推荐 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)直接查看可视化座位图,作为补充参考
Installs
10
First Seen
Apr 1, 2026