---
name: rollinggo-hotel-booking
version: "1.1.1"
repository: "https://github.com/RollingGo-AI/rollinggo-hotel-skill-CN"
description: RollingGo 酒店搜索与预订助手，通过调用 RollingGo 酒店服务接口实现酒店查询到下单预订全流程。支持场景：① 按城市/景点/地铁站/机场等地点搜索酒店 ② 按星级、预算、标签（泳池/含早/亲子/宠物友好等）筛选 ③ 查询指定酒店的实时房型与价格 ④ 对比多家酒店 ⑤ 引导用户完成预订。触发词：找酒店、订酒店、搜酒店、酒店推荐、酒店查询、附近酒店、五星酒店、民宿、度假村、查房价、看房型、入住、住哪、住宿、rollinggo、旅游住宿、出差住宿、亲子酒店、带泳池的酒店、含早餐酒店。
metadata:
  {
    "openclaw": {
      "emoji": "🏨",
      "skillKey": "rollinggo-hotel-booking",
      "requires": {
        "anyBins": ["rgh", "npx", "node", "python", "python3", "curl", "wget"]
      },
      "install": [
        {
          "id": "node",
          "kind": "node",
          "package": "@rollinggo/hotel@latest",
          "bins": ["rgh"],
          "label": "Install @rollinggo/hotel (npm)"
        },
        {
          "id": "python",
          "kind": "exec",
          "command": "python scripts/install.py",
          "label": "Install rgh standalone binary (python)"
        }
      ]
    }
  }
---

# RollingGo 酒店搜索与预订 Skill

## 版本检查
> - **每日检查**：若当前目录下的 `.version_check` 不存在或记录日期非今天，静默请求远端 `SKILL.md`（地址拼接规则：将元数据中的 `{repository}` 域名替换为 `raw.githubusercontent.com`，并在末尾追加 `/main/skills/{name}/SKILL.md`）对比 `version` 字段。若远端有更新，在回复开头提示用户更新。无论成败，均将今日日期 `YYYY-MM-DD` 写入 `.version_check`。
> - **更新命令**：`请运行 npx skills update {name} 更新技能包`。

## 安装

如果本地环境未安装 `rgh` 命令，可以通过以下三种方式之一进行安装：

**方式一：通过 npm 安装（推荐）**
如果环境中有 Node.js 和 npm，请执行：
```bash
npm install -g @rollinggo/hotel@latest
```

**方式二：通过 Python 自动脚本安装（免 Node.js 环境）**
如果环境中有 Python，可以直接在 Skill 目录下运行我们提供的自动化安装脚本，它将自动检测您的操作系统并下载最新版的 `rgh` 独立二进制程序到本地 `bin` 文件夹：
```bash
python scripts/install.py
```

**方式三：手动下载独立可执行文件（免 Node/Python 环境）**
如果环境中既没有 npm 也没有 Python，请从以下 Release 页面下载对应的单文件程序（Windows: `rgh-win.exe` / `rgh-windows.exe`, Mac: `rgh-macos`, Linux: `rgh-linux`）：
`https://github.com/RollingGo-AI/oauth-hotel-cli/releases/latest`

下载后将其重命名为 `rgh`（Windows下为 `rgh.exe`），赋予执行权限，并放入系统环境变量 PATH 或技能目录的 `bin` 文件夹中。

**⚠️ 自动升级拦截原则：**
CLI 工具内置了版本检测。当你在执行任何 `rgh` 命令时，如果控制台输出中出现 `📦 有新版本可用！` 或 `运行以下命令更新` 的提示，**你必须立即暂停当前操作，先使用上述三种方式之一将工具升级到最新版，升级成功后再重新执行刚才中断的命令。** 这样可避免由于服务端接口过期而导致的预订失败。

---

> ⚠️ **输出规范**：
> 1. **严禁向用户展示任何技术细节**，包括但不限于：工具名（如 `search-hotels`、`hotel-detail`）、JSON 字段名（如 `hotelId`、`ratePlanId`、`referenceNo`）、命令行内容、技术参数。
> 2. **只展示用户关心的信息**：酒店名称、星级、价格、距离、核心设施、标签、预订链接。
> 3. **结果必须格式化展示**，每家酒店独占一个卡片，关键信息换行分隔，禁止堆砌在一行。
> 4. **价格说明**：搜索结果中的价格为参考展示价，实际下单价以价格确认为准，展示时注明"参考价"。
> 5. **登录授权**：用户通过 Agent 对话时看不到终端输出，执行 `rgh login` 后必须从输出中提取授权链接并回复给用户，不要展示二维码文本。

## When to Use

用户涉及酒店住宿相关的任何意图时均应触发本 Skill，包括但不限于以下场景：

