@gakr-gakr/qqbot 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/api.ts +56 -0
- package/autobot.plugin.json +167 -0
- package/channel-plugin-api.ts +1 -0
- package/index.ts +33 -0
- package/package.json +64 -0
- package/runtime-api.ts +9 -0
- package/secret-contract-api.ts +5 -0
- package/setup-entry.ts +13 -0
- package/setup-plugin-api.ts +3 -0
- package/skills/qqbot-channel/SKILL.md +262 -0
- package/skills/qqbot-channel/references/api_references.md +521 -0
- package/skills/qqbot-media/SKILL.md +37 -0
- package/skills/qqbot-remind/SKILL.md +153 -0
- package/src/bridge/approval/capability.ts +225 -0
- package/src/bridge/approval/handler-runtime.ts +204 -0
- package/src/bridge/bootstrap.ts +135 -0
- package/src/bridge/channel-entry.ts +18 -0
- package/src/bridge/commands/framework-context-adapter.ts +60 -0
- package/src/bridge/commands/framework-registration.ts +66 -0
- package/src/bridge/commands/from-parser.ts +60 -0
- package/src/bridge/commands/result-dispatcher.ts +76 -0
- package/src/bridge/config-shared.ts +132 -0
- package/src/bridge/config.ts +176 -0
- package/src/bridge/gateway.ts +178 -0
- package/src/bridge/logger.ts +31 -0
- package/src/bridge/narrowing.ts +31 -0
- package/src/bridge/plugin-version.ts +102 -0
- package/src/bridge/runtime.ts +25 -0
- package/src/bridge/sdk-adapter.ts +164 -0
- package/src/bridge/setup/finalize.ts +144 -0
- package/src/bridge/setup/surface.ts +34 -0
- package/src/bridge/tools/channel.ts +58 -0
- package/src/bridge/tools/index.ts +15 -0
- package/src/bridge/tools/remind.ts +91 -0
- package/src/channel.setup.ts +33 -0
- package/src/channel.ts +399 -0
- package/src/config-schema.ts +84 -0
- package/src/engine/access/index.ts +2 -0
- package/src/engine/access/resolve-policy.ts +30 -0
- package/src/engine/access/sender-match.ts +55 -0
- package/src/engine/access/types.ts +2 -0
- package/src/engine/adapter/audio.port.ts +27 -0
- package/src/engine/adapter/commands.port.ts +22 -0
- package/src/engine/adapter/history.port.ts +52 -0
- package/src/engine/adapter/index.ts +76 -0
- package/src/engine/adapter/mention-gate.port.ts +50 -0
- package/src/engine/adapter/types.ts +38 -0
- package/src/engine/api/api-client.ts +212 -0
- package/src/engine/api/media-chunked.ts +644 -0
- package/src/engine/api/media.ts +218 -0
- package/src/engine/api/messages.ts +293 -0
- package/src/engine/api/retry.ts +217 -0
- package/src/engine/api/routes.ts +95 -0
- package/src/engine/api/token.ts +277 -0
- package/src/engine/approval/index.ts +224 -0
- package/src/engine/commands/builtin/log-helpers.ts +341 -0
- package/src/engine/commands/builtin/register-all.ts +17 -0
- package/src/engine/commands/builtin/register-approve.ts +201 -0
- package/src/engine/commands/builtin/register-basic.ts +95 -0
- package/src/engine/commands/builtin/register-clear-storage.ts +187 -0
- package/src/engine/commands/builtin/register-logs.ts +20 -0
- package/src/engine/commands/builtin/register-streaming.ts +138 -0
- package/src/engine/commands/builtin/state.ts +31 -0
- package/src/engine/commands/slash-command-auth.ts +88 -0
- package/src/engine/commands/slash-command-handler.ts +168 -0
- package/src/engine/commands/slash-command-test-support.ts +39 -0
- package/src/engine/commands/slash-commands-impl.ts +61 -0
- package/src/engine/commands/slash-commands.ts +202 -0
- package/src/engine/config/credential-backup.ts +108 -0
- package/src/engine/config/credentials.ts +76 -0
- package/src/engine/config/group.ts +227 -0
- package/src/engine/config/resolve.ts +283 -0
- package/src/engine/config/setup-logic.ts +84 -0
- package/src/engine/gateway/active-cfg.ts +52 -0
- package/src/engine/gateway/codec.ts +47 -0
- package/src/engine/gateway/constants.ts +117 -0
- package/src/engine/gateway/event-dispatcher.ts +177 -0
- package/src/engine/gateway/gateway-connection.ts +356 -0
- package/src/engine/gateway/gateway.ts +267 -0
- package/src/engine/gateway/inbound-attachments.ts +360 -0
- package/src/engine/gateway/inbound-context.ts +82 -0
- package/src/engine/gateway/inbound-pipeline.ts +171 -0
- package/src/engine/gateway/interaction-handler.ts +345 -0
- package/src/engine/gateway/message-queue.ts +404 -0
- package/src/engine/gateway/outbound-dispatch.ts +590 -0
- package/src/engine/gateway/reconnect.ts +199 -0
- package/src/engine/gateway/stages/access-stage.ts +99 -0
- package/src/engine/gateway/stages/assembly-stage.ts +156 -0
- package/src/engine/gateway/stages/content-stage.ts +77 -0
- package/src/engine/gateway/stages/envelope-stage.ts +144 -0
- package/src/engine/gateway/stages/group-gate-stage.ts +223 -0
- package/src/engine/gateway/stages/index.ts +18 -0
- package/src/engine/gateway/stages/quote-stage.ts +113 -0
- package/src/engine/gateway/stages/refidx-stage.ts +62 -0
- package/src/engine/gateway/stages/stub-contexts.ts +77 -0
- package/src/engine/gateway/types.ts +230 -0
- package/src/engine/gateway/typing-keepalive.ts +102 -0
- package/src/engine/gateway/ws-client.ts +16 -0
- package/src/engine/group/activation.ts +88 -0
- package/src/engine/group/history.ts +321 -0
- package/src/engine/group/mention.ts +114 -0
- package/src/engine/group/message-gating.ts +108 -0
- package/src/engine/messaging/decode-media-path.ts +82 -0
- package/src/engine/messaging/media-source.ts +210 -0
- package/src/engine/messaging/media-type-detect.ts +27 -0
- package/src/engine/messaging/outbound-audio-port.ts +38 -0
- package/src/engine/messaging/outbound-deliver.ts +810 -0
- package/src/engine/messaging/outbound-media-send.ts +658 -0
- package/src/engine/messaging/outbound-reply.ts +27 -0
- package/src/engine/messaging/outbound-result-helpers.ts +54 -0
- package/src/engine/messaging/outbound-types.ts +47 -0
- package/src/engine/messaging/outbound.ts +485 -0
- package/src/engine/messaging/reply-dispatcher.ts +597 -0
- package/src/engine/messaging/reply-limiter.ts +164 -0
- package/src/engine/messaging/sender.ts +741 -0
- package/src/engine/messaging/streaming-c2c.ts +1192 -0
- package/src/engine/messaging/streaming-media-send.ts +544 -0
- package/src/engine/messaging/target-parser.ts +104 -0
- package/src/engine/ref/format-message-ref.ts +142 -0
- package/src/engine/ref/format-ref-entry.ts +27 -0
- package/src/engine/ref/store.ts +211 -0
- package/src/engine/ref/types.ts +27 -0
- package/src/engine/session/known-users.ts +138 -0
- package/src/engine/session/session-store.ts +207 -0
- package/src/engine/tools/channel-api.ts +244 -0
- package/src/engine/tools/remind-logic.ts +377 -0
- package/src/engine/types.ts +313 -0
- package/src/engine/utils/attachment-tags.ts +174 -0
- package/src/engine/utils/audio.ts +525 -0
- package/src/engine/utils/data-paths.ts +38 -0
- package/src/engine/utils/diagnostics.ts +93 -0
- package/src/engine/utils/file-utils.ts +215 -0
- package/src/engine/utils/format.ts +70 -0
- package/src/engine/utils/image-size.ts +249 -0
- package/src/engine/utils/log.ts +77 -0
- package/src/engine/utils/media-tags.ts +177 -0
- package/src/engine/utils/payload.ts +157 -0
- package/src/engine/utils/platform.ts +265 -0
- package/src/engine/utils/request-context.ts +60 -0
- package/src/engine/utils/string-normalize.ts +91 -0
- package/src/engine/utils/stt.ts +103 -0
- package/src/engine/utils/text-parsing.ts +155 -0
- package/src/engine/utils/upload-cache.ts +96 -0
- package/src/engine/utils/voice-text.ts +15 -0
- package/src/exec-approvals.ts +237 -0
- package/src/qqbot-test-support.ts +29 -0
- package/src/secret-contract.ts +82 -0
- package/src/types.ts +210 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
# QQ 频道 API 完整参考
|
|
2
|
+
|
|
3
|
+
本文档包含 QQ 开放平台频道相关所有接口的详细参数说明、返回值结构和枚举值定义。
|
|
4
|
+
|
|
5
|
+
通过 `qqbot_channel_api` 工具代理请求,工具自动处理鉴权。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📌 通用说明
|
|
10
|
+
|
|
11
|
+
### 基础 URL
|
|
12
|
+
|
|
13
|
+
`https://api.sgroup.qq.com`
|
|
14
|
+
|
|
15
|
+
### 鉴权(自动处理)
|
|
16
|
+
|
|
17
|
+
工具自动填充以下请求头,无需手动设置:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Authorization: QQBot {access_token}
|
|
21
|
+
Content-Type: application/json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 错误返回格式
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"message": "错误描述",
|
|
29
|
+
"code": 错误码
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 📦 返回值类型定义
|
|
36
|
+
|
|
37
|
+
### Guild(频道)
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
interface Guild {
|
|
41
|
+
id: string; // 频道 ID
|
|
42
|
+
name: string; // 频道名称
|
|
43
|
+
icon: string; // 频道头像 URL
|
|
44
|
+
owner_id: string; // 频道拥有者 ID
|
|
45
|
+
owner: boolean; // 机器人是否为频道拥有者
|
|
46
|
+
joined_at: string; // 机器人加入时间(ISO 8601)
|
|
47
|
+
member_count: number; // 频道成员数
|
|
48
|
+
max_members: number; // 频道最大成员数
|
|
49
|
+
description: string; // 频道描述
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Channel(子频道)
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
interface Channel {
|
|
57
|
+
id: string; // 子频道 ID
|
|
58
|
+
guild_id: string; // 所属频道 ID
|
|
59
|
+
name: string; // 子频道名称
|
|
60
|
+
type: number; // 子频道类型(见枚举)
|
|
61
|
+
position: number; // 排序位置
|
|
62
|
+
parent_id: string; // 所属分组 ID
|
|
63
|
+
owner_id: string; // 创建者 ID
|
|
64
|
+
sub_type: number; // 子类型(见枚举)
|
|
65
|
+
private_type?: number; // 私密类型(见枚举)
|
|
66
|
+
speak_permission?: number; // 发言权限(见枚举)
|
|
67
|
+
application_id?: string; // 应用子频道 AppID
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### User(用户)
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
interface User {
|
|
75
|
+
id: string; // 用户 ID
|
|
76
|
+
username: string; // 用户名
|
|
77
|
+
avatar: string; // 头像 URL
|
|
78
|
+
bot: boolean; // 是否为机器人
|
|
79
|
+
union_openid?: string; // 特殊关联应用的 openid
|
|
80
|
+
union_user_account?: string; // 特殊关联应用的用户信息
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Member(成员)
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
interface Member {
|
|
88
|
+
user: User; // 用户基本信息
|
|
89
|
+
nick: string; // 在频道中的昵称
|
|
90
|
+
roles: string[]; // 身份组 ID 列表
|
|
91
|
+
joined_at: string; // 加入频道时间(ISO 8601)
|
|
92
|
+
deaf?: boolean; // 是否被禁言
|
|
93
|
+
mute?: boolean; // 是否被闭麦
|
|
94
|
+
pending?: boolean; // 是否待审核
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### APIPermission(API 权限)
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
interface APIPermission {
|
|
102
|
+
path: string; // 接口路径
|
|
103
|
+
method: string; // 请求方法
|
|
104
|
+
desc: string; // 接口描述
|
|
105
|
+
auth_status: number; // 授权状态:0=未授权, 1=已授权
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### AnnouncesResult(公告结果)
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
interface AnnouncesResult {
|
|
113
|
+
guild_id: string;
|
|
114
|
+
channel_id: string;
|
|
115
|
+
message_id: string;
|
|
116
|
+
announces_type: number;
|
|
117
|
+
recommend_channels: RecommendChannel[];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
interface RecommendChannel {
|
|
121
|
+
channel_id: string; // 推荐的子频道 ID
|
|
122
|
+
introduce: string; // 推荐语
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### ThreadDetail(帖子详情)
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
interface ThreadDetail {
|
|
130
|
+
thread: {
|
|
131
|
+
guild_id: string;
|
|
132
|
+
channel_id: string;
|
|
133
|
+
author_id: string;
|
|
134
|
+
thread_info: {
|
|
135
|
+
thread_id: string;
|
|
136
|
+
title: string;
|
|
137
|
+
content: string;
|
|
138
|
+
date_time: string;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### ThreadListResult(帖子列表)
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
interface ThreadListResult {
|
|
148
|
+
threads: Array<{
|
|
149
|
+
guild_id: string;
|
|
150
|
+
channel_id: string;
|
|
151
|
+
author_id: string;
|
|
152
|
+
thread_info: {
|
|
153
|
+
thread_id: string;
|
|
154
|
+
title: string;
|
|
155
|
+
content: string;
|
|
156
|
+
date_time: string;
|
|
157
|
+
};
|
|
158
|
+
}>;
|
|
159
|
+
is_finish: number; // 1=已到底, 0=还有更多
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Schedule(日程)
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
interface Schedule {
|
|
167
|
+
id?: string;
|
|
168
|
+
name: string;
|
|
169
|
+
start_timestamp: string; // 毫秒级时间戳
|
|
170
|
+
end_timestamp: string;
|
|
171
|
+
jump_channel_id?: string;
|
|
172
|
+
remind_type?: string;
|
|
173
|
+
creator?: {
|
|
174
|
+
user: { id: string; username: string; bot: boolean };
|
|
175
|
+
nick: string;
|
|
176
|
+
joined_at: string;
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 📋 枚举值定义
|
|
184
|
+
|
|
185
|
+
### 子频道类型(Channel type)
|
|
186
|
+
|
|
187
|
+
| 值 | 名称 | 说明 |
|
|
188
|
+
| ------- | ---------- | -------------------------------- |
|
|
189
|
+
| `0` | 文字子频道 | 普通文字聊天 |
|
|
190
|
+
| `2` | 语音子频道 | 语音聊天 |
|
|
191
|
+
| `4` | 子频道分组 | 组织子频道的分组(position ≥ 2) |
|
|
192
|
+
| `10005` | 直播子频道 | 直播功能 |
|
|
193
|
+
| `10006` | 应用子频道 | 需 application_id |
|
|
194
|
+
| `10007` | 论坛子频道 | 论坛功能 |
|
|
195
|
+
|
|
196
|
+
### 子频道子类型(Channel sub_type)
|
|
197
|
+
|
|
198
|
+
| 值 | 名称 |
|
|
199
|
+
| --- | ---- |
|
|
200
|
+
| `0` | 闲聊 |
|
|
201
|
+
| `1` | 公告 |
|
|
202
|
+
| `2` | 攻略 |
|
|
203
|
+
| `3` | 开黑 |
|
|
204
|
+
|
|
205
|
+
### 子频道私密类型(Channel private_type)
|
|
206
|
+
|
|
207
|
+
| 值 | 说明 |
|
|
208
|
+
| --- | -------------------- |
|
|
209
|
+
| `0` | 公开子频道 |
|
|
210
|
+
| `1` | 管理员和指定成员可见 |
|
|
211
|
+
| `2` | 仅管理员可见 |
|
|
212
|
+
|
|
213
|
+
### 子频道发言权限(Channel speak_permission)
|
|
214
|
+
|
|
215
|
+
| 值 | 说明 |
|
|
216
|
+
| --- | ------------------------------------------ |
|
|
217
|
+
| `0` | 无效(仅创建公告子频道时有效,此时为只读) |
|
|
218
|
+
| `1` | 所有人可发言 |
|
|
219
|
+
| `2` | 仅管理员和指定成员可发言 |
|
|
220
|
+
|
|
221
|
+
### 公告类型(announces_type)
|
|
222
|
+
|
|
223
|
+
| 值 | 说明 |
|
|
224
|
+
| --- | -------- |
|
|
225
|
+
| `0` | 成员公告 |
|
|
226
|
+
| `1` | 欢迎公告 |
|
|
227
|
+
|
|
228
|
+
### 帖子格式(format)
|
|
229
|
+
|
|
230
|
+
| 值 | 格式 |
|
|
231
|
+
| --- | -------------------- |
|
|
232
|
+
| `1` | 纯文本 |
|
|
233
|
+
| `2` | HTML |
|
|
234
|
+
| `3` | Markdown(**默认**) |
|
|
235
|
+
| `4` | JSON(RichText) |
|
|
236
|
+
|
|
237
|
+
### 日程提醒类型(remind_type)
|
|
238
|
+
|
|
239
|
+
| 值 | 说明 |
|
|
240
|
+
| ----- | -------------- |
|
|
241
|
+
| `"0"` | 不提醒 |
|
|
242
|
+
| `"1"` | 开始时提醒 |
|
|
243
|
+
| `"2"` | 开始前 5 分钟 |
|
|
244
|
+
| `"3"` | 开始前 15 分钟 |
|
|
245
|
+
| `"4"` | 开始前 30 分钟 |
|
|
246
|
+
| `"5"` | 开始前 60 分钟 |
|
|
247
|
+
|
|
248
|
+
### API 权限授权状态(auth_status)
|
|
249
|
+
|
|
250
|
+
| 值 | 说明 |
|
|
251
|
+
| --- | ------ |
|
|
252
|
+
| `0` | 未授权 |
|
|
253
|
+
| `1` | 已授权 |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 📖 各接口详细说明
|
|
258
|
+
|
|
259
|
+
### GET /users/@me/guilds — 获取频道列表
|
|
260
|
+
|
|
261
|
+
**查询参数**:
|
|
262
|
+
|
|
263
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
264
|
+
| -------- | ------ | ---- | ---------------------------------------------------- |
|
|
265
|
+
| `before` | string | 否 | 读此 guild id 之前的数据 |
|
|
266
|
+
| `after` | string | 否 | 读此 guild id 之后的数据(与 before 同时设置时无效) |
|
|
267
|
+
| `limit` | string | 否 | 每次拉取条数,默认 100,最大 100 |
|
|
268
|
+
|
|
269
|
+
**返回**: `Guild[]`
|
|
270
|
+
|
|
271
|
+
**调用示例**:
|
|
272
|
+
|
|
273
|
+
```json
|
|
274
|
+
{ "method": "GET", "path": "/users/@me/guilds", "query": { "limit": "100" } }
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
### GET /guilds/{guild_id}/api_permission — 获取频道 API 权限
|
|
280
|
+
|
|
281
|
+
**返回**: `{ apis: APIPermission[] }`
|
|
282
|
+
|
|
283
|
+
**调用示例**:
|
|
284
|
+
|
|
285
|
+
```json
|
|
286
|
+
{ "method": "GET", "path": "/guilds/123456/api_permission" }
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
### GET /guilds/{guild_id}/channels — 获取子频道列表
|
|
292
|
+
|
|
293
|
+
**返回**: `Channel[]`
|
|
294
|
+
|
|
295
|
+
**调用示例**:
|
|
296
|
+
|
|
297
|
+
```json
|
|
298
|
+
{ "method": "GET", "path": "/guilds/123456/channels" }
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
### GET /channels/{channel_id} — 获取子频道详情
|
|
304
|
+
|
|
305
|
+
**返回**: `Channel`
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
### POST /guilds/{guild_id}/channels — 创建子频道
|
|
310
|
+
|
|
311
|
+
> ⚠️ 仅私域机器人可用,需管理频道权限
|
|
312
|
+
|
|
313
|
+
**请求体**:
|
|
314
|
+
|
|
315
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
316
|
+
| ------------------ | -------- | ---- | ------------------------------------- |
|
|
317
|
+
| `name` | string | 是 | 子频道名称 |
|
|
318
|
+
| `type` | number | 是 | 子频道类型 |
|
|
319
|
+
| `position` | number | 是 | 排序位置(type=4 时 ≥ 2) |
|
|
320
|
+
| `sub_type` | number | 否 | 子类型 |
|
|
321
|
+
| `parent_id` | string | 否 | 所属分组 ID |
|
|
322
|
+
| `private_type` | number | 否 | 私密类型 |
|
|
323
|
+
| `private_user_ids` | string[] | 否 | 私密成员列表(private_type=1 时有效) |
|
|
324
|
+
| `speak_permission` | number | 否 | 发言权限 |
|
|
325
|
+
| `application_id` | string | 否 | 应用 AppID(type=10006 时需要) |
|
|
326
|
+
|
|
327
|
+
**返回**: `Channel`
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
### PATCH /channels/{channel_id} — 修改子频道
|
|
332
|
+
|
|
333
|
+
> ⚠️ 仅私域机器人可用
|
|
334
|
+
|
|
335
|
+
**请求体**(至少一个):
|
|
336
|
+
|
|
337
|
+
| 参数 | 类型 | 说明 |
|
|
338
|
+
| ------------------ | ------ | -------- |
|
|
339
|
+
| `name` | string | 名称 |
|
|
340
|
+
| `position` | number | 排序位置 |
|
|
341
|
+
| `parent_id` | string | 分组 ID |
|
|
342
|
+
| `private_type` | number | 私密类型 |
|
|
343
|
+
| `speak_permission` | number | 发言权限 |
|
|
344
|
+
|
|
345
|
+
**返回**: `Channel`
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
### DELETE /channels/{channel_id} — 删除子频道
|
|
350
|
+
|
|
351
|
+
> ⚠️ 不可逆!仅私域机器人可用
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
### GET /guilds/{guild_id}/members — 获取成员列表
|
|
356
|
+
|
|
357
|
+
> 仅私域机器人可用
|
|
358
|
+
|
|
359
|
+
**查询参数**:
|
|
360
|
+
|
|
361
|
+
| 参数 | 类型 | 说明 |
|
|
362
|
+
| ------- | ------ | ---------------------------------- |
|
|
363
|
+
| `after` | string | 上次最后一个 user.id,首次填 `"0"` |
|
|
364
|
+
| `limit` | string | 分页大小 1-400,默认 1 |
|
|
365
|
+
|
|
366
|
+
**返回**: `Member[]`
|
|
367
|
+
|
|
368
|
+
> 翻页:用最后一个 `user.id` 作为 `after`,直到返回空数组。可能返回重复成员,需按 `user.id` 去重。
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
### GET /guilds/{guild_id}/members/{user_id} — 获取成员详情
|
|
373
|
+
|
|
374
|
+
**返回**: `Member`
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
### GET /guilds/{guild_id}/roles/{role_id}/members — 获取身份组成员列表
|
|
379
|
+
|
|
380
|
+
> 仅私域机器人可用
|
|
381
|
+
|
|
382
|
+
**查询参数**:
|
|
383
|
+
|
|
384
|
+
| 参数 | 类型 | 说明 |
|
|
385
|
+
| ------------- | ------ | ---------------------- |
|
|
386
|
+
| `start_index` | string | 分页标识,首次填 `"0"` |
|
|
387
|
+
| `limit` | string | 分页大小 1-400,默认 1 |
|
|
388
|
+
|
|
389
|
+
**返回**: `{ data: Member[], next: string }`
|
|
390
|
+
|
|
391
|
+
> 翻页:用 `next` 作为 `start_index`,直到 `data` 为空。
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
### GET /channels/{channel_id}/online_nums — 获取在线成员数
|
|
396
|
+
|
|
397
|
+
**返回**: `{ online_nums: number }`
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
### POST /guilds/{guild_id}/announces — 创建频道公告
|
|
402
|
+
|
|
403
|
+
**请求体**:
|
|
404
|
+
|
|
405
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
406
|
+
| -------------------- | ------ | ---- | --------------------------------------------------- |
|
|
407
|
+
| `message_id` | string | 否 | 消息 ID(有值时创建消息公告,此时 channel_id 必填) |
|
|
408
|
+
| `channel_id` | string | 否 | 子频道 ID |
|
|
409
|
+
| `announces_type` | number | 否 | 0=成员公告,1=欢迎公告 |
|
|
410
|
+
| `recommend_channels` | array | 否 | 推荐子频道列表(最多 3 条,message_id 为空时生效) |
|
|
411
|
+
|
|
412
|
+
> 两种公告类型会互相顶替
|
|
413
|
+
|
|
414
|
+
**返回**: `AnnouncesResult`
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
### DELETE /guilds/{guild_id}/announces/{message_id} — 删除公告
|
|
419
|
+
|
|
420
|
+
> `message_id` 设为 `all` 删除所有公告
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
### GET /channels/{channel_id}/threads — 获取帖子列表
|
|
425
|
+
|
|
426
|
+
> 仅私域机器人可用,channel_id 须为论坛子频道(type=10007)
|
|
427
|
+
|
|
428
|
+
**返回**: `ThreadListResult`
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
### GET /channels/{channel_id}/threads/{thread_id} — 获取帖子详情
|
|
433
|
+
|
|
434
|
+
> 仅私域机器人可用
|
|
435
|
+
|
|
436
|
+
**返回**: `ThreadDetail`
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
### PUT /channels/{channel_id}/threads — 发表帖子
|
|
441
|
+
|
|
442
|
+
> 仅私域机器人可用
|
|
443
|
+
|
|
444
|
+
**请求体**:
|
|
445
|
+
|
|
446
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
447
|
+
| --------- | ------ | ---- | ------------------------------------------ |
|
|
448
|
+
| `title` | string | 是 | 帖子标题 |
|
|
449
|
+
| `content` | string | 是 | 帖子内容 |
|
|
450
|
+
| `format` | number | 否 | 1=文本, 2=HTML, 3=Markdown(默认), 4=JSON |
|
|
451
|
+
|
|
452
|
+
**返回**: `{ task_id: string, create_time: string }`
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### DELETE /channels/{channel_id}/threads/{thread_id} — 删除帖子
|
|
457
|
+
|
|
458
|
+
> ⚠️ 不可逆!仅私域机器人可用
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
### POST /channels/{channel_id}/threads/{thread_id}/comment — 发表评论
|
|
463
|
+
|
|
464
|
+
> 仅私域机器人可用
|
|
465
|
+
|
|
466
|
+
**请求体**:
|
|
467
|
+
|
|
468
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
469
|
+
| -------------------- | ------ | ---- | ------------ |
|
|
470
|
+
| `thread_author` | string | 是 | 帖子作者 ID |
|
|
471
|
+
| `content` | string | 是 | 评论内容 |
|
|
472
|
+
| `thread_create_time` | string | 否 | 帖子创建时间 |
|
|
473
|
+
| `image` | string | 否 | 图片链接 |
|
|
474
|
+
|
|
475
|
+
**返回**: `{ task_id: string, create_time: number }`
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
479
|
+
### POST /channels/{channel_id}/schedules — 创建日程
|
|
480
|
+
|
|
481
|
+
> 需要管理频道权限。单管理员/天限 10 次,单频道/天限 100 次。
|
|
482
|
+
|
|
483
|
+
**请求体**:
|
|
484
|
+
|
|
485
|
+
```json
|
|
486
|
+
{
|
|
487
|
+
"schedule": {
|
|
488
|
+
"name": "日程名称",
|
|
489
|
+
"start_timestamp": "毫秒时间戳",
|
|
490
|
+
"end_timestamp": "毫秒时间戳",
|
|
491
|
+
"jump_channel_id": "0",
|
|
492
|
+
"remind_type": "0"
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
498
|
+
| -------------------------- | ------ | ---- | ------------------------- |
|
|
499
|
+
| `schedule.name` | string | 是 | 日程名称 |
|
|
500
|
+
| `schedule.start_timestamp` | string | 是 | 开始时间(毫秒) |
|
|
501
|
+
| `schedule.end_timestamp` | string | 是 | 结束时间(毫秒) |
|
|
502
|
+
| `schedule.jump_channel_id` | string | 否 | 跳转子频道 ID,默认 `"0"` |
|
|
503
|
+
| `schedule.remind_type` | string | 否 | 提醒类型,默认 `"0"` |
|
|
504
|
+
|
|
505
|
+
**返回**: `Schedule`
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
### PATCH /channels/{channel_id}/schedules/{schedule_id} — 修改日程
|
|
510
|
+
|
|
511
|
+
> 需要管理频道权限
|
|
512
|
+
|
|
513
|
+
**请求体**:同创建日程
|
|
514
|
+
|
|
515
|
+
**返回**: `Schedule`
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
### DELETE /channels/{channel_id}/schedules/{schedule_id} — 删除日程
|
|
520
|
+
|
|
521
|
+
> ⚠️ 不可逆!需要管理频道权限
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qqbot-media
|
|
3
|
+
description: QQBot rich media send and receive support. Use <qqmedia> tags to send image, voice, video, or file attachments, with the media type inferred from the file extension.
|
|
4
|
+
metadata: { "autobot": { "emoji": "📸", "requires": { "config": ["channels.qqbot"] } } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# QQBot 富媒体收发
|
|
8
|
+
|
|
9
|
+
## 用法
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
<qqmedia>路径或URL</qqmedia>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
系统根据文件扩展名自动识别类型并路由:
|
|
16
|
+
|
|
17
|
+
- `.jpg/.png/.gif/.webp/.bmp` → 图片
|
|
18
|
+
- `.silk/.wav/.mp3/.ogg/.aac/.flac` 等 → 语音
|
|
19
|
+
- `.mp4/.mov/.avi/.mkv/.webm` 等 → 视频
|
|
20
|
+
- 其他扩展名 → 文件
|
|
21
|
+
- 无扩展名的 URL → 默认按图片处理
|
|
22
|
+
|
|
23
|
+
## 接收媒体
|
|
24
|
+
|
|
25
|
+
- 用户发来的**图片**自动下载到本地,路径在上下文【附件】中,可直接用 `<qqmedia>路径</qqmedia>` 回发
|
|
26
|
+
- 用户发来的**语音**路径在上下文中;若有 STT 能力则优先转写
|
|
27
|
+
|
|
28
|
+
## 规则
|
|
29
|
+
|
|
30
|
+
1. **路径必须是绝对路径**(以 `/` 或 `http` 开头)
|
|
31
|
+
2. **标签必须用开闭标签包裹路径**:`<qqmedia>路径</qqmedia>`
|
|
32
|
+
3. **待发送的本地文件须落在 AutoBot 媒体目录下**:生成、下载或复制出的文件应写入 **`~/.autobot/media/qqbot/`**(或其子目录),再写进 `<qqmedia>`。不要只放在 `~/.autobot/workspace/` 等工作区根目录——平台安全策略只允许从 `~/.autobot/media/`(含 `media/qqbot`)等受信根路径上传,否则会拦截、发不出去。
|
|
33
|
+
4. **文件大小上限**:图片 30MB / 视频 100MB / 文件 100MB / 语音 20MB
|
|
34
|
+
5. **你有能力发送本地图片/文件**,直接用标签包裹路径即可,**不要说"无法发送"**
|
|
35
|
+
6. 发送语音时不要重复语音中已朗读的文字
|
|
36
|
+
7. 多个媒体用多个标签
|
|
37
|
+
8. 以会话上下文中的能力说明为准(如未启用语音则不要发语音)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qqbot-remind
|
|
3
|
+
description: QQBot scheduled reminders. Create, list, and cancel one-time or recurring reminders when a QQ conversation involves reminders, alarms, or scheduled tasks.
|
|
4
|
+
metadata: { "autobot": { "emoji": "⏰", "requires": { "config": ["channels.qqbot"] } } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# QQ Bot 定时提醒
|
|
8
|
+
|
|
9
|
+
## ⚠️ 强制规则
|
|
10
|
+
|
|
11
|
+
**当用户提到「提醒」「闹钟」「定时」「X分钟/小时后」「每天X点」「叫我」等任何涉及延时或定时的请求时,你必须调用工具,绝对不能只用自然语言回复说"好的,我会提醒你"!**
|
|
12
|
+
|
|
13
|
+
你没有内存或后台线程,口头承诺"到时候提醒"是无效的——只有调用工具才能真正注册定时任务。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 推荐流程(使用 `qqbot_remind` 工具)
|
|
18
|
+
|
|
19
|
+
**第一步**:调用 `qqbot_remind` 工具,传入简单参数:
|
|
20
|
+
|
|
21
|
+
| 参数 | 说明 | 示例 |
|
|
22
|
+
| --------- | -------------------------------------------- | ---------------------------------- |
|
|
23
|
+
| `action` | 操作类型 | `"add"` / `"list"` / `"remove"` |
|
|
24
|
+
| `content` | 提醒内容 | `"喝水"` |
|
|
25
|
+
| `to` | 目标地址(可选,系统自动获取,通常无需填写) | — |
|
|
26
|
+
| `time` | 时间(相对时间或 cron 表达式) | `"5m"` / `"1h30m"` / `"0 8 * * *"` |
|
|
27
|
+
| `jobId` | 任务 ID(仅 remove) | `"xxx"` |
|
|
28
|
+
|
|
29
|
+
**第二步**:根据 `qqbot_remind` 的返回结果,回复用户。`qqbot_remind` 会直接创建、查询或取消 Gateway cron 任务;成功后不要再调用 `cron` 工具。
|
|
30
|
+
|
|
31
|
+
### 示例
|
|
32
|
+
|
|
33
|
+
用户说:"5分钟后提醒我喝水"
|
|
34
|
+
|
|
35
|
+
1. 调用 `qqbot_remind`:`{ "action": "add", "content": "喝水", "time": "5m" }`
|
|
36
|
+
2. 工具返回成功后,回复用户:`⏰ 好的,5分钟后提醒你喝水~`
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 备用方案(直接使用 `cron` 工具)
|
|
41
|
+
|
|
42
|
+
> 仅当 `qqbot_remind` 工具不可用但 `cron` 工具可用时使用以下方式。
|
|
43
|
+
|
|
44
|
+
### 核心规则
|
|
45
|
+
|
|
46
|
+
> **payload.kind 必须是 `"agentTurn"`,绝对不能用 `"systemEvent"`!**
|
|
47
|
+
> `systemEvent` 只在 AI 会话内部注入文本,用户收不到 QQ 消息。
|
|
48
|
+
|
|
49
|
+
**不可更改字段**:
|
|
50
|
+
|
|
51
|
+
| 字段 | 固定值 | 原因 |
|
|
52
|
+
| -------------------- | ------------- | ---------------------------- |
|
|
53
|
+
| `payload.kind` | `"agentTurn"` | `systemEvent` 不会发 QQ 消息 |
|
|
54
|
+
| `delivery.mode` | `"announce"` | 主动投递模式 |
|
|
55
|
+
| `delivery.channel` | `"qqbot"` | QQ 通道标识 |
|
|
56
|
+
| `delivery.to` | 目标地址 | 从当前会话上下文获取 |
|
|
57
|
+
| `delivery.accountId` | 当前账户 ID | 多账号场景下不可省略 |
|
|
58
|
+
| `sessionTarget` | `"isolated"` | 隔离会话避免污染 |
|
|
59
|
+
|
|
60
|
+
> `schedule.atMs` 必须是**绝对毫秒时间戳**(如 `1770733800000`),不支持 `"5m"` 等相对字符串。
|
|
61
|
+
> 计算方式:`当前时间戳ms + 延迟毫秒`。
|
|
62
|
+
|
|
63
|
+
### 一次性提醒(schedule.kind = "at")
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"action": "add",
|
|
68
|
+
"job": {
|
|
69
|
+
"name": "{任务名}",
|
|
70
|
+
"schedule": { "kind": "at", "atMs": "{当前时间戳ms + N*60000}" },
|
|
71
|
+
"sessionTarget": "isolated",
|
|
72
|
+
"wakeMode": "now",
|
|
73
|
+
"deleteAfterRun": true,
|
|
74
|
+
"payload": {
|
|
75
|
+
"kind": "agentTurn",
|
|
76
|
+
"message": "你是一个暖心的提醒助手。请用温暖、有趣的方式提醒用户:{提醒内容}。要求:(1) 不要回复HEARTBEAT_OK (2) 不要解释你是谁 (3) 直接输出一条暖心的提醒消息 (4) 可以加一句简短的鸡汤或关怀的话 (5) 控制在2-3句话以内 (6) 用emoji点缀"
|
|
77
|
+
},
|
|
78
|
+
"delivery": {
|
|
79
|
+
"mode": "announce",
|
|
80
|
+
"channel": "qqbot",
|
|
81
|
+
"to": "qqbot:c2c:{openid}",
|
|
82
|
+
"accountId": "{accountId}"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 周期提醒(schedule.kind = "cron")
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"action": "add",
|
|
93
|
+
"job": {
|
|
94
|
+
"name": "{任务名}",
|
|
95
|
+
"schedule": { "kind": "cron", "expr": "0 8 * * *", "tz": "Asia/Shanghai" },
|
|
96
|
+
"sessionTarget": "isolated",
|
|
97
|
+
"wakeMode": "now",
|
|
98
|
+
"payload": {
|
|
99
|
+
"kind": "agentTurn",
|
|
100
|
+
"message": "你是一个暖心的提醒助手。请用温暖、有趣的方式提醒用户:{提醒内容}。要求:(1) 不要回复HEARTBEAT_OK (2) 不要解释你是谁 (3) 直接输出一条暖心的提醒消息 (4) 可以加一句简短的鸡汤或关怀的话 (5) 控制在2-3句话以内 (6) 用emoji点缀"
|
|
101
|
+
},
|
|
102
|
+
"delivery": {
|
|
103
|
+
"mode": "announce",
|
|
104
|
+
"channel": "qqbot",
|
|
105
|
+
"to": "qqbot:c2c:{openid}",
|
|
106
|
+
"accountId": "{accountId}"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
> 周期任务**不加** `deleteAfterRun`。群聊 `delivery.to` 格式为 `"qqbot:group:{group_openid}"`。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## cron 表达式速查
|
|
117
|
+
|
|
118
|
+
| 场景 | expr |
|
|
119
|
+
| -------------- | ---------------- |
|
|
120
|
+
| 每天早上8点 | `"0 8 * * *"` |
|
|
121
|
+
| 每天晚上10点 | `"0 22 * * *"` |
|
|
122
|
+
| 工作日早上9点 | `"0 9 * * 1-5"` |
|
|
123
|
+
| 每周一早上9点 | `"0 9 * * 1"` |
|
|
124
|
+
| 每周末上午10点 | `"0 10 * * 0,6"` |
|
|
125
|
+
| 每小时整点 | `"0 * * * *"` |
|
|
126
|
+
|
|
127
|
+
> 周期提醒必须加 `"tz": "Asia/Shanghai"`。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## AI 决策指南
|
|
132
|
+
|
|
133
|
+
| 用户说法 | action | time 格式 |
|
|
134
|
+
| ------------------- | ---------------- | --------------- |
|
|
135
|
+
| "5分钟后提醒我喝水" | `add` | `"5m"` |
|
|
136
|
+
| "1小时后提醒开会" | `add` | `"1h"` |
|
|
137
|
+
| "每天8点提醒我打卡" | `add` | `"0 8 * * *"` |
|
|
138
|
+
| "工作日早上9点提醒" | `add` | `"0 9 * * 1-5"` |
|
|
139
|
+
| "我有哪些提醒" | `list` | — |
|
|
140
|
+
| "取消喝水提醒" | `remove` | — |
|
|
141
|
+
| "修改提醒时间" | `remove` → `add` | — |
|
|
142
|
+
| "提醒我"(无时间) | **需追问** | — |
|
|
143
|
+
|
|
144
|
+
纯相对时间("5分钟后"、"1小时后")可直接计算,无需确认。时间模糊或缺失时需追问。
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 回复模板
|
|
149
|
+
|
|
150
|
+
- 一次性:`⏰ 好的,{时间}后提醒你{内容}~`
|
|
151
|
+
- 周期:`⏰ 收到,{周期}提醒你{内容}~`
|
|
152
|
+
- 查询无结果:`📋 目前没有提醒哦~ 说"5分钟后提醒我xxx"试试?`
|
|
153
|
+
- 删除成功:`✅ 已取消"{名称}"`
|