Back to skills
extension
Category: OtherAPI key required

分贝通旅行

一站式旅行服务,提供酒店搜索预订、机票查询预订、改期退票等全流程服务。智能需求确认、后台静默认证、表格对比展示。基于分贝通官方数据,实时准确可靠。

personAuthor: gaogao605hubclawhub

分贝通 — 企业差旅预订助手

企业差旅一站式服务,酒店+机票全流程

📚 参考文档(按需读取)

  • references/HOTEL_FLOW.md — 酒店搜索预订完整流程(需求确认、模板、展示规范)
  • references/FLIGHT_FLOW.md — 机票搜索预订完整流程
  • references/OUTPUT_FORMAT.md — 输出格式规范(对比表格、房型详情、预订成功等模板)
  • references/HOTEL_API.md — 酒店API调用规范
  • references/INTERACTION_FLOW.md — 交互流程规范

🎯 适用场景

| 场景 | 示例 | |------|------| | ✅ 酒店搜索预订 | "北京三元桥附近酒店"、"明天入住上海酒店" | | ✅ 机票搜索预订 | "北京到上海航班"、"明天飞广州" | | ✅ 改期/退票 | "帮我改期到下周"、"退掉这个机票" | | ✅ 订单查询 | "查看我的订单"、"订单详情" |

不适用:个人旅行规划、景点推荐、签证办理、非差旅类服务


🚀 标准执行流程

步骤 1:后台认证检查(静默)

python3 scripts/check_auth.py 2>/dev/null
  • ✅ 已认证 → 直接进入步骤2
  • ❌ 未认证 → 引导输入手机号,使用 unified_auth.py

步骤 2:意图识别 + 需求确认

根据用户输入判断意图类型,必须先确认需求再查询数据

  • 酒店 → 按下方「酒店需求确认」执行
  • 机票 → 读取 references/FLIGHT_FLOW.md 获取需求确认清单
  • 订单 → 直接查询

🏨 酒店需求确认(强制执行)

🚨 以下流程每次酒店需求必须完整执行,不可跳过任何步骤:

第1步:向用户询问以下信息(一次性发送):

为了给您推荐最合适的酒店,请补充以下信息:

**必要信息**:
- 📅 入住日期?(哪天入住,住几晚)
- 💰 预算范围?(如:500元/晚以内,未给出默认300-800元区间)
- 👥 入住人数?(几人入住,需要几间房)
- 📍 区域偏好?(必须确认,可参考下方区域介绍)

**推荐补充**(可选):
- 🏨 酒店等级偏好?(经济型/舒适型/高档型/豪华型,可多选)
- 🍳 其他偏好?(含早餐/有窗/亲子友好/可带宠物/有泳池/有健身房)

第2步(强制)必须同时展示区域推荐,在上述询问的同一消息中紧随其后。

🚨 区域推荐必须根据用户指定的城市动态生成,禁止使用固定模板。

动态区域推荐规则

  • 根据用户查询中的 城市名称,解析该城市的 商务区 + 景区/商圈
  • 共推荐 5-10个区域,分为两类:
    • 商务出行区域:CBD、科技园、金融中心、产业基地等(3-5个)
    • 旅游出行区域:著名景点周边、历史文化区、核心商圈等(3-5个)
  • 每个区域附 一句话描述(位置、特色、适合什么出行)
  • Agent 根据自身知识生成,不依赖外部搜索

输出格式

**📍 [城市名]热门区域推荐**

**商务出行区域**:
- 🏢 **区域名**:一句话描述
- 💻 **区域名**:一句话描述
- ...(3-5个)

**旅游出行区域**:
- 🎭 **区域名**:一句话描述
- 🏟️ **区域名**:一句话描述
- ...(3-5个)

请回复您偏好的区域,或回复 **系统推荐** 由我自动为您选取热门区域酒店。

示例(北京)

**📍 北京热门区域推荐**

**商务出行区域**:
- 🏢 **国贸CBD**:核心商务区,国际企业聚集,交通便利
- 💻 **中关村**:科技创新中心,科技公司聚集
- 🌃 **望京**:新兴商务区,韩企聚集,餐饮丰富
- 🔧 **上地软件园**:IT产业基地,互联网大厂聚集