**搜索与发现**：
- 按地点找酒店："帮我找北京三里屯附近酒店"、"三亚有什么好酒店"、"西湖旁边住宿推荐"
- 按条件筛选："五星酒店"、"带泳池的酒店"、"含早餐的住宿"、"亲子酒店"、"宠物友好酒店"
- 按预算筛选："500块以内的酒店"、"经济实惠的住宿"、"豪华酒店推荐"
- 按品牌筛选："希尔顿"、"万豪"、"亚朵"、"全季"

**查询与对比**：
- 查房价："杭州酒店多少钱一晚"、"这个酒店什么价格"
- 看房型："有什么房型"、"大床房有没有"、"家庭房推荐"
- 比较住宿："帮我对比一下这两家酒店"、"哪个更划算"
- 了解设施："有没有泳池"、"离地铁站多远"、"停车方便吗"

**预订与订单**：
- 预订酒店："帮我订这家酒店"、"我要下单"、"预订一间房"
- 查询订单："我的订单"、"之前订的酒店"、"订单状态"

**触发词覆盖**：
找酒店、订酒店、搜酒店、酒店推荐、酒店查询、附近酒店、五星酒店、民宿、度假村、查房价、看房型、入住、住哪、住宿、出差住宿、旅游住宿、亲子酒店、带泳池的酒店、含早餐酒店、商务酒店、情侣酒店、温泉酒店、海景房、江景房。

## When NOT to Use

- 用户询问机票、火车票、租车、景点门票等非住宿类旅行需求
- 用户只是闲聊旅游目的地，没有明确住宿意图
- 用户已明确表示"不用订"、"只是问问"

---

## 安全门控

> ⚠️ 酒店预订是**真实消费操作**：

1. **强制两步确认**：先展示房型和价格，等用户明确选择房型并确认后才进行价格锁定和下单。
2. **信息完整性**：下单前必须确认入住人姓名、邮箱（电话号码将通过 OAuth 默认获取，无需让用户填写参数）。
3. **价格确认时效**：`referenceNo` 有效期约 15-30 分钟，过期需重新调用价格确认。

---

## 工作流程

**Step 0：登录授权检查**（首次使用或 Token 失效时执行）

1. 执行 `rgh whoami` 检查登录状态：
   - **输出 `✅ 已登录`** → 直接进入 Step 1
   - **输出 `❌ 未登录`** → 执行 `rgh login`，进入授权流程

2. 授权流程：

   > ⚠️ **`rgh login` 必须以异步/后台模式运行**（如 `WaitMsBeforeAsync=2000`），同步执行会永久卡死线程！

   从后台输出中提取 `https://rollinggo.store/s/xxx` 格式或者`原始oauth格式`的授权链接，回复给用户：

   ```
   请点击以下链接完成授权：[点击授权](https://rollinggo.store/s/xxx)
   授权成功后请告诉我，我将继续为您预订。
   ```

   用户确认授权成功后进入 Step 1。

**Step 1：信息收集**（静默判断，不打断用户）

从对话中提取以下信息，能推断的直接用，缺关键信息再追问：

| 信息 | 是否必须 | 默认值 |
|------|---------|--------|
| 目的地（城市/景点/地址） | ✅ 必须 | 无，需追问 |
| 入住日期 | 建议有 | 明天 |
| 入住晚数 | 建议有 | 1 晚 |
| 成人数 | 可选 | 2 人 |
| 星级偏好 | 可选 | 不限 |
| 预算上限 | 可选 | 不限 |
| 特殊需求（标签） | 可选 | 无 |

目的地是唯一必须确认的信息。其他信息缺失时使用默认值，不要逐一追问。

**Step 2：获取标签字典**（按需执行）

用户提到特定设施或特色（如"带泳池"、"含早餐"、"亲子"、"宠物"）时，先执行：

```bash
rgh hotel-tags
```

从返回结果中找到精确的标签名称，再用于搜索。常见对应关系：

| 用户说法 | 常见标签名 |
|---------|-----------|
| 带泳池、有游泳池 | 户外泳池 / 室内恒温泳池 |
| 含早餐、有早餐 | 含早餐 |
| 亲子、带孩子 | 亲子友好 |
| 宠物友好 | 宠物友好 |
| 免费停车 | 免费停车场 |
| 不要某类型 | 对应标签 |
| 必须有某设施 | 对应标签（硬过滤） |

**Step 3：搜索酒店**

调用 `rgh search-hotels`，将用户需求转化为命令行参数：

```bash
rgh search-hotels \
  --origin-query "<用户原始表达>" \
  --place "<地点名称>" \
  --place-type "<类型>" \
  [--check-in-date YYYY-MM-DD] [--stay-nights N] \
  [--star-ratings min,max] \
  [--preferred-brand "品牌名"] \
  [--preferred-tag "标签名"] [--required-tag "标签名"] \
  [--max-price-per-night N] \
  --size 5
```

**placeType 选择规则**（必须精确匹配）：

