docs(im): 重写飞书/Telegram 接入指南,替换为真实操作截图
- 飞书:简化为「一键创建 OpenClaw 官方模板 + 配置自定义菜单 + 桌面端配对」的三步流程,新增 15 张实操截图 - Telegram:精简为「BotFather 取 Token + 桌面端填 Token + 配对」三步,新增 6 张截图 - 两份文档均保留命令别名、权限审批、环境变量等代码层信息,并同步 FAQ 到当前 adapter 实现 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@ -1,6 +1,6 @@
|
||||
# 飞书接入
|
||||
|
||||
> 飞书 Adapter 的实际接入说明,基于当前仓库代码。
|
||||
> 飞书 Adapter 的接入教程。官方已经提供了**预配好权限的模板机器人**,跟着下面几步点一点就能完成接入。
|
||||
|
||||
## 适用场景
|
||||
|
||||
@ -8,127 +8,91 @@
|
||||
|
||||
实现入口:`adapters/feishu/index.ts`
|
||||
|
||||
## 启动前准备
|
||||
## 1. 一键创建飞书机器人
|
||||
|
||||
### 1. 创建飞书应用
|
||||
直接打开下面的链接创建机器人——这是官方为 OpenClaw 提前配好所有权限(消息、事件、卡片回调等)的模板,省去手动配 scope 和事件订阅:
|
||||
|
||||
在飞书开放平台创建企业自建应用,拿到:
|
||||
👉 [立即创建飞书机器人](https://open.feishu.cn/page/openclaw?form=multiAgent)
|
||||
|
||||
- `App ID`
|
||||
- `App Secret`
|
||||

|
||||
|
||||
### 2. 配权限
|
||||
随便给你自己的机器人取一个名字,点击创建:
|
||||
|
||||
至少确认这些能力可用:
|
||||

|
||||
|
||||
- `im:message`
|
||||
- `im:message:send_as_bot`
|
||||
- `im:resource`
|
||||
创建成功后,把 **App ID** 和 **App Secret** 保存下来,接着去配置机器人菜单。
|
||||
|
||||
### 3. 配事件订阅
|
||||
## 2. 配置自定义菜单(/projects /new /clear)
|
||||
|
||||
当前实现使用飞书 WebSocket 长连接接事件,不需要公网回调地址。
|
||||
进入[飞书开发者后台](https://open.feishu.cn/app?lang=zh-CN),选择刚创建的机器人,进入机器人配置页:
|
||||
|
||||
需要注册的事件:
|
||||

|
||||
|
||||
- `im.message.receive_v1`
|
||||
- `card.action.trigger`
|
||||
进入「机器人菜单」开始配置:
|
||||
|
||||
### 4. 发布应用
|
||||

|
||||
|
||||
应用至少需要处于可用发布状态,否则 bot 无法正常收发消息。
|
||||
依次添加 3 个命令:
|
||||
|
||||
## 在 Desktop Webapp 里配置
|
||||
**/projects** — 切换最近使用的项目
|
||||
|
||||
打开 `Settings -> IM 接入 -> 飞书`,填写:
|
||||

|
||||
|
||||
- `App ID`
|
||||
- `App Secret`
|
||||
- `Encrypt Key`,按你的事件配置填写
|
||||
- `Verification Token`,按你的事件配置填写
|
||||
- `Allowed Users`,可选
|
||||
- `Streaming Card`
|
||||
**/new** — 开启新对话
|
||||
|
||||
配置结构示例:
|
||||

|
||||
|
||||
```json
|
||||
{
|
||||
"serverUrl": "ws://127.0.0.1:3456",
|
||||
"defaultProjectDir": "/Users/me/workspace/my-project",
|
||||
"feishu": {
|
||||
"appId": "cli_xxx",
|
||||
"appSecret": "xxx",
|
||||
"encryptKey": "",
|
||||
"verificationToken": "",
|
||||
"allowedUsers": ["ou_xxx"],
|
||||
"streamingCard": false
|
||||
}
|
||||
}
|
||||
```
|
||||
**/clear** — 清空上下文
|
||||
|
||||
环境变量也可覆盖配置文件:
|
||||

|
||||
|
||||
```bash
|
||||
export FEISHU_APP_ID="cli_xxx"
|
||||
export FEISHU_APP_SECRET="xxx"
|
||||
export FEISHU_ENCRYPT_KEY=""
|
||||
export FEISHU_VERIFICATION_TOKEN=""
|
||||
export ADAPTER_SERVER_URL="ws://127.0.0.1:3456"
|
||||
```
|
||||
三个都配好后点击保存:
|
||||
|
||||
## 启动
|
||||

|
||||
|
||||
```bash
|
||||
cd adapters
|
||||
bun install
|
||||
bun run feishu
|
||||
```
|
||||
最后点击「创建新版本并发布」让菜单生效:
|
||||
|
||||
## 首次配对
|
||||

|
||||
|
||||
飞书侧的配对和 Telegram 一样,都是走 Webapp 生成的全局配对码。
|
||||
**命令作用说明:**
|
||||
|
||||
流程:
|
||||
- `/projects`:列出最近使用的项目,支持切换当前会话绑定的目录
|
||||
- `/new`:开启新对话
|
||||
- `/clear`:清空当前会话上下文
|
||||
|
||||
1. 在 Desktop Webapp 里生成 6 位配对码
|
||||
2. 飞书私聊 bot
|
||||
3. 直接发送配对码
|
||||
4. `adapters/common/pairing.ts` 验证成功后,把当前 `open_id` 写进 `feishu.pairedUsers`
|
||||
## 3. 在 Claude Code Haha 桌面端填写
|
||||
|
||||
注意:
|
||||
### 3.1 填写 App ID / App Secret
|
||||
|
||||
- 当前实现把飞书用户标识存成 `open_id`
|
||||
- `allowedUsers` 也是按 `open_id` 比较
|
||||
- 码一次性使用,60 分钟过期
|
||||
打开桌面端 `设置 → IM 接入 → 飞书`,把前面拿到的两把钥匙填进去:
|
||||
|
||||
## 日常使用流程
|
||||

|
||||
|
||||
### 首次消息
|
||||
### 3.2 生成配对码
|
||||
|
||||
`adapters/feishu/index.ts` 处理逻辑:
|
||||
点击「生成配对码」按钮,得到 6 位码:
|
||||
|
||||
1. 通过长连接收到 `im.message.receive_v1`
|
||||
2. 提取文本内容
|
||||
3. 只接受 `p2p`
|
||||
4. 校验授权
|
||||
5. 没有 session 时:
|
||||
- 先尝试恢复 `adapter-sessions.json`
|
||||
- 否则按 `defaultProjectDir` 建 session
|
||||
- 如果没默认项目,则列最近项目让用户回复编号
|
||||

|
||||
|
||||
### 项目选择
|
||||

|
||||
|
||||
没有默认项目时,adapter 会调用 `GET /api/sessions/recent-projects`,然后在飞书里发编号列表。
|
||||
**记得点保存!!**
|
||||
|
||||
用户回复编号后:
|
||||
## 4. 飞书机器人与桌面端配对
|
||||
|
||||
- adapter 调 `POST /api/sessions`
|
||||
- 建立 `/ws/:sessionId` 连接
|
||||
- 把映射写入 `~/.claude/adapter-sessions.json`
|
||||
随便给刚才创建的机器人发送一条消息,按提示把上一步的 6 位配对码发给它:
|
||||
|
||||

|
||||
|
||||
看到配对成功提示后,就可以用飞书在手机上远程驱动桌面端 Claude Code Haha 了:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 支持的命令
|
||||
|
||||
飞书当前支持文本命令和中文别名:
|
||||
除菜单按钮外,飞书 adapter 还支持文本命令和中文别名:
|
||||
|
||||
- `/help` 或 `帮助`
|
||||
- `/status` 或 `状态`
|
||||
@ -139,57 +103,59 @@ bun run feishu
|
||||
|
||||
## 权限审批
|
||||
|
||||
飞书使用交互卡片,而不是 Telegram 的 inline button。
|
||||
|
||||
当 Claude 请求权限时:
|
||||
|
||||
1. adapter 构造 interactive card
|
||||
2. 用户点击允许/拒绝
|
||||
3. 飞书回调 `card.action.trigger`
|
||||
4. adapter 调用 `bridge.sendPermissionResponse(...)`
|
||||
当 Claude 请求敏感权限时,adapter 会在飞书里发送交互卡片,点击「允许 / 拒绝」即可把结果回传给桌面端。
|
||||
|
||||
## 返回消息的表现
|
||||
|
||||
飞书侧也支持流式更新,但渲染方式和 Telegram 不同:
|
||||
|
||||
- 普通文本通过 `post` 消息发送
|
||||
- 权限审批通过卡片发送
|
||||
- 流式内容优先 patch 同一条消息
|
||||
- 完成后按 30000 字左右分片
|
||||
|
||||
`streamingCard` 字段当前已经进入配置模型,但 `adapters/feishu/index.ts` 里实际消息渲染仍以文本 patch / card 为主,文档里不应把它写成一个已经成型的独立体验开关。
|
||||
## 启动 adapter
|
||||
|
||||
桌面端会自动把 adapter 作为 sidecar 拉起。如果你在本地开发,需要手动启动:
|
||||
|
||||
```bash
|
||||
cd adapters
|
||||
bun install
|
||||
bun run feishu
|
||||
```
|
||||
|
||||
## 环境变量覆盖(可选)
|
||||
|
||||
```bash
|
||||
export FEISHU_APP_ID="cli_xxx"
|
||||
export FEISHU_APP_SECRET="xxx"
|
||||
export ADAPTER_SERVER_URL="ws://127.0.0.1:3456"
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 一键创建后的机器人权限够用吗?
|
||||
|
||||
OpenClaw 官方模板已预配 `im:message`、`im:message:send_as_bot`、`im:resource`、`im.message.receive_v1`、`card.action.trigger` 等所有所需权限,**不需要再手动去配 scope 或事件订阅**。
|
||||
|
||||
### 收不到消息
|
||||
|
||||
优先检查:
|
||||
|
||||
- App ID / App Secret 是否正确
|
||||
- 应用是否已发布
|
||||
- 是否启用了 `im.message.receive_v1`
|
||||
- 是否启用了 `card.action.trigger`
|
||||
- 机器人是否已发布(菜单改完需要「创建新版本并发布」)
|
||||
- 是否真的是和 bot 的私聊,而不是群聊
|
||||
|
||||
### 权限按钮点了没反应
|
||||
|
||||
通常是 `card.action.trigger` 没配置好,或者事件订阅鉴权配置和本地 `encryptKey` / `verificationToken` 不匹配。
|
||||
通常是 `card.action.trigger` 没生效,重新在开发者后台发布一次版本即可。
|
||||
|
||||
### 一直提示未授权
|
||||
|
||||
优先检查:
|
||||
|
||||
- 配对码是否还在有效期
|
||||
- 发送的是不是当前有效码
|
||||
- `allowedUsers` 填的是不是 `open_id`
|
||||
- `feishu.pairedUsers` 里是否已写入当前用户
|
||||
- 配对码是否仍在 60 分钟有效期内
|
||||
- 发的是不是桌面端当前这一枚(重新生成后旧的立即失效)
|
||||
- `feishu.pairedUsers` 里是否已经写入当前 `open_id`
|
||||
|
||||
### 会话没恢复
|
||||
|
||||
检查:
|
||||
|
||||
- `~/.claude/adapter-sessions.json` 是否成功写入
|
||||
- Desktop server 里的 session 是否仍存在
|
||||
检查 `~/.claude/adapter-sessions.json` 是否能正常写入,以及 Desktop server 里的 session 是否仍存在。
|
||||
|
||||
## 源码入口
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Telegram 接入
|
||||
|
||||
> Telegram Adapter 的实际接入说明,基于当前仓库代码,而不是旧 README。
|
||||
> Telegram Adapter 的接入教程。找 BotFather 拿 Token,桌面端填完配对即可。
|
||||
|
||||
## 适用场景
|
||||
|
||||
@ -8,135 +8,62 @@ Telegram 方案适合个人私聊远程使用。当前实现只处理 `private c
|
||||
|
||||
实现入口:`adapters/telegram/index.ts`
|
||||
|
||||
## 启动前准备
|
||||
## 1. 创建 Telegram 机器人
|
||||
|
||||
### 1. 创建 Bot
|
||||
在 Telegram 里搜索官方账号 **@BotFather**:
|
||||
|
||||
在 Telegram 里找 `@BotFather`:
|
||||

|
||||
|
||||
1. 发送 `/newbot`
|
||||
2. 按提示创建 bot
|
||||
3. 拿到 `Bot Token`
|
||||
给它发送 `/newbot`:
|
||||
|
||||
### 2. 在 Desktop Webapp 里填写配置
|
||||

|
||||
|
||||
打开 `Settings -> IM 接入 -> Telegram`,填写:
|
||||
按提示走完三步:
|
||||
|
||||
- `Bot Token`
|
||||
- `Allowed Users`,可选
|
||||
- 全局 `Default Project`
|
||||
- **取一个机器人名称**,例如 `ClaudeCodeHaha机器人`
|
||||
- **取一个机器人用户名**,要求全英文字母,且必须以 `_bot` 结尾,例如 `jiang_cc_hah_bot`
|
||||
- 创建成功后,复制 BotFather 返回的 **Bot Token**
|
||||
|
||||
也可以直接写 `~/.claude/adapters.json`,但当前推荐从 Webapp 配。
|
||||

|
||||
|
||||
配置结构示例:
|
||||
## 2. 在 Claude Code Haha 桌面端填写
|
||||
|
||||
```json
|
||||
{
|
||||
"serverUrl": "ws://127.0.0.1:3456",
|
||||
"defaultProjectDir": "/Users/me/workspace/my-project",
|
||||
"telegram": {
|
||||
"botToken": "123456:ABC-DEF...",
|
||||
"allowedUsers": [123456789]
|
||||
}
|
||||
}
|
||||
```
|
||||
### 2.1 填写 Bot Token
|
||||
|
||||
环境变量优先级更高:
|
||||
打开桌面端 `设置 → IM 接入 → Telegram`,把上一步的 Bot Token 填进去:
|
||||
|
||||
```bash
|
||||
export TELEGRAM_BOT_TOKEN="123456:ABC-DEF..."
|
||||
export ADAPTER_SERVER_URL="ws://127.0.0.1:3456"
|
||||
```
|
||||

|
||||
|
||||
## 启动
|
||||
### 2.2 生成配对码
|
||||
|
||||
```bash
|
||||
cd adapters
|
||||
bun install
|
||||
bun run telegram
|
||||
```
|
||||
点击「生成配对码」按钮,拿到 6 位配对码后点击保存:
|
||||
|
||||
## 首次配对
|
||||

|
||||
|
||||
Telegram 侧的授权入口不再只依赖 `allowedUsers`。
|
||||
## 3. 机器人与桌面端配对
|
||||
|
||||
当前真实逻辑:
|
||||
随便给刚才创建的机器人发送一条消息,按提示输入配对码。看到下面的配对成功提示,就可以从手机 Telegram 远程驱动桌面端 Claude Code Haha 了:
|
||||
|
||||
1. 在 Desktop Webapp 里生成配对码
|
||||
2. 去 Telegram 私聊 bot
|
||||
3. 把那 6 位码直接发给 bot
|
||||
4. adapter 调用 `tryPair(...)`
|
||||
5. 配对成功后,把当前 Telegram user 写进 `telegram.pairedUsers`
|
||||
|
||||
特点:
|
||||
|
||||
- 配对码 60 分钟过期
|
||||
- 配对成功后立即失效
|
||||
- 和飞书共用同一枚全局配对码
|
||||
- 连续输错有速率限制
|
||||
|
||||
## 日常使用流程
|
||||
|
||||
### 首次消息
|
||||
|
||||
`adapters/telegram/index.ts` 的流程是:
|
||||
|
||||
1. 校验是否私聊
|
||||
2. 去重
|
||||
3. 校验是否已授权
|
||||
4. 没有 session 时:
|
||||
- 优先恢复 `adapter-sessions.json` 里的旧 session
|
||||
- 否则用 `defaultProjectDir` 创建新 session
|
||||
- 如果没配默认项目,则拉最近项目列表让你选
|
||||
|
||||
### 项目选择
|
||||
|
||||
当没有默认项目时,bot 会调用 `GET /api/sessions/recent-projects`,返回最近项目列表,并要求你回复编号。
|
||||
|
||||
选中后:
|
||||
|
||||
- adapter 用 `POST /api/sessions` 创建 session
|
||||
- 把 `chatId -> sessionId -> workDir` 写进 `~/.claude/adapter-sessions.json`
|
||||
- 后续消息继续复用
|
||||

|
||||
|
||||
## 支持的命令
|
||||
|
||||
### `/start`
|
||||
|
||||
显示帮助和可用命令。
|
||||
|
||||
### `/projects`
|
||||
|
||||
切换项目,重新显示最近项目列表。
|
||||
|
||||
### `/status`
|
||||
|
||||
查看当前会话的项目、模型、运行状态和任务摘要。
|
||||
|
||||
### `/clear`
|
||||
|
||||
清空当前会话上下文,保留当前项目绑定。
|
||||
|
||||
### `/new`
|
||||
|
||||
清空当前 chat 绑定的 session,并重新选择项目。
|
||||
|
||||
### `/help`
|
||||
|
||||
显示当前可用命令。
|
||||
|
||||
### `/stop`
|
||||
|
||||
向当前 session 发送 `stop_generation`。
|
||||
- `/start` — 显示帮助和可用命令
|
||||
- `/projects` — 切换项目,重新显示最近项目列表
|
||||
- `/status` — 查看当前会话的项目、模型、运行状态和任务摘要
|
||||
- `/clear` — 清空当前会话上下文,保留项目绑定
|
||||
- `/new` — 清空当前 chat 绑定的 session,并重新选择项目
|
||||
- `/help` — 显示当前可用命令
|
||||
- `/stop` — 向当前 session 发送 `stop_generation`
|
||||
|
||||
## 权限审批
|
||||
|
||||
当 Claude 需要敏感权限时,Telegram adapter 会发带按钮的消息:
|
||||
当 Claude 请求敏感权限时,Telegram adapter 会发带按钮的消息:
|
||||
|
||||
- `✅ 允许`
|
||||
- `❌ 拒绝`
|
||||
|
||||
点击后,adapter 会把结果通过 `permission_response` 发回 Desktop server。
|
||||
点击后 adapter 会把结果通过 `permission_response` 回传给 Desktop server。
|
||||
|
||||
## 返回消息的表现
|
||||
|
||||
@ -152,6 +79,23 @@ Telegram 侧有一层流式缓冲:
|
||||
- `adapters/common/format.ts`
|
||||
- `adapters/common/ws-bridge.ts`
|
||||
|
||||
## 启动 adapter
|
||||
|
||||
桌面端会自动把 adapter 作为 sidecar 拉起。如果你在本地开发,需要手动启动:
|
||||
|
||||
```bash
|
||||
cd adapters
|
||||
bun install
|
||||
bun run telegram
|
||||
```
|
||||
|
||||
## 环境变量覆盖(可选)
|
||||
|
||||
```bash
|
||||
export TELEGRAM_BOT_TOKEN="123456:ABC-DEF..."
|
||||
export ADAPTER_SERVER_URL="ws://127.0.0.1:3456"
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### bot 启动时报缺少 token
|
||||
@ -160,16 +104,14 @@ Telegram 侧有一层流式缓冲:
|
||||
|
||||
### 能打开设置页但 bot 不工作
|
||||
|
||||
Webapp 只负责配置,不会自动拉起 `bun run telegram`。
|
||||
Webapp 只负责配置,不会自动拉起 `bun run telegram`(桌面端发布版会通过 sidecar 自动拉起)。
|
||||
|
||||
### 发消息提示未授权
|
||||
|
||||
优先检查:
|
||||
|
||||
- 是否已经在 Webapp 里生成配对码
|
||||
- 配对码是否过期
|
||||
- 是否已经在桌面端生成配对码
|
||||
- 配对码是否在 60 分钟有效期内
|
||||
- 是否把码发到了正确的 bot 私聊
|
||||
- `allowedUsers` / `pairedUsers` 是否真的包含当前账号
|
||||
- 连续输错会有速率限制,等几分钟再试
|
||||
|
||||
### 每次重启后会话丢失
|
||||
|
||||
|
||||
BIN
docs/images/im/feishu/01-create-app-entry.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
docs/images/im/feishu/02-name-bot.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
docs/images/im/feishu/03-dev-console.png
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
docs/images/im/feishu/04-menu-enter.png
Normal file
|
After Width: | Height: | Size: 501 KiB |
BIN
docs/images/im/feishu/05-menu-projects.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
docs/images/im/feishu/06-menu-new.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
docs/images/im/feishu/07-menu-clear.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
docs/images/im/feishu/08-menu-save.png
Normal file
|
After Width: | Height: | Size: 263 KiB |
BIN
docs/images/im/feishu/09-publish-version.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
docs/images/im/feishu/10-fill-app-credentials.png
Normal file
|
After Width: | Height: | Size: 246 KiB |
BIN
docs/images/im/feishu/11-generate-pairing-code.png
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
docs/images/im/feishu/12-pairing-code-detail.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
docs/images/im/feishu/13-send-code-in-feishu.png
Normal file
|
After Width: | Height: | Size: 315 KiB |
BIN
docs/images/im/feishu/14-pair-success.png
Normal file
|
After Width: | Height: | Size: 304 KiB |
BIN
docs/images/im/feishu/15-pair-done.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
docs/images/im/telegram/01-search-botfather.png
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
docs/images/im/telegram/02-newbot-command.png
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
docs/images/im/telegram/03-bot-token.png
Normal file
|
After Width: | Height: | Size: 710 KiB |
BIN
docs/images/im/telegram/04-fill-bot-token.png
Normal file
|
After Width: | Height: | Size: 240 KiB |
BIN
docs/images/im/telegram/05-generate-pairing-code.png
Normal file
|
After Width: | Height: | Size: 250 KiB |
BIN
docs/images/im/telegram/06-pair-success.png
Normal file
|
After Width: | Height: | Size: 627 KiB |