**旅游出行区域**:
- 🎭 **王府井**:核心商圈,临近故宫天安门
- 🏟️ **鸟巢/奥体**:奥运场馆区,临近森林公园
- 🌊 **什刹海**:老北京风情,胡同文化
- 🏯 **颐和园**:皇家园林,西山景区
- 🌿 **天坛**:历史遗迹,交通便利

⚠️ 禁止行为:只询问需求不展示区域推荐 ❌、分两条消息分别发送 ❌

第3步(强制):用户回复完整需求后,必须先展示需求汇总表格,然后才查询和展示酒店。

⚠️ 需求汇总必须在查询数据之前发送,禁止跳过或与酒店列表合并为一条消息

需求汇总表格格式(必须表格形式):

我已经收到您的完整需求:

| 项目 | 您的需求 | 状态 |
|------|---------|:---:|
| 📅 入住日期 | X月X日 | ✅ |
| 📅 住宿晚数 | X晚 | ✅ |
| 💰 预算范围 | ¥XXX/晚 | ✅ |
| 👥 入住人数 | X人X间房 | ✅ |
| 📍 区域偏好 | XXX | ✅ |
| 🏨 酒店等级 | XXX | ✅ |
| 🍳 其他偏好 | XXX | ✅ |

现在为您查询数据并展示结果...

第4步:查询数据后,以表格形式展示酒店推荐列表。

⚠️ 酒店列表必须使用表格,禁止纯文本列表

酒店推荐列表表格格式

## 🏨 [城市][区域]酒店推荐

找到 **X** 家酒店

| 方案 | 酒店 | 星级 | 评分 | 单晚价格 | X晚总价 | 预算内 | 推荐理由 |
|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---|
| **A** | 酒店名 | 星级 | X.X分 | ¥XXX起 | ¥XXX起 | ✅/⚠️ | 理由1+理由2 |
| **B** | 酒店名 | 星级 | X.X分 | ¥XXX起 | ¥XXX起 | ✅/⚠️ | 理由1+理由2 |
| **C** | 酒店名 | 星级 | X.X分 | ¥XXX起 | ¥XXX起 | ✅/⚠️ | 理由1+理由2 |

⚠️ 标注「⚠️」的酒店可能超出预算,建议查看含早房型具体价格。

---
回复 **A/B/C** 查看房型详情(含早餐价格)
回复 **A+B** 对比两家酒店

表格列说明

  • 方案:用字母 A/B/C 标注,方便用户选择
  • X晚总价:根据住宿晚数计算
  • 预算内:总价在预算内标 ✅,可能超出标 ⚠️
  • 推荐理由:从API返回的推荐理由中提取,简洁为主

第5步:查询结果<3家时,按 星级→预算→区域 自动放宽条件。

系统推荐逻辑:用户回复「系统推荐」→ 选取商务区+旅游区各1-2个代表性区域 → 每区2家 → 按区域分组展示。

更多酒店流程细节见 references/HOTEL_FLOW.md


步骤 3:数据查询

需求确认后调用对应脚本(静默执行,不显示"查询中"提示):

| 功能 | 命令 | |------|------| | 酒店搜索 | python3 scripts/hotel_api.py search <城市> <关键词> | | 酒店价格 | python3 scripts/hotel_api.py price <酒店ID> <入住日期> <退房日期> | | 酒店对比 | python3 scripts/hotel_api.py compare <酒店A_ID> <酒店B_ID> | | 快速预订 | python3 scripts/hotel_api.py book <酒店ID> <房型名> <入住人> <手机号> | | 航班搜索 | python3 scripts/flight_search.py <出发> <到达> <日期> | | 舱位价格 | python3 scripts/flight_price.py <航班ID> | | 机票下单 | python3 scripts/flight_order.py | | 订单详情 | python3 scripts/flight_order_detail.py <订单号> | | 改期 | python3 scripts/flight_endorse_search.pyflight_endorse_price.pyflight_endorse_apply.py | | 退票 | python3 scripts/flight_refund_fee.pyflight_refund_apply.py | | 取消 | python3 scripts/flight_cancel.py <订单号> |