| 用户描述 | --place-type |
|---------|-------------|
| 城市名（北京、三亚、曼谷） | 城市 |
| 机场（首都机场、浦东机场） | 机场 |
| 景点/地标（外滩、西湖、迪士尼） | 景点 |
| 火车站（虹桥站、北京南站） | 火车站 |
| 地铁站 | 地铁站 |
| 酒店名称 | 酒店 |
| 区/县/商圈（亚龙湾、朝阳区） | 区/县 |
| 具体街道地址 | 详细地址 |

**搜索结果展示模板**（每家酒店一个卡片）：
*(【极其重要】：你必须使用标准的 Markdown 图片语法 `![alt](url)` 来渲染 imageUrl，且必须将图片展示在模板末尾。若 imageUrl 中包含未编码的空格，需手动将空格替换为 `%20`，或使用尖括号将其包裹如 `![alt](<url>)`，否则会导致宿主平台无法渲染图片！绝对禁止使用 HTML `<img>` 标签，绝对禁止使用纯文本 URL！)*

```markdown
🏨 {酒店名称}
⭐ {星级}星  *(仅当返回了 distanceInMeters 字段时展示：📍 距{搜索地点}{距离}米)*
💰 参考价 ¥{最低价}/晚
🏷️ {标签1} · {标签2} · {标签3}
🔗 [查看详情 & 预订]({bookingUrl})
![{酒店名称}]({imageUrl})
```

返回 3-5 家酒店后，询问用户："想了解哪家的详细房型和价格？"

**Step 4：查询房型与实时价格**（用户选定酒店后）

从搜索结果中提取 `hotelId`，调用：

```bash
rgh hotel-detail \
  --hotel-id <hotelId> \
  --check-in-date <入住日期> \
  --check-out-date <离店日期> \
  --adult-count <成人数> \
  --room-count <房间数>
```

**房型展示模板**（每个房型一条）：

```
🛏️ {房型中文名}（{床型描述}）
💰 总价 ¥{totalPrice}（¥{均价}/晚）  剩余 {inventoryCount} 间
📋 取消政策：{取消政策描述}
```

展示 3-5 个推荐房型后，提供预订链接：
"如需预订，可点击 [前往预订页]({bookingUrl}) 完成下单。"

**Step 5：价格确认与下单**（用户选定房型后）

1. 调用 `rgh price-confirm` 锁定价格（获取 `referenceNo`）。注意参数是 `--rooms` 和 `--adults`：

```bash
rgh price-confirm \
  --hotel-id <hotelId> \
  --rate-plan-id <ratePlanId> \
  --rooms <房间数> \
  --check-in-date <入住日期> \
  --check-out-date <离店日期> \
  --adults <成人数>
```

2. 收集联系人信息（姓名拼音、邮箱）后，调用 `rgh book` 创建订单：

```bash
rgh book \
  --reference-no "<上一步获取的referenceNo>" \
  --first-name "<拼音/英文名>" \
  --last-name "<拼音/英文姓>" \
  --email "<邮箱>"
```

3. 从结果中提取 `alipayUrl` 或其他支付链接返回给用户。

**待支付订单展示模板**：
*(【极其重要】：绝不能臆造或编造支付方式（如“自动识别环境，支持支付宝或微信”）。必须严格按照以下模板输出，绝不允许自行添加任何关于支付环境或支付方式的说明！)*

```
📝 订单已生成，等待支付！
确认号：**{orderNo}**
酒店：{酒店名}
房型：{房型名}
入住：{入住日期} | 离店：{离店日期}
总价：¥{价格}
📋 取消政策：{取消政策描述}
💳 请在30分钟内完成支付：{支付链接}
```

**Step 6：查询订单**（用户询问时）

```bash
rgh orders
```

展示订单列表时，请清晰提取出：**酒店名、入离日期、订单状态、总价**，如果是待支付状态，附上继续支付的链接。

---

## 结果不理想时的降级策略

按以下顺序放宽条件重试：
1. 去掉 `--star-ratings` 限制
2. 增大搜索范围：加 `--distance-in-meter 10000`
3. 将 `--required-tag` 改为 `--preferred-tag`
4. 增加返回数量：`--size 10`
5. 去掉所有标签限制，只保留地点和日期

---

## 关键规则

- **地点和类型要匹配**："上海外滩"配 `景点`，不是 `城市`；"北京"配 `城市`
- **价格是参考价**：搜索结果的价格不是实时锁定价，展示时注明"参考价"
- **bookingUrl 直接可用**：返回的预订链接可直接给用户点击跳转
- **不要暴露 hotelId**：内部 ID 不展示给用户，只用于内部调用
- **多家对比**：用户要对比时，可同时展示多家的卡片，突出差异点（价格/距离/设施）

---

## 详细参考文档

- [references/cli-params.md](references/cli-params.md) — CLI 命令完整参数规范
