@zhin.js/adapter-onebot11 4.0.2 → 5.0.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 +62 -0
- package/README.md +41 -380
- package/adapters/onebot11.ts +39 -0
- package/agent/tools/set_title.ts +2 -2
- package/lib/index.d.ts +7 -0
- package/lib/index.js +6 -0
- package/lib/onebot11-agent-deps.d.ts +15 -0
- package/lib/onebot11-agent-deps.js +30 -0
- package/lib/protocol.d.ts +144 -0
- package/lib/protocol.js +235 -0
- package/lib/ws-endpoint.d.ts +28 -0
- package/lib/ws-endpoint.js +210 -0
- package/lib/ws-transport.d.ts +13 -0
- package/lib/ws-transport.js +74 -0
- package/lib/ws-types.d.ts +17 -0
- package/lib/ws-types.js +1 -0
- package/lib/wss-auth.d.ts +2 -0
- package/lib/wss-auth.js +16 -0
- package/lib/wss-endpoint.d.ts +26 -0
- package/lib/wss-endpoint.js +143 -0
- package/package.json +45 -25
- package/plugin.ts +13 -0
- package/schema.json +61 -0
- package/src/index.ts +56 -53
- package/src/onebot11-agent-deps.ts +39 -7
- package/src/protocol.ts +370 -0
- package/src/ws-endpoint.ts +266 -0
- package/src/ws-transport.ts +101 -0
- package/src/ws-types.ts +20 -0
- package/src/wss-auth.ts +17 -0
- package/src/wss-endpoint.ts +189 -0
- package/lib/agent/tools/set_title.js +0 -21
- package/lib/agent/tools/set_title.js.map +0 -1
- package/lib/src/adapter.js +0 -101
- package/lib/src/adapter.js.map +0 -1
- package/lib/src/endpoint-ws-client.js +0 -394
- package/lib/src/endpoint-ws-client.js.map +0 -1
- package/lib/src/endpoint-ws-server.js +0 -341
- package/lib/src/endpoint-ws-server.js.map +0 -1
- package/lib/src/index.js +0 -41
- package/lib/src/index.js.map +0 -1
- package/lib/src/onebot-get-msg.js +0 -27
- package/lib/src/onebot-get-msg.js.map +0 -1
- package/lib/src/onebot11-agent-deps.js +0 -10
- package/lib/src/onebot11-agent-deps.js.map +0 -1
- package/lib/src/segment-mapper.js +0 -2
- package/lib/src/segment-mapper.js.map +0 -1
- package/lib/src/types.js +0 -5
- package/lib/src/types.js.map +0 -1
- package/plugin.yml +0 -3
- package/src/adapter.ts +0 -114
- package/src/endpoint-ws-client.ts +0 -421
- package/src/endpoint-ws-server.ts +0 -382
- package/src/onebot-get-msg.ts +0 -33
- package/src/segment-mapper.ts +0 -1
- package/src/types.ts +0 -60
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,67 @@
|
|
|
1
1
|
# @zhin.js/adapter-onebot11
|
|
2
2
|
|
|
3
|
+
## 5.0.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7db69c1: 命令前缀改为适配器配置项:`MessageDispatcher` 不再硬编码 `/`,默认按消息所属适配器实例 config 的 `commandPrefix` 解析(默认 `''` 无前缀,任意文本按命令匹配),`endpoints[i].commandPrefix` 逐项覆盖;`ImRuntime({ commandPrefix })` 仍可设全局静态前缀。全部 20 个平台适配器 schema 新增 `commandPrefix` 属性。
|
|
8
|
+
|
|
9
|
+
BREAKING(行为变化):未配置时命令不再需要 `/` 前缀——原 `/zt` 写法不再命中,直接发 `zt` 即可;需要斜杠风格的适配器请在配置里显式设 `commandPrefix: '/'`。
|
|
10
|
+
|
|
11
|
+
- 713445c: 适配器配置格式定稿(不兼容旧格式):`plugins.<adapter>` 顶层仅共享字段 + `commandPrefix`,`endpoints[i]` 携带 endpoint 级字段(`name` + 凭据,各 schema 已类型化),`endpoints` 为必填(icqq 另需顶层 `master`);icqq 新增 `trusted` 列表(顶层/逐项均可)。scaffold-wizard 全部字段式与自定义 configure() 产出改为新格式,examples(full-bot / qq-games-bot)与 20 个适配器 README 同步迁移。
|
|
12
|
+
- Updated dependencies [7db69c1]
|
|
13
|
+
- Updated dependencies [e5c84ed]
|
|
14
|
+
- Updated dependencies [3ea84a0]
|
|
15
|
+
- Updated dependencies [1ddcd70]
|
|
16
|
+
- Updated dependencies [ac9da66]
|
|
17
|
+
- @zhin.js/core@1.4.0
|
|
18
|
+
- @zhin.js/adapter@1.1.0
|
|
19
|
+
- @zhin.js/plugin-runtime@1.1.0
|
|
20
|
+
- @zhin.js/agent@1.0.5
|
|
21
|
+
- @zhin.js/host-http@1.0.2
|
|
22
|
+
- zhin.js@5.0.0
|
|
23
|
+
|
|
24
|
+
## 4.0.3
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- cc5c94d: 约定式插件运行时迁移(breaking):插件与适配器由 `usePlugin()` / `extends Adapter` 迁移为 `definePlugin` / `defineAdapter` + `plugin.ts` + 约定目录(`adapters/`、`commands/`、`components/`、`tools/` 等)。
|
|
29
|
+
|
|
30
|
+
- 新增约定式运行时包:`@zhin.js/plugin-runtime`、`@zhin.js/adapter`、`@zhin.js/runtime`、`@zhin.js/host-http`(首版 1.0.0 走 init-publish,不在本 changeset 内 bump)。
|
|
31
|
+
- 全部 20 个平台适配器改为约定式 `defineAdapter`,旧 `usePlugin` / `extends Adapter` / `segment-mapper` 生产入口已删除;onebot11 反向 WSS、onebot12 webhook/wss、milky sse/webhook/wss、satori webhook、kook webhook、qq webhook/middleware 等 slice 1 推迟的连接模式已补齐。
|
|
32
|
+
- 游戏 / 工具 / 服务插件同步迁移到约定目录结构。
|
|
33
|
+
- CLI 增加 plugin-runtime host installer(http/database/outbound/schedule/console 等)。
|
|
34
|
+
|
|
35
|
+
后续加固(同批):
|
|
36
|
+
|
|
37
|
+
- CLI:`zhin runtime start --daemon`(pidfile/崩溃拉起/风暴保护),orphan watchdog 防僵尸进程;legacy `zhin dev` / `zhin start` 已移除(含 `zhin restart`),`zhin stop` 兼容新 daemon。
|
|
38
|
+
- 安全:builtin 工具统一走 `security/policy-facade.ts` 的 `runToolPolicies`(声明式策略表,deny 优先);审计日志 close flush + 背压队列;`splitCompoundCommand` 引号感知、`extractCommandName` 去引号堵绕过。
|
|
39
|
+
- 日志:Logger 双堆栈修复、本地时区、`getLogger` 挂树(`setLevel` 递归生效)、第三方库(log4js/discord)桥接、启动人读总结。
|
|
40
|
+
- 结构:`plugins/games/shared` 迁为 `packages/game-kit`(`@zhin.js/game-kit`);死目录 `plugins/adapters/common` 删除。
|
|
41
|
+
- 脚手架:`create-zhin-app` / `zhin new` / scaffold-wizard 生成物改为 Plugin Runtime 形态(minimal-bot 同构,新配置格式)。
|
|
42
|
+
- Console:endpoint.list 真实名称与 phase、schema:get-all 按 instanceKey 映射、db:\* 接 DatabaseHost。
|
|
43
|
+
|
|
44
|
+
注:按仓库发布惯例(见 1bb345dd2),本次 breaking 迁移统一使用 patch,避免 zhin.js 5.0 级联。
|
|
45
|
+
|
|
46
|
+
- 447f3e2: 迁移缺口修复(legacy 功能对齐):
|
|
47
|
+
|
|
48
|
+
- html 段出站规范化:经 `@zhin.js/html-renderer` 渲染为 image 段(sandbox 豁免、无渲染器时降级文本),修复真实平台 `[object Object]`。
|
|
49
|
+
- 群聊 @ 触发 AI:适配器入站标注 `metadata.mentioned`(icqq/qq/slack/onebot11/onebot12/napcat/milky/discord/telegram/kook/dingtalk/satori),`matchAiTrigger` 补齐 ignorePrefixes/respondToAt/respondToPrivate/keywords(默认值与 legacy 对齐)。
|
|
50
|
+
- im_transcripts 全量流水恢复写入(chat_history 工具可用);群聊旁听上下文回迁。
|
|
51
|
+
- `ai.trigger.timeout/thinkingMessage/errorTemplate` 生效;masters/trusted 角色解析对齐 legacy。
|
|
52
|
+
- `Message.sender` 统一为用户 ID(onebot11/12、napcat、milky 原误传显示名);quote_id 经 metadata 接入 AI 引用上下文。
|
|
53
|
+
|
|
54
|
+
- Updated dependencies [16ec4e8]
|
|
55
|
+
- Updated dependencies [cc5c94d]
|
|
56
|
+
- Updated dependencies [447f3e2]
|
|
57
|
+
- @zhin.js/core@1.3.5
|
|
58
|
+
- @zhin.js/agent@1.0.4
|
|
59
|
+
- @zhin.js/host-http@1.0.1
|
|
60
|
+
- zhin.js@4.1.3
|
|
61
|
+
- @zhin.js/logger@1.0.75
|
|
62
|
+
- @zhin.js/plugin-runtime@1.0.1
|
|
63
|
+
- @zhin.js/adapter@1.0.1
|
|
64
|
+
|
|
3
65
|
## 4.0.2
|
|
4
66
|
|
|
5
67
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,423 +1,84 @@
|
|
|
1
1
|
# @zhin.js/adapter-onebot11
|
|
2
2
|
|
|
3
|
-
Zhin.js OneBot
|
|
3
|
+
Zhin.js [OneBot 11](https://github.com/botuniverse/onebot-11) 适配器(Plugin Runtime)。生产路径为正向 WebSocket 客户端(`connection: ws`);亦支持反向 WS(`connection: wss`,经 `httpHostToken`)。
|
|
4
4
|
|
|
5
5
|
## 功能特性
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
- 🔄 自动重连机制
|
|
13
|
-
- 💓 心跳检测
|
|
14
|
-
- 📨 群聊和私聊消息处理
|
|
15
|
-
- 🛠️ 完整的 API 调用支持
|
|
16
|
-
- 📝 消息段(Message Segment)完整支持
|
|
7
|
+
- [OneBot 11 标准](https://github.com/botuniverse/onebot-11) 兼容(事件 + 动作)
|
|
8
|
+
- 约定式 `defineAdapter` / `definePlugin`(无需 `usePlugin`)
|
|
9
|
+
- **正向 WebSocket**(`connection: ws`):应用连 OneBot 实现的 WS 服务器
|
|
10
|
+
- `access_token` 鉴权(Bearer + query)
|
|
11
|
+
- 入站经 `messageGatewayToken`;出站 `send({ target, payload })`
|
|
17
12
|
|
|
18
13
|
## 安装
|
|
19
14
|
|
|
20
15
|
```bash
|
|
21
|
-
pnpm add @zhin.js/adapter-onebot11
|
|
16
|
+
pnpm add @zhin.js/adapter-onebot11
|
|
22
17
|
```
|
|
23
18
|
|
|
24
|
-
|
|
19
|
+
## Plugin Runtime
|
|
25
20
|
|
|
26
|
-
|
|
21
|
+
- `@zhin.js/adapter` — 约定式 `adapters/onebot11.ts`(`defineAdapter`)
|
|
22
|
+
- `@zhin.js/core` — `messageGatewayToken` 入站/出站
|
|
23
|
+
- `@zhin.js/plugin-runtime` — `plugin.ts`(`definePlugin`)
|
|
24
|
+
- 配置经插件 `schema.json` 落到 `plugins.<instanceKey>`
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
| **OneBot 实现** | 已运行 go-cqhttp、Lagrange、Shamrock 等,并开启 WS 服务 |
|
|
31
|
-
| **正向 WS(`connection: ws`)** | 配置 OneBot 实现的 WS 地址;应用主动连接 |
|
|
32
|
-
| **反向 WS(`connection: wss`)** | 需 `@zhin.js/host-router`;OneBot 实现连到本 Endpoint 的 `path` |
|
|
33
|
-
| **access_token** | 可选;须与 OneBot 实现侧配置一致 |
|
|
34
|
-
|
|
35
|
-
必填字段见 `OneBot11EndpointConfig`:`context`、`name`、`connection`;`ws` 需 `url`,`wss` 需 `path`。
|
|
26
|
+
入站:`gateway.receive({ adapter, target: "private:uid"|"group:gid", content, sender, metadata })`
|
|
27
|
+
出站:`send({ target, payload })` → WS `send_private_msg` / `send_group_msg`(payload 已由 gateway/core 渲染;无 segment-mapper)
|
|
36
28
|
|
|
37
29
|
## 最小配置
|
|
38
30
|
|
|
39
|
-
正向 WebSocket(本地开发推荐):
|
|
40
|
-
|
|
41
31
|
```yaml
|
|
32
|
+
# zhin.config.yml(Plugin Runtime)
|
|
42
33
|
plugins:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
endpoints:
|
|
46
|
-
- context: onebot11
|
|
34
|
+
onebot11:
|
|
47
35
|
connection: ws
|
|
48
|
-
name: my-bot
|
|
49
|
-
url: "ws://127.0.0.1:6700"
|
|
50
|
-
access_token: "${ONEBOT11_ACCESS_TOKEN}"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## 配置
|
|
54
|
-
|
|
55
|
-
所有 Endpoint 使用 **同一 context:`onebot11`**,通过 **`connection`** 区分连接方式。
|
|
56
|
-
|
|
57
|
-
### 正向 WebSocket(connection: ws)
|
|
58
|
-
|
|
59
|
-
```yaml
|
|
60
|
-
plugins:
|
|
61
|
-
- "@zhin.js/adapter-onebot11"
|
|
62
|
-
|
|
63
|
-
endpoints:
|
|
64
|
-
- context: onebot11
|
|
65
|
-
connection: ws
|
|
66
|
-
name: my-bot
|
|
67
|
-
url: "ws://localhost:8080"
|
|
68
|
-
access_token: "${ONEBOT_TOKEN}"
|
|
69
36
|
reconnect_interval: 5000
|
|
70
37
|
heartbeat_interval: 30000
|
|
38
|
+
endpoints:
|
|
39
|
+
- name: ob11-bot
|
|
40
|
+
url: "ws://127.0.0.1:6700"
|
|
41
|
+
access_token: "${ONEBOT11_ACCESS_TOKEN}"
|
|
71
42
|
```
|
|
72
43
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
```yaml
|
|
76
|
-
plugins:
|
|
77
|
-
- "@zhin.js/host-router"
|
|
78
|
-
- "@zhin.js/adapter-onebot11"
|
|
79
|
-
|
|
80
|
-
endpoints:
|
|
81
|
-
- context: onebot11
|
|
82
|
-
connection: wss
|
|
83
|
-
name: my-bot
|
|
84
|
-
path: "/onebot/ws"
|
|
85
|
-
access_token: "${ONEBOT_TOKEN}"
|
|
86
|
-
heartbeat_interval: 30000
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
兼容旧配置:若使用 `type: 'ws'` / `type: 'ws_reverse'` 而未写 `connection`,适配器会自动映射为 `ws` / `wss`。
|
|
90
|
-
|
|
91
|
-
## 支持的 OneBot 实现
|
|
92
|
-
|
|
93
|
-
### 推荐实现
|
|
94
|
-
|
|
95
|
-
| 实现 | 协议支持 | 稳定性 | 推荐度 |
|
|
96
|
-
|------|---------|--------|--------|
|
|
97
|
-
| [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) | ✅ 完整 | ⭐⭐⭐⭐⭐ | 高 |
|
|
98
|
-
| [LagrangeGo](https://github.com/LagrangeDev/Lagrange.Core) | ✅ 完整 | ⭐⭐⭐⭐ | 高 |
|
|
99
|
-
| [Shamrock](https://github.com/whitechi73/OpenShamrock) | ✅ 完整 | ⭐⭐⭐⭐ | 中 |
|
|
100
|
-
| [NapCat](https://github.com/NapNeko/NapCatQQ) | ✅ 完整 | ⭐⭐⭐⭐ | 中 |
|
|
101
|
-
|
|
102
|
-
### 配置示例
|
|
103
|
-
|
|
104
|
-
#### go-cqhttp
|
|
105
|
-
|
|
106
|
-
```yaml
|
|
107
|
-
# config.yml
|
|
108
|
-
servers:
|
|
109
|
-
- ws:
|
|
110
|
-
host: 0.0.0.0
|
|
111
|
-
port: 8080
|
|
112
|
-
access-token: "your_token_here"
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
#### Shamrock
|
|
116
|
-
|
|
117
|
-
在 Shamrock 设置中:
|
|
118
|
-
1. 启用 WebSocket 服务
|
|
119
|
-
2. 设置端口(默认 5800)
|
|
120
|
-
3. 配置 Access Token(可选)
|
|
44
|
+
根插件 `zhin.plugins`(或项目图)需引用 `@zhin.js/adapter-onebot11`(`instanceKey: onebot11`)。
|
|
121
45
|
|
|
122
|
-
##
|
|
46
|
+
## 连接方式
|
|
123
47
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
addCommand(new MessageCommand('hello <name:text>')
|
|
130
|
-
.action(async (message, result) => {
|
|
131
|
-
return `你好,${result.params.name}!`
|
|
132
|
-
})
|
|
133
|
-
)
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### 群聊消息
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
import { onGroupMessage } from 'zhin.js'
|
|
140
|
-
|
|
141
|
-
onGroupMessage(async (message) => {
|
|
142
|
-
console.log(`群 ${message.$channel.id} 收到消息`)
|
|
143
|
-
await message.$reply('收到了!')
|
|
144
|
-
})
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### 私聊消息
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
import { onPrivateMessage } from 'zhin.js'
|
|
151
|
-
|
|
152
|
-
onPrivateMessage(async (message) => {
|
|
153
|
-
await message.$reply('你好!')
|
|
154
|
-
})
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### 发送图片
|
|
158
|
-
|
|
159
|
-
```typescript
|
|
160
|
-
addCommand(new MessageCommand('pic <url:text>')
|
|
161
|
-
.action(async (message, result) => {
|
|
162
|
-
return [
|
|
163
|
-
{ type: 'image', data: { file: result.params.url } }
|
|
164
|
-
]
|
|
165
|
-
})
|
|
166
|
-
)
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 使用 CQ 码
|
|
170
|
-
|
|
171
|
-
```typescript
|
|
172
|
-
addCommand(new MessageCommand('cq')
|
|
173
|
-
.action(async (message) => {
|
|
174
|
-
return [
|
|
175
|
-
{ type: 'face', data: { id: '123' } },
|
|
176
|
-
{ type: 'text', data: { text: '表情' } }
|
|
177
|
-
]
|
|
178
|
-
})
|
|
179
|
-
)
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## 消息类型支持
|
|
183
|
-
|
|
184
|
-
### 接收消息类型
|
|
185
|
-
|
|
186
|
-
- ✅ 文本消息(text)
|
|
187
|
-
- ✅ 图片消息(image)
|
|
188
|
-
- ✅ 语音消息(record)
|
|
189
|
-
- ✅ 视频消息(video)
|
|
190
|
-
- ✅ @ 提及(at)
|
|
191
|
-
- ✅ 表情(face)
|
|
192
|
-
- ✅ 引用回复(reply)
|
|
193
|
-
- ✅ 戳一戳(poke)
|
|
194
|
-
- ✅ 分享(share)
|
|
195
|
-
- ✅ 位置(location)
|
|
196
|
-
- ✅ 音乐分享(music)
|
|
197
|
-
- ✅ JSON 卡片(json)
|
|
198
|
-
- ✅ XML 卡片(xml)
|
|
199
|
-
|
|
200
|
-
### 发送消息类型
|
|
201
|
-
|
|
202
|
-
- ✅ 文本消息
|
|
203
|
-
- ✅ 图片消息(支持 URL、Base64、本地文件)
|
|
204
|
-
- ✅ 语音消息
|
|
205
|
-
- ✅ 视频消息
|
|
206
|
-
- ✅ @ 提及
|
|
207
|
-
- ✅ 表情
|
|
208
|
-
- ✅ 引用回复
|
|
209
|
-
- ✅ 戳一戳
|
|
210
|
-
- ✅ 分享卡片
|
|
211
|
-
- ✅ 音乐分享
|
|
212
|
-
- ✅ JSON/XML 卡片
|
|
213
|
-
|
|
214
|
-
## API 方法
|
|
215
|
-
|
|
216
|
-
### 消息相关
|
|
217
|
-
|
|
218
|
-
```typescript
|
|
219
|
-
const endpoint = app.adapters.get('onebot11')?.endpoints.get('my-bot')
|
|
220
|
-
|
|
221
|
-
// 发送群消息
|
|
222
|
-
await endpoint.callApi('send_group_msg', {
|
|
223
|
-
group_id: 123456,
|
|
224
|
-
message: '消息内容'
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
// 发送私聊消息
|
|
228
|
-
await endpoint.callApi('send_private_msg', {
|
|
229
|
-
user_id: 123456,
|
|
230
|
-
message: '消息内容'
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
// 撤回消息
|
|
234
|
-
await endpoint.callApi('delete_msg', {
|
|
235
|
-
message_id: 123456
|
|
236
|
-
})
|
|
237
|
-
```
|
|
48
|
+
| connection | 状态 |
|
|
49
|
+
|------------|----------------|
|
|
50
|
+
| `ws` | 已实现(推荐) |
|
|
51
|
+
| `wss` | 已实现:反向 WS(`httpHostToken`) |
|
|
238
52
|
|
|
239
|
-
|
|
53
|
+
## 鉴权
|
|
240
54
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const loginInfo = await endpoint.callApi('get_login_info')
|
|
55
|
+
- **Bearer**:`Authorization: Bearer <access_token>`
|
|
56
|
+
- 正向 WS 在 Upgrade 时附带请求头,并在 URL query 写入 `access_token`
|
|
244
57
|
|
|
245
|
-
|
|
246
|
-
const userInfo = await endpoint.callApi('get_stranger_info', {
|
|
247
|
-
user_id: 123456
|
|
248
|
-
})
|
|
58
|
+
## 动作与事件
|
|
249
59
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
group_id: 123456
|
|
253
|
-
})
|
|
254
|
-
|
|
255
|
-
// 获取群成员列表
|
|
256
|
-
const memberList = await endpoint.callApi('get_group_member_list', {
|
|
257
|
-
group_id: 123456
|
|
258
|
-
})
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
### 群管理
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
// 踢出群成员
|
|
265
|
-
await endpoint.callApi('set_group_kick', {
|
|
266
|
-
group_id: 123456,
|
|
267
|
-
user_id: 654321
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
// 禁言群成员
|
|
271
|
-
await endpoint.callApi('set_group_ban', {
|
|
272
|
-
group_id: 123456,
|
|
273
|
-
user_id: 654321,
|
|
274
|
-
duration: 600 // 秒
|
|
275
|
-
})
|
|
276
|
-
|
|
277
|
-
// 设置群名片
|
|
278
|
-
await endpoint.callApi('set_group_card', {
|
|
279
|
-
group_id: 123456,
|
|
280
|
-
user_id: 654321,
|
|
281
|
-
card: '新名片'
|
|
282
|
-
})
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
## 连接模式对比
|
|
286
|
-
|
|
287
|
-
### 正向 WebSocket(客户端模式)
|
|
288
|
-
|
|
289
|
-
**优点:**
|
|
290
|
-
- ✅ 配置简单
|
|
291
|
-
- ✅ 主动连接,无需开放端口
|
|
292
|
-
- ✅ 适合本地开发
|
|
293
|
-
|
|
294
|
-
**缺点:**
|
|
295
|
-
- ❌ 需要 OneBot 实现提供 WebSocket 服务
|
|
296
|
-
|
|
297
|
-
### 反向 WebSocket(服务器模式)
|
|
298
|
-
|
|
299
|
-
**优点:**
|
|
300
|
-
- ✅ OneBot 实现主动连接
|
|
301
|
-
- ✅ 支持多个客户端连接
|
|
302
|
-
- ✅ 适合生产环境
|
|
303
|
-
|
|
304
|
-
**缺点:**
|
|
305
|
-
- ❌ 需要开放端口或使用内网穿透
|
|
306
|
-
- ❌ 配置相对复杂
|
|
307
|
-
|
|
308
|
-
## 消息 ID 格式
|
|
309
|
-
|
|
310
|
-
OneBot11 适配器的消息 ID 格式:`{message_id}`
|
|
311
|
-
|
|
312
|
-
撤回消息时直接使用数字 ID。
|
|
313
|
-
|
|
314
|
-
## 注意事项
|
|
315
|
-
|
|
316
|
-
### Access Token
|
|
317
|
-
|
|
318
|
-
建议配置 Access Token 增强安全性:
|
|
319
|
-
```typescript
|
|
320
|
-
{
|
|
321
|
-
access_token: process.env.ONEBOT_TOKEN
|
|
322
|
-
}
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
OneBot 实现需要配置相同的 Token。
|
|
326
|
-
|
|
327
|
-
### 重连机制
|
|
328
|
-
|
|
329
|
-
适配器会自动重连,可配置重连间隔:
|
|
330
|
-
```typescript
|
|
331
|
-
{
|
|
332
|
-
reconnect_interval: 5000 // 5秒后重连
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
### 心跳检测
|
|
337
|
-
|
|
338
|
-
心跳机制确保连接活跃:
|
|
339
|
-
```typescript
|
|
340
|
-
{
|
|
341
|
-
heartbeat_interval: 30000 // 30秒发送一次心跳
|
|
342
|
-
}
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
### API 超时
|
|
346
|
-
|
|
347
|
-
API 调用默认 30 秒超时,可在代码中调整。
|
|
348
|
-
|
|
349
|
-
## 故障排查
|
|
350
|
-
|
|
351
|
-
### 连接不上 OneBot 服务
|
|
352
|
-
|
|
353
|
-
1. OneBot 服务是否已启动
|
|
354
|
-
2. WebSocket 地址(`url`)或反向路径(`path`)是否正确
|
|
355
|
-
3. `access_token` 是否与实现侧一致
|
|
356
|
-
4. 防火墙是否阻止连接
|
|
357
|
-
|
|
358
|
-
### 消息发送失败
|
|
359
|
-
|
|
360
|
-
1. QQ 未登录或登录失效
|
|
361
|
-
2. 账号风控限制
|
|
362
|
-
3. 群/好友不存在
|
|
363
|
-
4. 消息段格式错误
|
|
364
|
-
|
|
365
|
-
### 反向 WS 无法连接
|
|
366
|
-
|
|
367
|
-
1. `@zhin.js/host-router` 已启用且 HTTP 服务正常
|
|
368
|
-
2. `path` 与 OneBot 实现配置的反向 WS 地址一致
|
|
369
|
-
3. 端口已从公网或内网可达
|
|
370
|
-
|
|
371
|
-
### CQ 码与消息段
|
|
372
|
-
|
|
373
|
-
适配器自动处理 CQ 码转换;发送时使用消息段格式即可:
|
|
374
|
-
|
|
375
|
-
```typescript
|
|
376
|
-
[
|
|
377
|
-
{ type: 'text', data: { text: '文本' } },
|
|
378
|
-
{ type: 'image', data: { file: 'url' } }
|
|
379
|
-
]
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
## 文档链接
|
|
383
|
-
|
|
384
|
-
- [OneBot v11 适配器文档](https://zhin.js.org/adapters/onebot11)
|
|
385
|
-
- [适配器概览](https://zhin.js.org/essentials/adapters)
|
|
386
|
-
- [OneBot 11 标准](https://github.com/botuniverse/onebot-11)
|
|
387
|
-
|
|
388
|
-
## 相关链接
|
|
389
|
-
|
|
390
|
-
- [OneBot 标准](https://github.com/botuniverse/onebot-11)
|
|
391
|
-
- [go-cqhttp](https://github.com/Mrs4s/go-cqhttp)
|
|
392
|
-
- [LagrangeGo](https://github.com/LagrangeDev/Lagrange.Core)
|
|
393
|
-
- [Shamrock](https://github.com/whitechi73/OpenShamrock)
|
|
394
|
-
|
|
395
|
-
## 依赖项
|
|
396
|
-
|
|
397
|
-
- `ws` - WebSocket 客户端/服务器库
|
|
398
|
-
- `zhin.js` - Zhin 核心框架
|
|
60
|
+
- 事件:`post_type`(message/notice/request/meta_event)、`message_type`、`message` 等
|
|
61
|
+
- 动作:`send_private_msg`、`send_group_msg`、`delete_msg`、`set_group_special_title` 等
|
|
399
62
|
|
|
400
63
|
## AI 工具
|
|
401
64
|
|
|
402
65
|
| 类别 | 路径 |
|
|
403
66
|
|------|------|
|
|
404
67
|
| Permit 词汇 | `agent/PERMITS.md` |
|
|
405
|
-
|
|
|
68
|
+
| 平台工具 | `agent/tools/set_title.ts` → `onebot11_set_title` |
|
|
406
69
|
| 技能说明 | `agent/skills/onebot11.md` |
|
|
407
|
-
| 群管标准工具 | `createSceneManagementTools()` |
|
|
408
70
|
|
|
71
|
+
## 迁移说明(Plugin Runtime)
|
|
409
72
|
|
|
410
|
-
|
|
73
|
+
- **notice / request 侧事件已移除**:旧 Adapter 对 `post_type: notice|request` 构建 `notice.receive` / `request.receive` 事件;新 Plugin Runtime(`messageGatewayToken`)暂无侧事件总线,入站仅处理 `post_type: message`,notice / request 事件静默丢弃。
|
|
74
|
+
- **群管工具暂未迁移**:旧 Adapter 经 `createSceneManagementTools` 注册踢人 / 禁言 / 群名片等成套 agent 工具;迁移后仅保留 `onebot11_set_title`,其余群管能力可通过 `callApi`(如 `set_group_kick`、`set_group_ban`)作为逃生舱调用。
|
|
75
|
+
- **平台权限门禁**:`plugin.ts` setup 已注册 `registerDefaultScenePlatformPermitChecker('onebot11')`,`scene_admin` / `scene_owner` 依据入站 metadata 中的 sender `role`(owner / admin)判定。
|
|
411
76
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
77
|
+
## 文档链接
|
|
78
|
+
|
|
79
|
+
- [OneBot 11 标准](https://github.com/botuniverse/onebot-11)
|
|
80
|
+
- [适配器概览](https://zhin.js.org/essentials/adapters)
|
|
416
81
|
|
|
417
82
|
## 许可证
|
|
418
83
|
|
|
419
84
|
MIT License
|
|
420
|
-
|
|
421
|
-
## 贡献
|
|
422
|
-
|
|
423
|
-
欢迎提交 Issue 和 Pull Request!
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convention entry: discover `adapters/onebot11.ts` → defineAdapter.
|
|
3
|
+
*/
|
|
4
|
+
import { defineAdapter } from '@zhin.js/adapter';
|
|
5
|
+
import { messageGatewayToken } from '@zhin.js/core/runtime';
|
|
6
|
+
import { httpHostToken } from '@zhin.js/host-http';
|
|
7
|
+
import { OneBot11WsEndpoint } from '../src/ws-endpoint.js';
|
|
8
|
+
import { OneBot11WssEndpoint } from '../src/wss-endpoint.js';
|
|
9
|
+
import {
|
|
10
|
+
resolveOneBot11Config,
|
|
11
|
+
type OneBot11AdapterConfig,
|
|
12
|
+
} from '../src/protocol.js';
|
|
13
|
+
|
|
14
|
+
export { OneBot11WsEndpoint } from '../src/ws-endpoint.js';
|
|
15
|
+
export type { OneBot11WsEndpointOptions } from '../src/ws-endpoint.js';
|
|
16
|
+
export { OneBot11WssEndpoint } from '../src/wss-endpoint.js';
|
|
17
|
+
export type { OneBot11WssEndpointOptions } from '../src/wss-endpoint.js';
|
|
18
|
+
export type { OneBot11WsSocket, OneBot11WsCreateOptions } from '../src/ws-types.js';
|
|
19
|
+
|
|
20
|
+
export default defineAdapter<OneBot11AdapterConfig>({
|
|
21
|
+
capabilities: ['inbound', 'outbound'],
|
|
22
|
+
create(context) {
|
|
23
|
+
const config = resolveOneBot11Config(context.config);
|
|
24
|
+
const gateway = context.use(messageGatewayToken);
|
|
25
|
+
if (config.connection === 'wss') {
|
|
26
|
+
return new OneBot11WssEndpoint({
|
|
27
|
+
id: context.id,
|
|
28
|
+
gateway,
|
|
29
|
+
http: context.use(httpHostToken),
|
|
30
|
+
config,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return new OneBot11WsEndpoint({
|
|
34
|
+
id: context.id,
|
|
35
|
+
gateway,
|
|
36
|
+
config,
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
});
|
package/agent/tools/set_title.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineAgentTool } from '@zhin.js/agent/tools';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { getOnebot11AgentDeps } from '../../src/onebot11-agent-deps.js';
|
|
4
|
-
export default
|
|
4
|
+
export default defineAgentTool<{ endpoint_id: string; group_id: number; user_id: number; title: string }>({
|
|
5
5
|
description: '设置 QQ 群成员的专属头衔。只有群主才能设置。',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
endpoint_id: z.string().describe('Endpoint 名称'),
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { buildSendAction, buildWsConnectOptions, extractQuoteId, formatInboundContent, formatInboundMetadata, formatInboundTarget, formatOutboundSegments, getChannelId, isMessageEvent, isOneBot11BotMentioned, parseSendTarget, resolveOneBot11Config, senderDisplayName, senderNickname, senderUserId, type OneBot11ActionRequest, type OneBot11ActionResponse, type OneBot11AdapterConfig, type OneBot11ConfigBase, type OneBot11EndpointConfig, type OneBot11Event, type OneBot11Segment, type OneBot11Sender, type OneBot11WireSegment, type OneBot11WsConfig, type OneBot11WssConfig, type ParsedSendTarget, type ResolvedOneBot11Config, } from './protocol.js';
|
|
2
|
+
export { OneBot11WsEndpoint, type OneBot11WsEndpointOptions, } from './ws-endpoint.js';
|
|
3
|
+
export { OneBot11WssEndpoint, type OneBot11WssEndpointOptions, } from './wss-endpoint.js';
|
|
4
|
+
export type { OneBot11WsSocket, OneBot11WsCreateOptions } from './ws-types.js';
|
|
5
|
+
export { callOneBot11WsAction, decodeWsPayload, handleOneBot11WsMessage, rejectAllPending, startOneBot11Heartbeat, } from './ws-transport.js';
|
|
6
|
+
export { verifyOneBotAccessToken } from './wss-auth.js';
|
|
7
|
+
export { getOnebot11AgentDeps, registerOnebot11AgentEndpoint, setOnebot11AgentDeps, type Onebot11AgentDeps, type Onebot11AgentEndpoint, } from './onebot11-agent-deps.js';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { buildSendAction, buildWsConnectOptions, extractQuoteId, formatInboundContent, formatInboundMetadata, formatInboundTarget, formatOutboundSegments, getChannelId, isMessageEvent, isOneBot11BotMentioned, parseSendTarget, resolveOneBot11Config, senderDisplayName, senderNickname, senderUserId, } from './protocol.js';
|
|
2
|
+
export { OneBot11WsEndpoint, } from './ws-endpoint.js';
|
|
3
|
+
export { OneBot11WssEndpoint, } from './wss-endpoint.js';
|
|
4
|
+
export { callOneBot11WsAction, decodeWsPayload, handleOneBot11WsMessage, rejectAllPending, startOneBot11Heartbeat, } from './ws-transport.js';
|
|
5
|
+
export { verifyOneBotAccessToken } from './wss-auth.js';
|
|
6
|
+
export { getOnebot11AgentDeps, registerOnebot11AgentEndpoint, setOnebot11AgentDeps, } from './onebot11-agent-deps.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent tool deps for onebot11 (set_title etc.).
|
|
3
|
+
* Endpoints register themselves on start; tools look up by config name / endpoint id.
|
|
4
|
+
*/
|
|
5
|
+
export interface Onebot11AgentEndpoint {
|
|
6
|
+
setTitle(groupId: number, userId: number, title: string, duration?: number): Promise<boolean>;
|
|
7
|
+
callApi(action: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface Onebot11AgentDeps {
|
|
10
|
+
getEndpoint: (endpointId: string) => Onebot11AgentEndpoint;
|
|
11
|
+
}
|
|
12
|
+
export declare function registerOnebot11AgentEndpoint(endpointId: string, endpoint: Onebot11AgentEndpoint): () => void;
|
|
13
|
+
/** Optional override used by tests / transitional callers. */
|
|
14
|
+
export declare function setOnebot11AgentDeps(deps: Onebot11AgentDeps): void;
|
|
15
|
+
export declare function getOnebot11AgentDeps(): Onebot11AgentDeps;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent tool deps for onebot11 (set_title etc.).
|
|
3
|
+
* Endpoints register themselves on start; tools look up by config name / endpoint id.
|
|
4
|
+
*/
|
|
5
|
+
const endpoints = new Map();
|
|
6
|
+
let override = null;
|
|
7
|
+
export function registerOnebot11AgentEndpoint(endpointId, endpoint) {
|
|
8
|
+
endpoints.set(endpointId, endpoint);
|
|
9
|
+
return () => {
|
|
10
|
+
if (endpoints.get(endpointId) === endpoint) {
|
|
11
|
+
endpoints.delete(endpointId);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Optional override used by tests / transitional callers. */
|
|
16
|
+
export function setOnebot11AgentDeps(deps) {
|
|
17
|
+
override = deps;
|
|
18
|
+
}
|
|
19
|
+
export function getOnebot11AgentDeps() {
|
|
20
|
+
if (override)
|
|
21
|
+
return override;
|
|
22
|
+
return {
|
|
23
|
+
getEndpoint(endpointId) {
|
|
24
|
+
const registered = endpoints.get(endpointId);
|
|
25
|
+
if (!registered)
|
|
26
|
+
throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
27
|
+
return registered;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|