dsh-bridge-gateway 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +250 -0
- package/LICENSE +21 -0
- package/README.en.md +408 -0
- package/README.md +430 -0
- package/client/build.mjs +43 -0
- package/client/client.js +5209 -0
- package/client/index.js +4967 -0
- package/cordis.patch.yml +4 -0
- package/docs/banner.jpg +0 -0
- package/docs/custom-tunnel.md +220 -0
- package/docs/feishu-usage.md +116 -0
- package/docs/fix-tunnel-sse-and-session-list.md +134 -0
- package/docs/platform-abstraction-design.md +473 -0
- package/docs/qq-usage.md +387 -0
- package/docs/screenshots/admin-lock-screen.jpg +0 -0
- package/docs/screenshots/feishu-bot-config.jpg +0 -0
- package/docs/screenshots/feishu-chat.jpg +0 -0
- package/docs/screenshots/lan-access.jpg +0 -0
- package/docs/screenshots/mobile-chat.jpg +0 -0
- package/docs/screenshots/mobile-drawer.jpg +0 -0
- package/docs/screenshots/mobile-remote-settings.jpg +0 -0
- package/docs/screenshots/mobile-settings-im.jpg +0 -0
- package/docs/screenshots/mobile-settings-lan.jpg +0 -0
- package/docs/screenshots/mobile-settings-security.jpg +0 -0
- package/docs/screenshots/mobile-settings-tunnel.jpg +0 -0
- package/docs/screenshots/mobile-workspace-picker.jpg +0 -0
- package/docs/screenshots/qq-bot-config.jpg +0 -0
- package/docs/screenshots/qq-chat.jpg +0 -0
- package/docs/screenshots/qq-group.jpg +0 -0
- package/docs/screenshots/qr-scan.jpg +0 -0
- package/docs/screenshots/remote-auth-login.jpg +0 -0
- package/docs/screenshots/remote-web-mobile.jpg +0 -0
- package/docs/screenshots/security-auth-config.jpg +0 -0
- package/docs/screenshots/telegram-bot-config.jpg +0 -0
- package/docs/screenshots/tunnel-access.jpg +0 -0
- package/docs/screenshots/wechat-bot-config.jpg +0 -0
- package/docs/screenshots/wechat-chat.jpg +0 -0
- package/docs/telegram-usage.md +93 -0
- package/docs/wechat-usage.md +104 -0
- package/lib/auth/login-template.js +382 -0
- package/lib/auth/manager.js +470 -0
- package/lib/bridge-rpc-constants.js +55 -0
- package/lib/bridge-rpc.js +553 -0
- package/lib/cloudflared-manager.mjs +345 -0
- package/lib/feishu/gateway.js +550 -0
- package/lib/feishu/index.js +222 -0
- package/lib/feishu/lark-bundled.mjs +125547 -0
- package/lib/feishu/node.js +409 -0
- package/lib/gateway/cert.js +214 -0
- package/lib/index.js +1963 -0
- package/lib/platform/base.js +156 -0
- package/lib/platform/conversation-bridge.js +1570 -0
- package/lib/platform/index.js +10 -0
- package/lib/platform/manager.js +74 -0
- package/lib/qq/gateway.js +616 -0
- package/lib/qq/index.js +309 -0
- package/lib/qq/node.js +533 -0
- package/lib/security/path-validator.js +208 -0
- package/lib/security/rate-limiter.js +93 -0
- package/lib/telegram/gateway.js +630 -0
- package/lib/telegram/index.js +213 -0
- package/lib/telegram/node.js +351 -0
- package/lib/tunnel-client.mjs +402 -0
- package/lib/wechat/gateway.js +960 -0
- package/lib/wechat/index.js +241 -0
- package/lib/wechat/media.js +281 -0
- package/lib/wechat/node.js +350 -0
- package/package.json +102 -0
package/docs/qq-usage.md
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
# QQ Bot 使用指南
|
|
2
|
+
|
|
3
|
+
本文档介绍如何接入 QQ Bot OpenAPI v2,实现私聊、群聊、流式输出、按钮交互、消息引用和富媒体消息。
|
|
4
|
+
|
|
5
|
+
## ✨ v2.1.1 新特性
|
|
6
|
+
|
|
7
|
+
- **🚀 流式消息输出**:长文本自动分段推送(200字符/段),实时看到 AI 输出
|
|
8
|
+
- **💬 消息引用交互**:直接回复机器人消息即可继续对话,无需输入命令
|
|
9
|
+
- **🔘 按钮快捷操作**:无活动会话时自动显示快捷按钮(新建会话/列表/帮助)
|
|
10
|
+
- **⚡ 互动事件支持**:按钮点击自动映射到对应命令
|
|
11
|
+
|
|
12
|
+
## 前置准备
|
|
13
|
+
|
|
14
|
+
### 1. 创建 QQ 机器人
|
|
15
|
+
|
|
16
|
+
访问 [QQ 开放平台](https://q.qq.com/) 创建机器人应用:
|
|
17
|
+
|
|
18
|
+
1. 登录并进入"机器人管理"
|
|
19
|
+
2. 点击"创建机器人",填写基本信息
|
|
20
|
+
3. 创建完成后获取 **AppID** 和 **ClientSecret**(开发设置 → 开发信息)
|
|
21
|
+
4. 配置机器人权限:
|
|
22
|
+
- 私域机器人:可接收私聊和群聊消息
|
|
23
|
+
- 需要开通"发送消息"、"接收消息"等基础权限
|
|
24
|
+
|
|
25
|
+
### 2. 配置事件订阅
|
|
26
|
+
|
|
27
|
+
QQ Bot 使用 WebSocket 接收事件,需要配置 Intents(事件订阅):
|
|
28
|
+
|
|
29
|
+
- **C2C_MESSAGE_CREATE**(私聊消息):`1 << 25`
|
|
30
|
+
- **GROUP_AT_MESSAGE_CREATE**(群聊 @提及):`1 << 25`(与私聊同属 `GROUP_AND_C2C_EVENT`)
|
|
31
|
+
- **INTERACTION_CREATE**(互动事件):`1 << 26`
|
|
32
|
+
|
|
33
|
+
> dsh-bridge 默认已开启以上三个 intents,支持私聊、群聊和按钮交互,无需额外配置。
|
|
34
|
+
|
|
35
|
+
## 快速开始
|
|
36
|
+
|
|
37
|
+
### 1. 启动 dsh-bridge
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# 安装最新版本
|
|
41
|
+
npm install -g @wenbin_wb/dsh-bridge@latest
|
|
42
|
+
|
|
43
|
+
# 启动服务
|
|
44
|
+
dsh web
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
访问 `http://127.0.0.1:3080`,在平台选择器中选择"QQ"。
|
|
48
|
+
|
|
49
|
+
### 2. 配置 QQ Bot 凭证
|
|
50
|
+
|
|
51
|
+
在"未配置"区域填写:
|
|
52
|
+
|
|
53
|
+
- **AppID**:QQ 开放平台应用的 AppID
|
|
54
|
+
- **ClientSecret**:应用的 ClientSecret(密钥不会回传浏览器,留空表示沿用已保存密钥)
|
|
55
|
+
|
|
56
|
+
点击"保存并连接",系统会自动:
|
|
57
|
+
1. 保存凭证到 `$DSH_HOME/dsh-bridge/config.json`
|
|
58
|
+
2. 获取 Access Token(自动刷新,TTL 7200s)
|
|
59
|
+
3. 连接 WebSocket Gateway
|
|
60
|
+
4. 开始接收消息事件
|
|
61
|
+
|
|
62
|
+
### 3. 配置白名单
|
|
63
|
+
|
|
64
|
+
保存凭证后,在"高级设置"中添加允许的用户/群组 ID:
|
|
65
|
+
|
|
66
|
+
- **私聊**:用户的 `user_openid`(形如 `11112222333344445555AAAAAAAAAAAA`)
|
|
67
|
+
- **群聊**:群组的 `group_openid`(形如 `1A2B3C4D5E6F7890ABCDEFABCDEFABCD`)
|
|
68
|
+
|
|
69
|
+
> **如何获取 OpenID**:
|
|
70
|
+
> 1. 先不设置白名单,用户/群组发送消息后查看日志
|
|
71
|
+
> 2. 日志中会显示"未在白名单中,已忽略",复制其中的 OpenID
|
|
72
|
+
> 3. 将 OpenID 添加到白名单并保存
|
|
73
|
+
|
|
74
|
+
### 4. 开始对话
|
|
75
|
+
|
|
76
|
+
#### 私聊场景
|
|
77
|
+
|
|
78
|
+
1. 在 QQ 中搜索并添加你的机器人为好友
|
|
79
|
+
2. 发送任意消息,机器人会回复带按钮的欢迎提示:
|
|
80
|
+
- 🆕 **新建会话**:创建新的 AI 对话
|
|
81
|
+
- 📋 **会话列表**:查看所有可用会话
|
|
82
|
+
- ❓ **帮助**:显示命令帮助
|
|
83
|
+
3. 点击「新建会话」按钮开始对话
|
|
84
|
+
4. 或者直接回复机器人的任何消息,自动创建新会话并继续对话
|
|
85
|
+
|
|
86
|
+
#### 群聊场景
|
|
87
|
+
|
|
88
|
+
1. 将机器人拉入 QQ 群
|
|
89
|
+
2. 在群内 @机器人 并发送消息(例如:`@机器人 你好`)
|
|
90
|
+
3. 机器人会响应并提供快捷按钮
|
|
91
|
+
4. 后续可以:
|
|
92
|
+
- 点击按钮快捷操作
|
|
93
|
+
- 回复机器人的消息继续对话
|
|
94
|
+
- @机器人 发送新消息
|
|
95
|
+
|
|
96
|
+
### 5. 流式输出与输入状态
|
|
97
|
+
|
|
98
|
+
#### 流式输出(单聊全回复流式 Markdown)
|
|
99
|
+
|
|
100
|
+
**单聊中所有 AI 回复统一走流式接口**,手机端实时看到消息逐段增长,且 Markdown 正常渲染:
|
|
101
|
+
|
|
102
|
+
- **流式**:使用官方 `/stream_messages`(下划线)接口 + `replace` 覆盖模式(官方推荐),每片是全量前缀,服务端逐片覆盖 → 一条消息逐渐变长
|
|
103
|
+
- **Markdown**:流式内容用 `content_type: markdown`,手机端正常渲染粗体/代码块/列表等,不再显示原始语法
|
|
104
|
+
- **分段**:按段落边界切分,短消息自动拆两片保证"生成中→生成结束"过渡;每片带递增 `msg_seq` 避免去重
|
|
105
|
+
- **安全转换**:QQ 不支持的表格自动降级为纯文本,`![图片]()` 转成链接,代码块内容原样保留
|
|
106
|
+
- **回退**:流式失败时补发完整内容 replace 收尾,再失败降级「主动 Markdown」,确保消息必达
|
|
107
|
+
- **群聊**:官方不支持群消息流式,群聊回复直接发送 Markdown
|
|
108
|
+
|
|
109
|
+
#### 输入状态指示
|
|
110
|
+
|
|
111
|
+
AI 生成过程中,QQ 会显示机器人的"正在输入"状态:
|
|
112
|
+
|
|
113
|
+
- **实现方式**:普通消息接口 `msg_type: 6` + `input_notify`
|
|
114
|
+
- **参数**:`input_notify: { input_type: 1, input_second: 8 }`(最长 60 秒)
|
|
115
|
+
- **自动管理**:收到用户消息后、发送回复前自动显示"正在输入"
|
|
116
|
+
- **API 文档**:[发送单聊消息](https://bot.q.qq.com/wiki/develop/api-v2/autogen/api/v2_users_user_openid_messages.post.html)
|
|
117
|
+
|
|
118
|
+
### 6. 指令面板与自定义菜单(v2.2.0)
|
|
119
|
+
|
|
120
|
+
连接成功后,dsh-bridge 会自动为你的机器人配置:
|
|
121
|
+
|
|
122
|
+
> **⚠️ 重要提示**(2026-08-20 确认):
|
|
123
|
+
> - **自定义菜单、指令面板、消息按钮是 2026-08-12 刚上线的新功能**([官方变更记录](https://bot.qq.com/wiki/develop/api-v2/changelog.html))
|
|
124
|
+
> - **需要最新版 QQ 客户端**才能显示(手机版 QQ 优先支持新功能,桌面版可能延后)
|
|
125
|
+
> - 若 API 配置成功(`PUT /v2/menu` 返回 version、`GET /v2/panels` 有 records)但客户端不显示,是**正常现象**——更新 QQ 到最新版再试
|
|
126
|
+
> - 功能可能在**灰度期**,未全量开放;无权限时纯文字命令(`/new` `/sessions` `/help`)仍完全可用
|
|
127
|
+
|
|
128
|
+
#### 指令面板(单聊 + 群聊常驻)
|
|
129
|
+
|
|
130
|
+
在单聊窗口和群聊中常驻显示命令面板,点击即可填入命令:
|
|
131
|
+
|
|
132
|
+
| 面板项 | 说明 |
|
|
133
|
+
|--------|------|
|
|
134
|
+
| `/new` | 新建对话 |
|
|
135
|
+
| `/list` | 查看会话列表 |
|
|
136
|
+
| `/resume` | 恢复会话 |
|
|
137
|
+
| `/sessions` | 切换会话 |
|
|
138
|
+
| `/help` | 命令帮助 |
|
|
139
|
+
|
|
140
|
+
面板按 `c2c`(单聊)和 `group`(群聊)两个场景各创建一个全局面板,幂等创建(不会重复)。
|
|
141
|
+
|
|
142
|
+
#### 自定义菜单(单聊底部)
|
|
143
|
+
|
|
144
|
+
单聊窗口底部常驻菜单,点击自动填入命令:
|
|
145
|
+
|
|
146
|
+
- **新建** → 自动填入 `/new`
|
|
147
|
+
- **列表** → 自动填入 `/list`
|
|
148
|
+
- **帮助** → 自动填入 `/help`
|
|
149
|
+
|
|
150
|
+
> 相关 API 文档:
|
|
151
|
+
> - [自定义菜单与指令面板](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/menu-panel/)
|
|
152
|
+
> - [创建指令面板](https://bot.q.qq.com/wiki/develop/api-v2/autogen/api/v2_panels.post.html)
|
|
153
|
+
> - [修改全局自定义菜单](https://bot.q.qq.com/wiki/develop/api-v2/autogen/api/v2_menu.put.html)
|
|
154
|
+
|
|
155
|
+
## 功能特性
|
|
156
|
+
|
|
157
|
+
### 交互方式
|
|
158
|
+
|
|
159
|
+
#### 1. 快捷按钮(推荐)
|
|
160
|
+
|
|
161
|
+
当没有活动会话时,机器人会自动发送带按钮的提示:
|
|
162
|
+
|
|
163
|
+
- **🆕 新建会话**:点击后立即创建新的 AI 对话
|
|
164
|
+
- **📋 会话列表**:查看所有可用会话及其编号
|
|
165
|
+
- **❓ 帮助**:显示所有可用命令
|
|
166
|
+
|
|
167
|
+
按钮点击会触发 `INTERACTION_CREATE` 事件,自动映射到对应命令。
|
|
168
|
+
|
|
169
|
+
#### 2. 消息引用(最便捷)
|
|
170
|
+
|
|
171
|
+
直接回复机器人的任何消息,自动关联到对应会话:
|
|
172
|
+
|
|
173
|
+
1. 机器人发送回复
|
|
174
|
+
2. 你使用 QQ 的"引用回复"功能回复该消息
|
|
175
|
+
3. 如果没有活动会话,自动创建新会话
|
|
176
|
+
4. 你的消息会发送到 AI,无需输入 `/new` 等命令
|
|
177
|
+
|
|
178
|
+
> **提示**:这是最自然的交互方式,就像正常聊天一样。
|
|
179
|
+
|
|
180
|
+
#### 3. 文本命令(兼容性)
|
|
181
|
+
|
|
182
|
+
所有操作都支持传统文本命令:
|
|
183
|
+
|
|
184
|
+
- `/new <提示词>` - 新建会话并开始
|
|
185
|
+
- `/sessions`(或 `/list`)- 列出所有会话(按工作区分组)
|
|
186
|
+
- `/use N`(或 `/resume N`)- 切换到/恢复会话 N
|
|
187
|
+
- `/rename <新标题>` - 重命名当前活动会话
|
|
188
|
+
- `/end` - 结束当前会话(清除活动会话并触发快捷按钮)
|
|
189
|
+
- `/stop` - 停止当前任务
|
|
190
|
+
- `/status` - 查看状态与会话摘要
|
|
191
|
+
- `/workspaces` - 列出可用工作区
|
|
192
|
+
- `/addworkspace <路径>` - 注册添加新的电脑工作区目录
|
|
193
|
+
- `/help` - 显示帮助
|
|
194
|
+
|
|
195
|
+
### 支持的消息类型
|
|
196
|
+
|
|
197
|
+
| 类型 | 方法 | 说明 |
|
|
198
|
+
|------|------|------|
|
|
199
|
+
| 文本消息 | `sendText(scope, text)` | 纯文本消息 |
|
|
200
|
+
| 流式消息 | `sendStream(scope, text, opts)` | 长文本自动分段推送(200字符/段) |
|
|
201
|
+
| Markdown | `sendMarkdown(scope, markdown, keyboard)` | 支持 Markdown 格式 + 可选按钮 |
|
|
202
|
+
| 按钮键盘 | `sendKeyboard(scope, text, keyboard)` | 文本 + 按钮组(行内按钮) |
|
|
203
|
+
| 富媒体 | `sendMedia(scope, type, buffer, filename)` | 图片/视频/音频/文件上传 |
|
|
204
|
+
|
|
205
|
+
### 流式消息示例
|
|
206
|
+
|
|
207
|
+
```javascript
|
|
208
|
+
// 发送长文本,自动分段推送
|
|
209
|
+
await gateway.sendStream(
|
|
210
|
+
'u_11112222333344445555AAAAAAAAAAAA', // user_openid
|
|
211
|
+
'这是一段很长的 AI 回复内容...',
|
|
212
|
+
{ msgId: 'parent_msg_id' } // 可选:关联到某条消息
|
|
213
|
+
)
|
|
214
|
+
// 自动分段为 200 字符/段,每段间隔 100ms
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Markdown 示例
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
await gateway.sendMarkdown(
|
|
221
|
+
'u_11112222333344445555AAAAAAAAAAAA', // user_openid
|
|
222
|
+
'# 标题\n**粗体** *斜体* `代码`\n[链接](https://example.com)',
|
|
223
|
+
{
|
|
224
|
+
content: {
|
|
225
|
+
rows: [
|
|
226
|
+
{
|
|
227
|
+
buttons: [
|
|
228
|
+
{ id: '1', render_data: { label: '选项 A', style: 1 }, action: { type: 2, data: '/cmd_a' } },
|
|
229
|
+
{ id: '2', render_data: { label: '选项 B', style: 0 }, action: { type: 2, data: '/cmd_b' } }
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 按钮交互
|
|
239
|
+
|
|
240
|
+
按钮类型(`action.type`):
|
|
241
|
+
- `0` — 跳转按钮(`action.data` 为 URL)
|
|
242
|
+
- `1` — 回调按钮(触发 `INTERACTION_CREATE` 事件)✅ dsh-bridge 快捷按钮使用此类型
|
|
243
|
+
- `2` — 指令按钮(用户点击后自动发送 `action.data` 作为消息)
|
|
244
|
+
|
|
245
|
+
按钮样式(`render_data.style`):
|
|
246
|
+
- `0` — 灰色线框(次要操作)
|
|
247
|
+
- `1` — 蓝色线框(主要操作)
|
|
248
|
+
|
|
249
|
+
> **按钮结构(v2.2.4 对齐官方)**:`keyboard.content.rows`(含 `content` 包裹层),按钮必填 `render_data.style` / `action.data` / `action.unsupport_tips`。快捷按钮基于 `msg_type=2`(Markdown)挂载。
|
|
250
|
+
|
|
251
|
+
> **v2.2.4 互动事件处理**:仅消息按钮(type=11)与快捷菜单(type=12)需要调用 `PUT /interactions/{id}` 回应;其他类型(消息反馈/清空会话/授权等)无需回应。点击快捷按钮会自动映射到对应命令(如 `/new`、`/list`、`/help`)。
|
|
252
|
+
|
|
253
|
+
### 富媒体上传
|
|
254
|
+
|
|
255
|
+
```javascript
|
|
256
|
+
// 发送图片
|
|
257
|
+
const imageBuffer = fs.readFileSync('image.png')
|
|
258
|
+
await gateway.sendMedia(
|
|
259
|
+
'g_1A2B3C4D5E6F7890ABCDEFABCDEFABCD', // group_openid
|
|
260
|
+
'image', // image | video | audio | file
|
|
261
|
+
imageBuffer,
|
|
262
|
+
'screenshot.png'
|
|
263
|
+
)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
支持的媒体类型:
|
|
267
|
+
- `image` — 图片(PNG/JPG/GIF,< 10MB)
|
|
268
|
+
- `video` — 视频(MP4,< 50MB)
|
|
269
|
+
- `audio` — 音频(MP3/WAV,< 10MB)
|
|
270
|
+
- `file` — 文件(任意类型,< 20MB)
|
|
271
|
+
|
|
272
|
+
## 高级配置
|
|
273
|
+
|
|
274
|
+
### 会话管理
|
|
275
|
+
|
|
276
|
+
在 UI 的"高级设置"中配置:
|
|
277
|
+
|
|
278
|
+
- **摘要间隔**(`digestIntervalSec`,默认 300s):多久向 Agent 发送一次历史消息摘要
|
|
279
|
+
- ✅ **微信**:生效
|
|
280
|
+
- ✅ **QQ**:生效
|
|
281
|
+
- **审批超时**(`approvalTimeoutSec`,默认 600s):等待用户审批的最长时间
|
|
282
|
+
- ✅ **微信**:生效
|
|
283
|
+
- ✅ **QQ**:生效
|
|
284
|
+
- **每条最大字数**(`maxMessageChars`,默认 2000):单条流式消息最大字符数,超出会拆成多条
|
|
285
|
+
- ✅ **微信**:生效(超出拆分为多条普通文本消息,间隔 `sendChunkDelayMs`)
|
|
286
|
+
- ✅ **QQ**:生效(v2.2.2+ 修复,超出拆分为多片流式消息,每片按此配置切分)
|
|
287
|
+
- **分块延迟**(`sendChunkDelayMs`,默认 1500ms):多条消息之间的延迟,避免刷屏
|
|
288
|
+
- ✅ **微信**:生效(拆分的多条普通文本消息间隔)
|
|
289
|
+
- ✅ **QQ**:生效(v2.2.2+ 修复,流式消息多片间隔)
|
|
290
|
+
|
|
291
|
+
### Token 自动刷新
|
|
292
|
+
|
|
293
|
+
Access Token 有效期为 7200 秒(2 小时),dsh-bridge 会在过期前 5 分钟自动刷新,无需手动处理。
|
|
294
|
+
|
|
295
|
+
### 消息去重
|
|
296
|
+
|
|
297
|
+
WebSocket 可能收到重复消息(如网络抖动、重连),Gateway 使用 `msg_id` 去重(TTL 300s),确保同一消息不会被处理多次。
|
|
298
|
+
|
|
299
|
+
### 断线重连
|
|
300
|
+
|
|
301
|
+
Gateway 实现指数退避重连策略:
|
|
302
|
+
- 初始延迟:1s
|
|
303
|
+
- 最大延迟:60s
|
|
304
|
+
- 每次失败后延迟翻倍(1s → 2s → 4s → 8s → ...)
|
|
305
|
+
- 心跳超时(40s 未收到 `HEARTBEAT_ACK`)自动重连
|
|
306
|
+
|
|
307
|
+
## 故障排查
|
|
308
|
+
|
|
309
|
+
### 1. 连接失败
|
|
310
|
+
|
|
311
|
+
**症状**:UI 显示"未配置"或"已停止"
|
|
312
|
+
|
|
313
|
+
**排查**:
|
|
314
|
+
1. 检查 AppID 和 ClientSecret 是否正确
|
|
315
|
+
2. 查看浏览器控制台 Network 面板,检查 `platformLogin` 请求是否返回错误
|
|
316
|
+
3. 检查 DSH 终端日志,搜索"QQ"关键词
|
|
317
|
+
|
|
318
|
+
### 2. 收不到消息
|
|
319
|
+
|
|
320
|
+
**症状**:用户发送消息后机器人无响应
|
|
321
|
+
|
|
322
|
+
**排查**:
|
|
323
|
+
1. 确认用户/群组 OpenID 已添加到白名单
|
|
324
|
+
2. 群聊消息需要 @机器人 才会触发
|
|
325
|
+
3. 检查机器人权限是否开通"接收消息"
|
|
326
|
+
4. 查看 DSH 终端日志,确认是否收到 `C2C_MESSAGE_CREATE` 或 `GROUP_AT_MESSAGE_CREATE` 事件
|
|
327
|
+
|
|
328
|
+
### 3. 发送消息失败
|
|
329
|
+
|
|
330
|
+
**症状**:DSH Agent 回复后,QQ 不显示消息
|
|
331
|
+
|
|
332
|
+
**排查**:
|
|
333
|
+
1. 检查机器人权限是否开通"发送消息"
|
|
334
|
+
2. 查看终端日志中的 API 请求错误(状态码、错误信息)
|
|
335
|
+
3. 确认消息内容符合 QQ 限制(文本 < 4096 字符,媒体文件大小限制)
|
|
336
|
+
|
|
337
|
+
### 4. Token 过期
|
|
338
|
+
|
|
339
|
+
**症状**:运行一段时间后突然无法发送消息
|
|
340
|
+
|
|
341
|
+
**排查**:
|
|
342
|
+
1. 正常情况下 Token 会自动刷新,如果频繁过期可能是 ClientSecret 错误
|
|
343
|
+
2. 检查终端日志中的"刷新 Access Token"记录
|
|
344
|
+
3. 手动重新保存凭证触发立即刷新
|
|
345
|
+
|
|
346
|
+
## 参考资料
|
|
347
|
+
|
|
348
|
+
- [QQ Bot API v2 官方文档](https://bot.q.qq.com/wiki/develop/api-v2/)
|
|
349
|
+
- [获取访问凭证](https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/access-token.html)
|
|
350
|
+
- [WebSocket 事件](https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/event-emit/websocket.html)
|
|
351
|
+
- [消息收发](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/overview.html)
|
|
352
|
+
- [流式消息](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/send-receive/passive.html#%E6%B6%88%E6%81%AF%E6%B5%81%E5%BC%8F%E6%8E%A8%E9%80%81)
|
|
353
|
+
- [Markdown 消息](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/type/markdown.html)
|
|
354
|
+
- [消息按钮](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/trans/msg-btn.html)
|
|
355
|
+
- [富媒体消息](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/send-receive/rich-media.html)
|
|
356
|
+
|
|
357
|
+
## 版本历史
|
|
358
|
+
|
|
359
|
+
### v2.2.0
|
|
360
|
+
- 🔧 API 域名统一为 `api.bot.qq.com`(官方 2026-08-10 变更)
|
|
361
|
+
- 🔧 修复流式消息:路径 `stream_messages`(下划线)、参数对齐官方、改用 `append` 追加模式
|
|
362
|
+
- 🔧 输入状态改用 `msg_type: 6` + `input_notify`
|
|
363
|
+
- 🔧 键盘消息改用 `msg_type: 0` + `content` + `keyboard`
|
|
364
|
+
- 🔧 修复被动回复 msg_id(用用户消息事件 ID)
|
|
365
|
+
- 🔧 修复群聊 scope 传递 bug
|
|
366
|
+
- ✨ 新增指令面板全套 API,连接后自动创建单聊/群聊命令面板
|
|
367
|
+
- ✨ 新增自定义菜单 API,自动配置单聊底部菜单
|
|
368
|
+
|
|
369
|
+
### v2.1.1
|
|
370
|
+
- ✨ 流式消息输出:长文本自动分段推送
|
|
371
|
+
- ✨ 消息引用:检测 `message_reference`,用户回复消息时自动创建会话
|
|
372
|
+
- ✨ 按钮交互:无活动会话时发送快捷按钮(新建会话/列表/帮助)
|
|
373
|
+
- ✨ 事件增强:启用 `INTERACTION_CREATE` intent,支持按钮点击映射到命令
|
|
374
|
+
|
|
375
|
+
### v2.1.0
|
|
376
|
+
- 🎉 初始版本:QQ Bot OpenAPI v2 完整实现
|
|
377
|
+
- ✨ 私聊、群聊、Markdown、按钮、富媒体
|
|
378
|
+
- ✨ 平台抽象层集成
|
|
379
|
+
- ✨ Web UI 自动适配
|
|
380
|
+
|
|
381
|
+
## 示例项目
|
|
382
|
+
|
|
383
|
+
完整示例代码见仓库:
|
|
384
|
+
- Gateway 实现:`lib/qq/gateway.js`
|
|
385
|
+
- Platform 适配器:`lib/qq/index.js`
|
|
386
|
+
- ConversationBridge 适配:`lib/qq/node.js`
|
|
387
|
+
- 单元测试:`test/qq-service.test.mjs`
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Telegram 机器人接入指南
|
|
2
|
+
|
|
3
|
+
> 通过官方 Telegram Bot API,将本地 DeepSeek Harness 接入 Telegram,支持单聊与群聊、原生快捷指令菜单、交互卡片按键、增量打字机流式输出与权限审批。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🌟 核心优势
|
|
8
|
+
|
|
9
|
+
- **100% 免公网 IP / 免 Webhook**:基于 Telegram 官方 Long Polling(长轮询)机制,本地电脑或内网服务器即可直连 Telegram Bot API。
|
|
10
|
+
- **零依赖原生代理支持**:内置极简 HTTP/HTTPS CONNECT 隧道代理客户端,国内网络环境下仅需填入代理地址(如 `http://127.0.0.1:7890`)即可极速通信。
|
|
11
|
+
- **增量打字机流式输出**:接入轮次实时生命周期,通过 `editMessageText` 实现平滑打字机流式输出,单条气泡原地更新,告别刷屏。
|
|
12
|
+
- **原生快捷指令菜单 (`Menu` 按键)**:自动通过 `setMyCommands` 与 `setChatMenuButton` 注册全范围指令,输入 `/` 或点击左下角菜单即可一键直达。
|
|
13
|
+
- **原生交互卡片与审批按键**:审批请求下发 Inline Keyboard 按键 `[✓ 批准执行]` / `[✕ 拒绝执行]`,一键点击即时响应。
|
|
14
|
+
- **多工作区与会话持久化**:支持 `/sessions` 查看会话列表、`/use <序号>` 切换、`/workspaces` 调度工作区,重启 DSH 后白名单与会话不丢失。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 🛠️ 第一步:在 Telegram 中创建机器人并获取 Token
|
|
19
|
+
|
|
20
|
+
1. 打开 Telegram,搜索官方机器人管理号 [@BotFather](https://t.me/BotFather);
|
|
21
|
+
2. 点击底部 `Start` 或发送 `/newbot` 指令;
|
|
22
|
+
3. 根据提示依次输入:
|
|
23
|
+
- **机器人昵称**(如 `My DSH Agent`);
|
|
24
|
+
- **机器人用户名**(必须以 `bot` 结尾,如 `my_dsh_agent_bot`);
|
|
25
|
+
4. 创建成功后,@BotFather 会返回一行 **HTTP API Token**(格式如 `123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ`)。
|
|
26
|
+
|
|
27
|
+
> 💡 **(可选)在 BotFather 中固化快捷指令**:
|
|
28
|
+
> 向 @BotFather 发送 `/setcommands`,选择你的机器人,直接复制并粘贴下方内容发送:
|
|
29
|
+
> ```text
|
|
30
|
+
> new - 新建会话并开始执行 (/new <提示词>)
|
|
31
|
+
> sessions - 列出所有会话列表与切换
|
|
32
|
+
> use - 切换活动会话 (/use <N>)
|
|
33
|
+
> workspaces - 列出本地所有可用工作区
|
|
34
|
+
> status - 查看 Agent 状态与会话摘要
|
|
35
|
+
> stop - 停止当前正在运行的任务
|
|
36
|
+
> end - 结束当前活动会话
|
|
37
|
+
> help - 显示快捷按键与完整帮助
|
|
38
|
+
> ```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## ⚙️ 第二步:在 DSH Bridge 中配置与连接
|
|
43
|
+
|
|
44
|
+
1. 打开 DSH Web 设置页「**远程访问**」→「**IM 机器人**」;
|
|
45
|
+
2. 在平台选择栏中点击「**Telegram**」卡片;
|
|
46
|
+
3. 填入刚才获取的 **Bot Token**;
|
|
47
|
+
4. **网络代理(可选)**:
|
|
48
|
+
- 若在中国大陆地区服务器或个人电脑上运行,填入本地代理地址,如 `http://127.0.0.1:7890`(支持 Clash / v2ray / Squid 等 HTTP/HTTPS 代理);
|
|
49
|
+
- 亦可直接在系统环境变量中设置 `HTTPS_PROXY=http://127.0.0.1:7890`;
|
|
50
|
+
5. 点击「**保存并连接**」。
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 📱 第三步:扫码与自动白名单授权
|
|
57
|
+
|
|
58
|
+
1. 连接成功后,面板将展示当前机器人的二维码与 `https://t.me/<username>` 直达链接;
|
|
59
|
+
2. 用手机 Telegram 扫描二维码或点击链接打开与机器人的对话;
|
|
60
|
+
3. 发送第一条消息(如 `/help` 或 `你好`),系统将**自动将你的 Telegram 账号加入白名单**并持久化;
|
|
61
|
+
4. 之后即可在 Telegram 里随时随地向 Agent 下达任务指令。
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 💬 常用指令与卡片交互
|
|
66
|
+
|
|
67
|
+
| 指令 | 说明 | 交互支持 |
|
|
68
|
+
| :--- | :--- | :--- |
|
|
69
|
+
| *(普通文本)* | 发送给当前活动 Agent 执行任务 | 实时打字机流式输出 |
|
|
70
|
+
| `/new <提示词>` | 在当前工作区新建会话并立即执行 | 启动全新轮次 |
|
|
71
|
+
| `/new <提示词> @N` | 在指定工作区序号新建会话 | 多工作区调度 |
|
|
72
|
+
| `/rename <新标题>` | 重命名当前活动会话标题 | 修改会话名称 |
|
|
73
|
+
| `/sessions`(或 `/list`) | 查看所有会话列表 | 附带一键切换按键 |
|
|
74
|
+
| `/use N`(或 `/resume N`) | 切换活动会话至序号 N | 快速切换上下文 |
|
|
75
|
+
| `/workspaces` | 列出本地所有可用项目工作区 | 查看工作区路径 |
|
|
76
|
+
| `/addworkspace <路径>` | 注册添加新的电脑工作区目录 | 自动绑定并生成快捷序号 |
|
|
77
|
+
| `/status` | 查看当前 Agent 运行状态看板 | 附带刷新/停止/结束按键 |
|
|
78
|
+
| `/stop` | 强制停止当前正在运行的 Agent 任务 | 即刻中断执行 |
|
|
79
|
+
| `/end` | 结束当前活动会话 | 挂载快捷开始按键 |
|
|
80
|
+
| `/yes` `/no`(或 `1`/`2`) | 响应权限审批请求 | 支持直接点击卡片按钮 |
|
|
81
|
+
| `/help` | 查看快捷按键与完整使用帮助 | 挂载全套功能导航按键 |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 🛡️ 多模态与安全说明
|
|
86
|
+
|
|
87
|
+
1. **图片与文件双向传输**:
|
|
88
|
+
- 直接向 Telegram 机器人发送图片或文档,系统自动保存到本地并注入提示词供 Agent 解析;
|
|
89
|
+
- Agent 任务执行中生成的图片、文档等产物,在轮次结束时会自动推送回 Telegram 聊天。
|
|
90
|
+
2. **安全白名单拦截**:
|
|
91
|
+
- 仅白名单内的用户消息会被放行给 Agent;非白名单用户发送的消息会被直接忽略,绝不消耗 Token 或喂给模型。
|
|
92
|
+
3. **敏感操作审批**:
|
|
93
|
+
- 当 Agent 尝试执行系统命令或敏感文件读写时,Telegram 会自动下发 `[✓ 批准执行]` / `[✕ 拒绝执行]` 交互按键,10 分钟未处理自动超时拒绝。
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# 微信 Bot 使用说明
|
|
2
|
+
|
|
3
|
+
> dsh-bridge 的微信 Bot(ClawBot / iLink)让你**直接在微信里**与你的 DeepSeek Harness agent 对话、控制和审批——无需公网、无需隧道,走腾讯官方 iLink Bot API。
|
|
4
|
+
|
|
5
|
+
扫码登录微信个人号后,发消息就能驱动 agent;`/` 开头的命令管理会话、切换工作区、审批权限。会话与工作区信息跨重启持久化,不会丢。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、快速开始
|
|
10
|
+
|
|
11
|
+
1. 打开 DSH 设置页 → 「远程访问」→ 「IM 机器人」标签页 → 选中「微信」平台
|
|
12
|
+
2. 点击「扫码登录」,用微信扫二维码并按提示确认
|
|
13
|
+
3. 登录成功后,**向该微信 Bot 发送第一条消息,自动完成白名单授权**(一步到位)
|
|
14
|
+
4. 之后就可以直接在微信里下命令、发消息了
|
|
15
|
+
|
|
16
|
+
> 💡 登录后左侧「IM 机器人」标签会出现绿色圆点,表示微信 Bot 已连接。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 二、基本对话
|
|
21
|
+
|
|
22
|
+
直接发送普通文本即可与当前活动的 agent 对话。支持发送**图片 / 文件 / 语音**(语音自动转文字),agent 也能在需要时把文件发回给你。
|
|
23
|
+
|
|
24
|
+
- 长回复会自动**分多条发送**,并在消息间留出间隔,避免刷屏
|
|
25
|
+
- 任务处理中会周期性发送「[处理中] 第 N 轮 | …」的心跳进度
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 三、命令一览
|
|
30
|
+
|
|
31
|
+
| 命令 | 说明 |
|
|
32
|
+
|------|------|
|
|
33
|
+
| *(普通文本)* | 发给当前活动 agent |
|
|
34
|
+
| `/sessions` | 列出所有会话(按**工作区**分组,显示**会话标题**) |
|
|
35
|
+
| `/use N` | 切换到会话 N |
|
|
36
|
+
| `/rename <新标题>` | 重命名当前活动会话 |
|
|
37
|
+
| `/workspaces` | 列出可用工作区 |
|
|
38
|
+
| `/addworkspace <路径>` | 注册添加新的电脑工作区目录 |
|
|
39
|
+
| `/new <提示词>` | 在**当前工作区**新建会话并开始 |
|
|
40
|
+
| `/new <提示词> @N` | 在**编号 N 的工作区**新建会话 |
|
|
41
|
+
| `/new <提示词> @路径` | 在**指定目录**新建会话 |
|
|
42
|
+
| `/rename <新标题>` | 重命名当前活动会话 |
|
|
43
|
+
| `/stop` | 停止当前任务 |
|
|
44
|
+
| `/status` | 查看当前 agent 状态与会话摘要 |
|
|
45
|
+
| `/yes` `/no`(或 `1`/`2`) | 回应权限审批请求 |
|
|
46
|
+
| `/start` | 首次扫码后自动开始一个会话 |
|
|
47
|
+
| `/help` | 查看全部命令 |
|
|
48
|
+
|
|
49
|
+
### 例子
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
/new 帮我重构这个项目的路由 # 默认工作区新建
|
|
53
|
+
/new 继续上周的 ypbin 开发 @2 # 在 2 号工作区新建
|
|
54
|
+
/sessions # 按工作区分组列出所有会话(带标题)
|
|
55
|
+
/use 3 # 切到 3 号会话继续聊
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 四、会话与工作区
|
|
61
|
+
|
|
62
|
+
### 会话持久化
|
|
63
|
+
|
|
64
|
+
- 会话数据保存到 DSH 的持久化存储,**重启 DSH 后会话不丢失**,下次直接发消息就能接着上次继续
|
|
65
|
+
- `/sessions` 会按工作区(项目目录)分组展示,并为每个会话显示**标题**(DSH 自动生成),方便区分
|
|
66
|
+
|
|
67
|
+
### 工作区(项目目录)
|
|
68
|
+
|
|
69
|
+
- `/workspaces` 列出可用的工作区
|
|
70
|
+
- 新建会话时用 `@N` 或 `@路径` 指定工作区,让 agent 在指定项目目录下工作
|
|
71
|
+
- 不指定则使用默认工作区(当前启动目录)
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 五、权限审批
|
|
76
|
+
|
|
77
|
+
当 agent 需要执行敏感操作(改文件、跑命令、调用外部服务等)时,会在微信里给你发送一条审批问询:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
[待确认] 1. agent 想要执行某个操作
|
|
81
|
+
请回复 /yes(允许)或 /no(拒绝)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- 回复 `/yes` `/no`,或仅有一条待确认时直接回复 `1` / `2`
|
|
85
|
+
- 默认 **10 分钟**内未回复则**自动拒绝**(可在设置页「高级设置」调整审批超时)
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 六、安全说明
|
|
90
|
+
|
|
91
|
+
- **强制白名单**:仅白名单内的微信用户能驱动 agent,其他人发的消息一律忽略、**绝不喂给模型**
|
|
92
|
+
- **审批默认拒绝**:未及时回复的权限请求自动拒绝
|
|
93
|
+
- **凭证加密存储**:经 DSH 凭证服务保存,不落配置明文
|
|
94
|
+
- **建议专用微信号**:iLink 每个账号只允许一个 poller,与 hermes-agent / OpenClaw 并存会互相 403;为避免影响主号,**请用专用微信小号承载 Bot**
|
|
95
|
+
|
|
96
|
+
> 声明:iLink 为腾讯官方开放通道,仍需遵守《微信 ClawBot 功能使用条款》,腾讯保留内容过滤和限速的权利。不建议用于核心业务。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 七、注意事项
|
|
101
|
+
|
|
102
|
+
- **解绑账号**:设置页微信卡片里点「解绑账号」可清除登录凭证,下次需重新扫码
|
|
103
|
+
- **高级设置**:设置页「高级设置」可调整心跳间隔、审批超时、每气泡字数、分块发送延迟
|
|
104
|
+
- 发送媒体文件时请耐心等待上传/下载,大文件耗时较长
|