# Fb Hotel Skill

> 分贝通酒店预定助手，实时查询搜索酒店、展示酒店列表、查询酒店房型、展示房型产品和报价、预定酒店、查看订单、取消订单、查看酒店基础信息和酒店评论信息。

- Skill: `leoyeai-openclaw-master-skills/fb-hotel-skill` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add leoyeai-openclaw-master-skills/fb-hotel-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leoyeai-openclaw-master-skills/fb-hotel-skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: LeoYeAI (https://skillmd.com/u/leoyeai-openclaw-master-skills)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/leoyeai-openclaw-master-skills/fb-hotel-skill

---

# 分贝通酒店预定助手 (fb-hotel-skill)

## 技能描述

分贝通酒店预定助手，实时查询搜索酒店、展示酒店列表、查询酒店房型、展示房型产品和报价、预定酒店、查看订单、取消订单、查看酒店基础信息和酒店评论信息。

---

## 🔐 鉴权流程（必须先完成）

**重要**：使用任何功能前，用户必须先完成鉴权流程。鉴权成功后获得的 `identity_code`（access-token）会自动保存在 `~/.fbt-auth.json` 文件中，新会话会自动沿用。

### 鉴权步骤

#### 步骤 1：发送验证码
```
用户回复: 分贝通登录
AI: 请输入您的手机号以接收验证码（例如：13800138000）

用户输入: 13800138000
AI: ✅ 验证码已发送到 138****8000，请在5分钟内输入验证码
```

**API调用**：
```python
from scripts.fb_hotel_api import send_verification_code

result = send_verification_code("13800138000")
# 成功响应: {"code": 0, "msg": "success", "data": true}
```

#### 步骤 2：验证并获取 identity_code
```
用户输入: 1234
AI: 🎉 认证成功！身份编码已保存到 ~/.fbt-auth.json，有效期90天
    现在可以使用分贝通企业接口了
```

**API调用**：
```python
from scripts.fb_hotel_api import verify_and_get_token

success, result = verify_and_get_token("13800138000", "1234")
if success:
    access_token = result  # fbsk-xxx
    # token 已自动保存到 ~/.fbt-auth.json
else:
    print(f"验证失败: {result}")
```

#### 步骤 3：自动注入（后续调用）

后续所有 API 调用会自动从 `~/.fbt-auth.json` 读取 token：

```python
from scripts.fb_hotel_api import FbHotelApi

# 无需传入 token，自动从文件读取
api = FbHotelApi()
result = api.search_hotel_list(city_name="北京市", keywords="国贸")
```

### Token 存储管理

| 文件 | 路径 | 说明 |
|-----|------|------|
| 鉴权文件 | `~/.fbt-auth.json` | 保存 identity_code 和手机号 |

**文件格式**：
```json
{
  "identity_code": "fbsk-2db251f6c8d74ce69ae3dcb82ed1055b",
  "mobile": "138****8000",
  "created_at": "2026-03-25T09:48:00",
  "updated_at": "2026-03-25T09:48:00"
}
```

### API 函数

```python
from scripts.fb_hotel_api import (
    save_auth_token,    # 保存 token
    load_auth_token,    # 读取 token
    get_auth_info,      # 获取完整认证信息
    clear_auth_token    # 清除认证信息
)

# 保存 token
save_auth_token("fbsk-xxx", "13800138000")

# 读取 token
token = load_auth_token()

# 获取完整信息
info = get_auth_info()  # {"identity_code": "...", "mobile": "..."}

# 清除认证
clear_auth_token()
```

### 接口鉴权说明

| skill_type | 接口名称 | 需要认证 |
|------------|---------|---------|
| `getMobileCaptcha` | 获取手机号验证码 | ❌ 否 |
| `getIdentityCode` | 获取身份编码 | ❌ 否 |
| `searchHotelList` | 搜索酒店列表 | ✅ 是 |
| `queryHotelPrice` | 查询酒店价格详情 | ✅ 是 |
| `queryHotelDetail` | 查询酒店扩展详情 | ✅ 是 |
| `queryHotelComment` | 查询酒店评论 | ✅ 是 |
| `createOrder` | 酒店下单 | ✅ 是 |
| `cancelOrder` | 取消订单 | ✅ 是 |
| `queryOrder` | 查询订单 | ✅ 是 |

---

⚠️ 【重要约束】
- 必须调用 `scripts/fb_hotel_api.py` 中的函数获取数据
- 禁止自行编造酒店信息、价格或评论
- 接口返回什么数据就展示什么，不要修改
- **首次使用必须先完成分贝通企业认证**

---

## 对接信息

### 环境配置

| 环境 | 域名 |
|-----|------|
| **FAT 测试环境** | `https://app-gate.fenbeitong.com` |
| **线上环境** | `https://app-gate.fenbeitong.com` |

### 统一接口入口

**所有接口统一使用同一入口**：
```
POST /business/hotel/open/push/skill/access
```

通过 `skill_type` 参数区分不同操作。

### 请求格式

**Headers**:
```
Content-Type: application/json
access-token: fbsk-xxx  （认证类接口除外）
```

**Body**:
```json
{
    "skill_type": "searchHotelList",
    // 其他参数...
}
```

---

## 核心接口列表

### 一、认证类接口

#### 1. 获取手机号验证码

**skill_type**: `getMobileCaptcha`

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"getMobileCaptcha",
    "mobile":"18301187051"
}'
```

**响应示例**：
```json
{
    "request_id": "nQabT9pHt5u5m0mA",
    "code": 0,
    "msg": "success",
    "data": true
}
```

#### 2. 获取身份编码

**skill_type**: `getIdentityCode`

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"getIdentityCode",
    "mobile":"18301187051",
    "captcha":"1234"
}'
```