步骤 4:展示结果

读取 references/OUTPUT_FORMAT.md 按对应模板输出。

核心规则

  • 飞书不支持 Markdown 表格语法,所有表格必须使用飞书消息卡片(Interactive Card)的 column_set 组件渲染
  • 使用 message 工具 action=send + card 参数发送卡片
  • 结构性数据用表格,描述性总结用纯文本(纯文本仍用卡片 markdown 元素)
  • 编号放入名称列:方案编号(A/B/C)直接放在酒店名/房型名内,取消独立编号列,避免折行错位
  • 长名称列加大权重:酒店名/房型名列 weight=5,其他列 weight=1~2
  • 短文本独立卡片:面积+窗户+取消政策合并为一张补充卡片紧随主表;窗户从主表移出
  • 含早推荐不重复取消政策:含双早推荐卡片不单独展示取消政策,需要时查看全部房型一览即可
  • 窗户显示规则:有窗显示「有窗」,无窗显示「无窗」,部分有窗显示「部分」(不加emoji)
  • 竞对表格带按钮:竞对价格对比表格每行增加「查看」链接按钮,点击跳转对应OTA平台
  • 数据源隔离:A/B 对比只能使用 compare API 返回的房型数据,禁止混入 price API 的额外房型;酒店详情(查看单酒店)才使用 price API 的全量房型数据
  • 数据完整性过滤:房型必须同时有「床型」和「面积」信息才展示,只有孤立房型名称而无床型/面积的条目视为脏数据,直接删除
  • 数据去重:同房型同名只保留最优价格(最低价/含早最低价),禁止重复展示
  • 酒店去重:同酒店同名只保留最低价条目
  • 展示数量一致性:头部显示「找到X家」必须与表格实际展示的酒店数完全一致,编号A-E对应5家,不展示超出编号的额外酒店
  • 推荐列表必须包含推荐理由,不得丢弃脚本返回的关键推荐理由
  • 房型详情中所有房型合为一张表格,禁止每个房型单独分段
  • 完整展示:必须展示脚本返回的所有模块(基本信息、评价、全部房型、含早推荐、价格对比、竞对对比),不得省略任何模块
  • 卡片大小限制约15KB,超出时拆分为多条卡片发送
  • 价格字段原样输出,不做转换
  • 飞书卡片不支持 emoji:用文字替代或用 <font color='orange'>文字</font> 彩色标注
  • 加粗限制**加粗** 中间不能有表情符号或中文标点

🔐 认证

统一认证(一次验证,机票+酒店通用):

python3 scripts/unified_auth.py send <手机号>
python3 scripts/unified_auth.py verify <手机号> <验证码>
python3 scripts/unified_auth.py status
python3 scripts/unified_auth.py clear

认证文件:~/.fbt-unified-auth.json(优先) > ~/.fbt_auth.json / ~/.fbt-auth.json(兼容旧版)


⚠️ 注意事项

  1. PII安全:乘客信息仅在预订时发送,不记录日志
  2. 强制确认:预订前必须获取入住人/乘客信息;退票前必须确认退票费用
  3. 数据真实性:所有数据来自API,不得编造
  4. 自动放宽:搜索结果<3家时,按 星级→预算→区域 顺序放宽条件

📁 文件结构

fbt-travel/
├── SKILL.md                  # 本文件(核心流程)
├── skill.json
├── requirements.txt
├── scripts/                  # 功能脚本(auth, hotel, flight, common 等)
└── references/               # 详细参考文档(按需读取)
    ├── HOTEL_FLOW.md         # 酒店完整流程
    ├── FLIGHT_FLOW.md        # 机票完整流程
    ├── OUTPUT_FORMAT.md      # 输出格式模板
    ├── HOTEL_API.md          # API规范
    └── INTERACTION_FLOW.md   # 交互流程

分贝通 · 让企业差旅更简单