**响应示例**：
```json
{
    "request_id": "oKXv9eCYuFIXoxRn",
    "code": 0,
    "msg": "success",
    "data": {
        "identity_code": "fbsk-2db251f6c8d74ce69ae3dcb82ed1055b"
    }
}
```

---

### 二、酒店查询接口

#### 1. 搜索酒店列表

**skill_type**: `searchHotelList`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| city_name | string | 是 | 城市名称（如"北京市"） |
| keywords | string | 否 | 关键词（用户输入原样传递） |
| hotel_name | string | 否 | 酒店名称 |
| page_index | int | 否 | 页码，默认1 |
| page_size | int | 否 | 每页数量，默认5 |

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'access-token: fbsk-2db251f6c8d74ce69ae3dcb82ed1055b' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"searchHotelList",
    "city_name":"北京市",
    "keywords":"预订北京国贸附近1公里的酒店",
    "page_index":1,
    "page_size":5
}'
```

**响应字段**：
| 字段 | 说明 |
|-----|------|
| hotel_id | 酒店ID |
| name | 酒店名称 |
| star_level_name | 星级类型（高档型、豪华型等） |
| address | 地址 |
| district_name | 区域 |
| business_zone_name | 商圈 |
| score | 评分 |
| min_price | 最低价 |
| main_logo | 酒店图片 |

#### 2. 查询酒店价格详情

**skill_type**: `queryHotelPrice`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| hotel_id | string | 是 | 酒店ID |
| check_in_date | string | 是 | 入住日期 yyyy-MM-dd |
| check_out_date | string | 是 | 退房日期 yyyy-MM-dd |
| payment_type | string | 否 | 支付方式 PP=预付 SP=现付 |
| nation_type | int | 否 | 1=国内 2=国际 |

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'access-token: fbsk-2db251f6c8d74ce69ae3dcb82ed1055b' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"queryHotelPrice",
    "nation_type":1,
    "payment_type":"PP",
    "hotel_id":"5a39df2fbbfdc4732360eaa9",
    "check_in_date":"2026-03-27",
    "check_out_date":"2026-03-28"
}'
```

**响应字段**：
| 字段 | 说明 |
|-----|------|
| hotel | 酒店基本信息 |
| rooms[] | 房型列表 |
| rooms[].room_id | 房型ID |
| rooms[].room_name | 房型名称 |
| rooms[].bed_type | 床型 |
| rooms[].window_type | 窗户类型 |
| rooms[].area | 面积 |
| rooms[].status | 是否可预订 |
| rooms[].plan_list[] | 产品列表 |
| plan_list[].plan_id | 产品ID |
| plan_list[].plan_name | 产品名称 |
| plan_list[].breakfast | 早餐 |
| plan_list[].cancel_type | 取消政策类型 |
| plan_list[].cancel_rule | 取消政策详情 |
| plan_list[].total_price | 总价 |
| plan_list[].status | 是否可预订 |

#### 3. 查询酒店扩展详情

**skill_type**: `queryHotelDetail`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| hotel_id | string | 是 | 酒店ID |

#### 4. 查询酒店评论

**skill_type**: `queryHotelComment`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| hotel_id | string | 是 | 酒店ID |
| page_index | int | 否 | 页码 |
| page_size | int | 否 | 每页数量 |

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'access-token: fbsk-2db251f6c8d74ce69ae3dcb82ed1055b' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"queryHotelComment",
    "hotel_id":"8502475",
    "page_size":5
}'
```

---

### 三、订单接口

#### 1. 酒店下单

**skill_type**: `createOrder`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| nation_type | int | 是 | 1=国内 2=国际 |
| payment_type | string | 是 | PP=预付 SP=现付 |
| hotel_id | string | 是 | 酒店ID |
| check_in_date | string | 是 | 入住日期 |
| check_out_date | string | 是 | 退房日期 |
| room_id | string | 是 | 房型ID |
| plan_id | string | 是 | 产品ID |
| total_price | float | 是 | 总价 |
| room_count | int | 是 | 房间数 |
| contact | object | 是 | 联系人信息 |
| guestList1 | array | 是 | 入住人列表（二维数组） |

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'access-token: fbsk-2db251f6c8d74ce69ae3dcb82ed1055b' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"createOrder",
    "nation_type":1,
    "payment_type":"PP",
    "hotel_id":"5a39df2fbbfdc4732360eaa9",
    "check_in_date":"2026-03-27",
    "check_out_date":"2026-03-28",
    "room_id":"7617d7bbb3a94537a58bb3d33108b429",
    "plan_id":"69c23ae4e37c7d156e3e0c01",
    "total_price":280,
    "room_count":1,
    "contact":{
        "name":"周聪",
        "phone":"18301187051"
    },
    "guestList1":[
        [
            {
                "name":"周聪",
                "phone":"13126525502"
            }
        ]
    ]
}'
```

**重要**：`guestList1` 参数必须为二维数组格式！

#### 2. 取消订单

**skill_type**: `cancelOrder`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| order_id | string | 是 | 订单ID |
| cancel_reason | string | 否 | 取消原因 |

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'access-token: fbsk-2db251f6c8d74ce69ae3dcb82ed1055b' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"cancelOrder",
    "order_id": "69c23b67e37c7d156e3e0c1b",
    "cancel_reason":"取消原因"
}'
```

#### 3. 查询订单

**skill_type**: `queryOrder`

**请求参数**：
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| order_id | string | 是 | 订单ID |

**请求示例**：
```bash
curl --location 'https://app-gate.fenbeitong.com/business/hotel/open/push/skill/access' \
--header 'access-token: fbsk-2db251f6c8d74ce69ae3dcb82ed1055b' \
--header 'Content-Type: application/json' \
--data '{
    "skill_type":"queryOrder",
    "order_id": "69c23b67e37c7d156e3e0c1b"
}'
```

---

### 四、收银台支付

订单创建成功后，通过以下链接引导用户完成支付：

| 类型 | 链接格式 |
|-----|---------|
| 立即支付 | `{域名}/business/hotel/open/push/redirect?orderId={order_id}&type=0&token={access_token}` |
| 查看订单 | `{域名}/business/hotel/open/push/redirect?orderId={order_id}&type=1&token={access_token}` |

**FAT环境示例**：
- 支付：`https://app-gate.fenbeitong.com/business/hotel/open/push/redirect?orderId={order_id}&type=0&token=fbsk-xxx`
- 订单：`https://app-gate.fenbeitong.com/business/hotel/open/push/redirect?orderId={order_id}&type=1&token=fbsk-xxx`

---

## 使用流程

### 1. 酒店搜索

**触发条件**：用户输入「酒店搜索/订酒店/找酒店/搜酒店」+ 城市/关键词

**步骤**：
1. 检查用户认证状态
2. 调用 `search_hotel_list()` 获取酒店列表
3. 格式化展示酒店列表（表格形式）

**展示格式**：
```
🏨 北京国贸附近酒店

| 序号 | 酒店名称 | 星级 | 区域 | 最低价 |
|:---:|---------|:---:|------|---:|
| 1 | 北京建国饭店 | 高档型 | 朝阳区 | ¥572 |
| 2 | 北京共享际5L饭店 | 高档型 | 朝阳区 | ¥712 |

💡 回复序号查看房型价格，如"1"
💡 回复"序号-详情"查看酒店信息和评论，如"1-详情"
```

### 2. 查看房型价格

**触发条件**：用户回复序号（如"1"）

**步骤**：
1. 获取酒店ID（从之前的搜索结果）
2. 调用 `query_hotel_price()` 获取房型和产品
3. 过滤 status=false 的房型和产品
4. 展示前5个房型，每个房型展示前5个产品

**展示格式**：
```
🏨 汉庭酒店(北京长虹桥店)
📍 农展馆南里12号院5号楼 | ⭐4.8分 | 经济型
📅 入住：2026-03-27 → 退房：2026-03-28

**房型1：测试房型**
床型：2张1.80m大床 | 窗户：有窗 | 面积：22㎡
| 序号 | 价格 | 早餐 | 取消政策 | 取消详情 |
|:---:|---:|:---:|:---:|---|
| 1-1 | ¥1 | 单早 | ✅限时取消 | 3月26日 12:00前免费取消... |

💡 回复"房型序号-产品序号"预订，如"1-1"
```

### 3. 创建订单

**触发条件**：用户回复"房型序号-产品序号"（如"1-1"）

**步骤**：
1. 收集入住人信息（姓名、手机号）
2. 构建请求参数（注意 guestList1 为二维数组）
3. 调用 `create_order()` 创建订单
4. 展示订单信息和支付链接

**展示格式**：
```
✅ 订单创建成功！

🏨 订单号：69c23b67e37c7d156e3e0c1b
📅 入住：2026-03-27 → 退房：2026-03-28
🛏️ 房型：测试房型
💰 价格：¥280
📋 最晚取消时间：2026-03-26 12:00:00

🔗 [立即支付](https://app-gate.fenbeitong.com/...)
🔗 [查看订单详情](https://app-gate.fenbeitong.com/...)
```

---

## Python API 参考

```python
from scripts.fb_hotel_api import FbHotelApi, send_verification_code, verify_and_get_token

# 初始化（使用默认token或指定token）
api = FbHotelApi(access_token="fbsk-xxx")

# 发送验证码
result = send_verification_code("13800138000")

# 验证并获取token
success, token = verify_and_get_token("13800138000", "1234")

# 搜索酒店
result = api.search_hotel_list(
    city_name="北京市",
    keywords="国贸附近",
    page_size=5
)

# 查询酒店价格
result = api.query_hotel_price(
    hotel_id="5a39df2fbbfdc4732360e860",
    check_in_date="2026-03-27",
    check_out_date="2026-03-28"
)

# 查询酒店扩展详情
result = api.query_hotel_detail(hotel_id="5a39df2fbbfdc4732360e860")

# 查询酒店评论
result = api.query_hotel_comment(hotel_id="8502475", page_size=5)

# 创建订单
result = api.create_order(
    hotel_id="5a39df2fbbfdc4732360eaa9",
    room_id="7617d7bbb3a94537a58bb3d33108b429",
    plan_id="69c23ae4e37c7d156e3e0c01",
    check_in_date="2026-03-27",
    check_out_date="2026-03-28",
    total_price=280,
    contact={"name": "张三", "phone": "13800138000"},
    guest_list=[[{"name": "张三", "phone": "13800138000"}]]
)

# 查询订单
result = api.query_order(order_id="69c23b67e37c7d156e3e0c1b")

# 取消订单
result = api.cancel_order(order_id="69c23b67e37c7d156e3e0c1b", cancel_reason="不想要了")

# 格式化输出
print(api.format_hotel_list(result))
print(api.format_hotel_price(result, "2026-03-27", "2026-03-28"))
```

---

## 📝 格式化输出模块

**文件位置**：`scripts/formatter.py`

### 展示配置

| 配置项 | 默认值 | 说明 |
|-------|-------|------|
| HOTEL_LIST_LIMIT | 5 | 酒店列表展示数量 |
| ROOM_LIST_LIMIT | 5 | 房型展示数量 |
| PLAN_LIST_LIMIT | 5 | 每个房型展示的产品数量 |

### 格式化函数

```python
from scripts.formatter import (
    format_hotel_list,      # 酒店列表格式化
    format_hotel_rooms,     # 房型价格格式化
    format_order_result,    # 订单创建结果格式化
    format_trip_plan,       # 行程规划格式化
    format_order_confirmation,  # 订单确认格式化
    format_order_detail_full    # 完整订单详情格式化
)
```

### 展示字段规范

**酒店列表必须包含**：
- 序号、酒店名称、评分、星级、地址、最低价

**房型价格必须包含**：
- 序号、房型名称、床型、面积、窗户类型
- 价格、早餐、取消政策类型、取消详情

**订单详情必须包含**：
- 订单号、酒店信息、房型信息
- 床型、面积、窗户、早餐、价格
- 取消政策类型和详情
- **[立即支付]** 按钮（不是"查看订单详情"）

---

## 版本历史

| 版本 | 日期 | 变更说明 |
|-----|------|---------|
| 3.1.0 | 2026-03-25 | 新增格式化输出模块，固化展示逻辑 |
| 3.0.0 | 2026-03-25 | 统一接口入口，新增认证流程，重构API |
| 2.9.1 | 2026-03-20 | 修复订单创建问题 |
| 1.9.1 | 2026-03-15 | 新增酒店评论查询 |
