@karinjs/adapter-qqbot 3.2.0 → 3.3.1
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/README.md +8 -2
- package/dist/apps/cleanup.js +1 -1
- package/dist/apps/login.js +1 -1
- package/dist/apps/qqbot-file-to-url.js +1 -1
- package/dist/{common-OHGAoohl.js → common-DwVsAvIo.js} +6 -1
- package/dist/{config-D1_LqrcJ.js → config-BgCU6apn.js} +2 -6
- package/dist/index.d.ts +315 -28
- package/dist/index.js +457 -252
- package/dist/{message-CVJVFAGR.js → message-CydR-wrX.js} +1 -1
- package/dist/utils-u17tvC2U.js +5 -0
- package/dist/web.config.d.ts +0 -1
- package/dist/web.config.js +4 -12
- package/package.json +8 -6
- package/dist/utils-C0oZi6PR.js +0 -5
package/README.md
CHANGED
|
@@ -25,7 +25,6 @@ pnpm add @karinjs/adapter-qqbot
|
|
|
25
25
|
"qqEnable": true,
|
|
26
26
|
"guildEnable": true,
|
|
27
27
|
"guildMode": 0,
|
|
28
|
-
"markdown": { "enable": true },
|
|
29
28
|
"event": { "type": 2 }
|
|
30
29
|
}
|
|
31
30
|
]
|
|
@@ -33,7 +32,14 @@ pnpm add @karinjs/adapter-qqbot
|
|
|
33
32
|
|
|
34
33
|
- `event.type`: `0` 关闭、`1` Webhook、`2` WebSocket(默认)。
|
|
35
34
|
- `guildMode`: `0` 公域,只收 @ 消息;`1` 私域,接收全部频道消息。
|
|
36
|
-
|
|
35
|
+
|
|
36
|
+
> 旧版本里的 `markdown.enable` 已移除。发送通道现在由平台能力决定,不再需要用户配置:
|
|
37
|
+
> QQ 单聊和群聊的自定义 Markdown 已对所有机器人开放,固定走 Markdown 通道;频道场景仍需向 QQ
|
|
38
|
+
> 申请内邀开通,适配器会先尝试 Markdown,被平台以权限错误拒绝后自动降级为普通消息,并记住这个
|
|
39
|
+
> 机器人,本次运行内不再重试。开通后重启 Karin(或改一次配置)即可恢复。配置文件里残留的
|
|
40
|
+
> `markdown` 字段会被忽略,下次保存配置时自动清除。
|
|
41
|
+
>
|
|
42
|
+
> 频道降级为普通消息后按钮无法发送——平台的 `keyboard` 只能挂在 Markdown 消息上。
|
|
37
43
|
|
|
38
44
|
## 按钮
|
|
39
45
|
|
package/dist/apps/cleanup.js
CHANGED
package/dist/apps/login.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as getDefaultConfig, n as config, o as writeConfig } from "../config-
|
|
1
|
+
import { i as getDefaultConfig, n as config, o as writeConfig } from "../config-BgCU6apn.js";
|
|
2
2
|
import karin, { segment } from "node-karin";
|
|
3
3
|
import qrcode from "qrcode";
|
|
4
4
|
import axios from "node-karin/axios";
|
|
@@ -11,6 +11,11 @@ const HTTP_URL_RE = /^https?:\/\//i;
|
|
|
11
11
|
const BASE64_PREFIX_RE = /^base64:\/\//i;
|
|
12
12
|
/** 标准 data URL 的 base64 前缀。 */
|
|
13
13
|
const DATA_URL_BASE64_RE = /^data:[^;,]+;base64,/i;
|
|
14
|
+
/**
|
|
15
|
+
* 纯数字且 5-11 位:一定是 QQ 号/群号。
|
|
16
|
+
* openid 是 32 位十六进制(或带连字符的 UUID 形态),不可能匹配此规则。
|
|
17
|
+
*/
|
|
18
|
+
const QQ_NUMBER_RE = /^\d{5,11}$/;
|
|
14
19
|
|
|
15
20
|
//#endregion
|
|
16
21
|
//#region src/utils/common.ts
|
|
@@ -39,4 +44,4 @@ const getImageSize = async (source) => {
|
|
|
39
44
|
};
|
|
40
45
|
|
|
41
46
|
//#endregion
|
|
42
|
-
export { DATA_URL_BASE64_RE as a, BASE64_PREFIX_RE as i, getImageSize as n, HTTP_URL_RE as o, random as r, fakeEvent as t };
|
|
47
|
+
export { DATA_URL_BASE64_RE as a, BASE64_PREFIX_RE as i, getImageSize as n, HTTP_URL_RE as o, random as r, QQ_NUMBER_RE as s, fakeEvent as t };
|
|
@@ -80,19 +80,16 @@ const writeConfig = (data) => {
|
|
|
80
80
|
syncCache(normalized);
|
|
81
81
|
};
|
|
82
82
|
/**
|
|
83
|
-
*
|
|
83
|
+
* 用默认值补齐用户配置,并清理已废弃字段
|
|
84
84
|
*/
|
|
85
85
|
const formatConfig = (user) => {
|
|
86
86
|
const def = getDefaultConfig()[0];
|
|
87
87
|
return user.map((item) => {
|
|
88
|
+
/** markdown 是历史字段,解构出来即丢弃,见 {@link LegacyQQBotConfig}。 */
|
|
88
89
|
const { markdown, messageCache, event, ...rest } = item;
|
|
89
90
|
return {
|
|
90
91
|
...def,
|
|
91
92
|
...rest,
|
|
92
|
-
markdown: {
|
|
93
|
-
...def.markdown,
|
|
94
|
-
...markdown
|
|
95
|
-
},
|
|
96
93
|
messageCache: normalizeMessageCache(def.messageCache, messageCache),
|
|
97
94
|
event: {
|
|
98
95
|
...def.event,
|
|
@@ -153,7 +150,6 @@ const getDefaultConfig = () => [{
|
|
|
153
150
|
reg: "^/",
|
|
154
151
|
rep: "#"
|
|
155
152
|
}],
|
|
156
|
-
markdown: { enable: true },
|
|
157
153
|
messageCache: {
|
|
158
154
|
enable: false,
|
|
159
155
|
self: false,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AdapterBase, AdapterType, Contact, CreateGroupFolderResponse, DownloadFileOptions, DownloadFileResponse, ElementTypes, ForwardOptions, GetAiCharactersResponse, GetAtAllCountResponse, GetGroupFileListResponse, GetGroupFileSystemInfoResponse, GetGroupHighlightsResponse, GetGroupMuteListResponse, GetRkeyResponse, GroupInfo, GroupMemberInfo, LogMethodNames, Message, MessageResponse, NodeElement, QQGroupHonorInfo, SendMsgResults, Sender, UserInfo
|
|
1
|
+
import { AdapterBase, AdapterType, Contact, CreateGroupFolderResponse, DownloadFileOptions, DownloadFileResponse, ElementTypes, ForwardOptions, GetAiCharactersResponse, GetAtAllCountResponse, GetGroupFileListResponse, GetGroupFileSystemInfoResponse, GetGroupHighlightsResponse, GetGroupMuteListResponse, GetRkeyResponse, GroupInfo, GroupMemberInfo, LogMethodNames, Message, MessageResponse, NodeElement, QQGroupHonorInfo, SendMsgResults, Sender, UserInfo } from "node-karin";
|
|
2
2
|
import { AxiosRequestConfig, AxiosResponse } from "node-karin/axios";
|
|
3
3
|
import FormData from "form-data";
|
|
4
4
|
//#region src/core/api/types.d.ts
|
|
@@ -26,7 +26,12 @@ interface QQMessageID {
|
|
|
26
26
|
msg_id?: string;
|
|
27
27
|
/** 回复消息的序号,与 msg_id 联合使用,避免相同消息id回复重复发送,不填默认是1。相同的 msg_id + msg_seq 重复发送会失败。 */
|
|
28
28
|
msg_seq?: number;
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* 指明发送消息为互动召回消息,与 msg_id、event_id 互斥使用
|
|
31
|
+
*
|
|
32
|
+
* 接口文档 v1.28.0(2026-09-03)起该字段已从群消息发送接口移除,
|
|
33
|
+
* 目前仅单聊 `POST /v2/users/{user_openid}/messages` 可用。
|
|
34
|
+
*/
|
|
30
35
|
is_wakeup?: boolean;
|
|
31
36
|
/** 引用消息对象,QQ单聊和群聊场景均支持 */
|
|
32
37
|
message_reference?: MessageReference;
|
|
@@ -46,10 +51,101 @@ interface Markdown {
|
|
|
46
51
|
/** markdown 文本 */
|
|
47
52
|
content: string;
|
|
48
53
|
}
|
|
54
|
+
/** keyboard 按钮渲染(Button.render_data) */
|
|
55
|
+
interface KeyboardButtonRenderData {
|
|
56
|
+
/** 按钮文字,最多 10 字符 */
|
|
57
|
+
label?: string;
|
|
58
|
+
/** 点击后文字,不传则保持不变 */
|
|
59
|
+
visited_label?: string;
|
|
60
|
+
/**
|
|
61
|
+
* 按钮样式
|
|
62
|
+
* - `0` 灰色线框
|
|
63
|
+
* - `1` 蓝色线框
|
|
64
|
+
* - `3` 白色背景 + 红色字体
|
|
65
|
+
* - `4` 蓝色背景 + 白色字体
|
|
66
|
+
*
|
|
67
|
+
* 接口文档 v1.28.0(2026-09-03)重定义了取值,旧文档中的 `2`(白字)已被移除。
|
|
68
|
+
*/
|
|
69
|
+
style?: number;
|
|
70
|
+
}
|
|
71
|
+
/** keyboard 按钮点击权限(Button.action.permission) */
|
|
72
|
+
interface KeyboardButtonPermission {
|
|
73
|
+
/** 0 指定用户可操作,1 仅管理者可操作,2 所有人可操作,3 指定身份组可操作(仅频道可用) */
|
|
74
|
+
type?: number;
|
|
75
|
+
/** 有权限的用户 id 的列表 */
|
|
76
|
+
specify_user_ids?: string[];
|
|
77
|
+
/** 有权限的身份组 id 的列表(仅频道可用) */
|
|
78
|
+
specify_role_ids?: string[];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 按钮二次确认(Button.action.modal)
|
|
82
|
+
*
|
|
83
|
+
* 接口文档 v1.28.0(2026-09-03)新增:点击按钮后先弹确认框,确认后才触发按钮行为。
|
|
84
|
+
*/
|
|
85
|
+
interface KeyboardButtonModal {
|
|
86
|
+
/** 二次确认的提示文本,不为空则进行二次确认;最多 40 个字符,不能有 URL */
|
|
87
|
+
content?: string;
|
|
88
|
+
/** 确认按钮上展示的文字,可为空,默认「确认」;最多 4 个字符 */
|
|
89
|
+
confirm_text?: string;
|
|
90
|
+
/** 取消按钮上展示的文字,可为空,默认「取消」;最多 4 个字符 */
|
|
91
|
+
cancel_text?: string;
|
|
92
|
+
}
|
|
93
|
+
/** keyboard 按钮点击行为(Button.action) */
|
|
94
|
+
interface KeyboardButtonAction {
|
|
95
|
+
/** 0 跳转按钮(http / 小程序 scheme),1 回调按钮(回调后台接口),2 指令按钮(在输入框插入 @bot data) */
|
|
96
|
+
type?: number;
|
|
97
|
+
/** 权限设置 */
|
|
98
|
+
permission?: KeyboardButtonPermission;
|
|
99
|
+
/** 操作相关的数据 */
|
|
100
|
+
data?: string;
|
|
101
|
+
/** 客户端不支持本 action 的时候,弹出的 toast 文案 */
|
|
102
|
+
unsupport_tips?: string;
|
|
103
|
+
/** 指令按钮可用,点击按钮后直接自动发送 data,仅单聊可用,默认 false(支持版本 8983) */
|
|
104
|
+
enter?: boolean;
|
|
105
|
+
/** 指令按钮可用,指令是否带引用回复本消息,默认 false(支持版本 8983) */
|
|
106
|
+
reply?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* 仅在指令按钮下有效,设置后会忽略 `enter` 配置。
|
|
109
|
+
* 设为 1 时点击按钮自动唤起手 Q 选图器(仅手机端 8983+ 的单聊场景)。
|
|
110
|
+
*/
|
|
111
|
+
anchor?: number;
|
|
112
|
+
/** 用户点击后的二次确认操作 */
|
|
113
|
+
modal?: KeyboardButtonModal;
|
|
114
|
+
/** @deprecated 官方已弃用:可操作点击的次数 */
|
|
115
|
+
click_limit?: number;
|
|
116
|
+
/** @deprecated 官方已弃用:指令按钮弹出子频道选择器 */
|
|
117
|
+
at_bot_show_channel_list?: boolean;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* keyboard 按钮(Button)
|
|
121
|
+
*
|
|
122
|
+
* 字段与官方文档一致,并且是 node-karin `QQBotButton` 的结构超集,
|
|
123
|
+
* 因此 `karinToQQBot()` 的输出可以直接放进 {@link Keyboard}。
|
|
124
|
+
*/
|
|
125
|
+
interface KeyboardButton {
|
|
126
|
+
/** 按钮 ID,同一键盘内唯一 */
|
|
127
|
+
id?: string;
|
|
128
|
+
/** 按钮渲染 */
|
|
129
|
+
render_data?: KeyboardButtonRenderData;
|
|
130
|
+
/** 按钮点击行为 */
|
|
131
|
+
action?: KeyboardButtonAction;
|
|
132
|
+
/**
|
|
133
|
+
* 分组 ID,同一分组内有一个按钮被操作后,其它按钮变灰不可点击
|
|
134
|
+
*
|
|
135
|
+
* 接口文档 v1.28.0(2026-09-03)新增,仅当 `action.type = 1` 时有效。
|
|
136
|
+
*/
|
|
137
|
+
group_id?: string;
|
|
138
|
+
}
|
|
139
|
+
/** keyboard 一行按钮 */
|
|
140
|
+
interface KeyboardRow {
|
|
141
|
+
/** 该行的按钮,官方限制每行最多 5 个 */
|
|
142
|
+
buttons: KeyboardButton[];
|
|
143
|
+
}
|
|
49
144
|
/** 按钮消息结构(官方已全量开放自定义 keyboard,2.0 不再支持模板按钮) */
|
|
50
145
|
interface Keyboard {
|
|
146
|
+
/** 键盘内容,官方限制最多 5 行 */
|
|
51
147
|
content: {
|
|
52
|
-
rows:
|
|
148
|
+
rows: KeyboardRow[];
|
|
53
149
|
};
|
|
54
150
|
}
|
|
55
151
|
/** 发送QQ Markdown 消息请求参数 */
|
|
@@ -308,19 +404,29 @@ interface GroupBotStateResponse {
|
|
|
308
404
|
/**
|
|
309
405
|
* 获取群成员详情接口响应(GET /v2/groups/{group_openid}/members/{member_openid})
|
|
310
406
|
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
407
|
+
* 该接口在接口文档 v1.28.0(2026-09-03)转为公开文档,属「内邀接入」的白名单接口,
|
|
408
|
+
* 未获权限时平台返回错误码 11253。官方昵称字段为 `username`,`nick` 是转公开之前
|
|
409
|
+
* 腾讯官方 openclaw 插件(@tencent-connect/openclaw-qqbot v2.0.0)使用的字段名,
|
|
410
|
+
* 保留以兼容旧返回。
|
|
314
411
|
*/
|
|
315
412
|
interface QQGroupMemberResponse {
|
|
316
413
|
/** 群成员 openid */
|
|
317
414
|
member_openid?: string;
|
|
318
|
-
/**
|
|
415
|
+
/** 用户昵称 */
|
|
416
|
+
username?: string;
|
|
417
|
+
/**
|
|
418
|
+
* 群成员昵称
|
|
419
|
+
* @deprecated 官方公开文档中的字段名是 {@link QQGroupMemberResponse.username}
|
|
420
|
+
*/
|
|
319
421
|
nick?: string;
|
|
320
422
|
/** 入群时间,RFC3339 格式 */
|
|
321
423
|
joined_at?: string;
|
|
322
424
|
/** 群内角色:owner / admin / member */
|
|
323
425
|
member_role?: 'owner' | 'admin' | 'member';
|
|
426
|
+
/** 是否机器人 */
|
|
427
|
+
bot?: boolean;
|
|
428
|
+
/** 用户在应用/开放平台下的统一标识(如有) */
|
|
429
|
+
union_openid?: string;
|
|
324
430
|
/** 其余未公开字段原样保留 */
|
|
325
431
|
[key: string]: unknown;
|
|
326
432
|
}
|
|
@@ -676,6 +782,19 @@ interface MemberMuteState {
|
|
|
676
782
|
/** 用户在应用/开放平台下的统一标识 */
|
|
677
783
|
union_openid?: string;
|
|
678
784
|
}
|
|
785
|
+
/**
|
|
786
|
+
* 设置成员禁言项(POST /v2/groups/{group_openid}/restrict_chat_setting)
|
|
787
|
+
*
|
|
788
|
+
* 单次请求最多 20 项(接口文档 v1.28.0 由 10 提升至 20)。
|
|
789
|
+
*/
|
|
790
|
+
interface SetMemberMuteState {
|
|
791
|
+
/** 操作类型:add 增加禁言,update 更新禁言到期时间,del 解除禁言 */
|
|
792
|
+
op: 'add' | 'update' | 'del';
|
|
793
|
+
/** 被禁言成员的 openid;增加 / 更新时只能操作普通成员,不能操作群主、管理员、机器人 */
|
|
794
|
+
member_openid: string;
|
|
795
|
+
/** 禁言到期时间(RFC3339 格式);op=del 时可传空串表示立即解除禁言 */
|
|
796
|
+
mute_expire_at?: string;
|
|
797
|
+
}
|
|
679
798
|
/** 查询群禁言状态响应(GET /v2/groups/{group_openid}/restrict_chat_setting) */
|
|
680
799
|
interface GetGroupMuteSettingResponse {
|
|
681
800
|
/** 群级禁言规则 */
|
|
@@ -724,7 +843,7 @@ interface JoinRequest {
|
|
|
724
843
|
interface GetJoinRequestListParams {
|
|
725
844
|
/** 分页游标,首次请求可不传或传空串 */
|
|
726
845
|
cursor?: string;
|
|
727
|
-
/** 单页数量,默认 20,最大
|
|
846
|
+
/** 单页数量,默认 20,最大 50 */
|
|
728
847
|
limit?: number;
|
|
729
848
|
}
|
|
730
849
|
/** 入群申请列表响应(GET /v2/groups/{group_openid}/join_request_list) */
|
|
@@ -745,6 +864,86 @@ interface ApprovalJoinRequestBody {
|
|
|
745
864
|
/** 是否同时加入群黑名单,默认 false,op=decline 时可填 */
|
|
746
865
|
add_to_member_blacklist?: boolean;
|
|
747
866
|
}
|
|
867
|
+
/** 群成员(GET /v2/groups/{group_openid}/members 列表项) */
|
|
868
|
+
interface GroupMemberItem {
|
|
869
|
+
/** 成员 openid */
|
|
870
|
+
member_openid: string;
|
|
871
|
+
/** 用户昵称 */
|
|
872
|
+
username?: string;
|
|
873
|
+
/** 群成员角色:member 普通成员 / owner 群主 / admin 管理员 */
|
|
874
|
+
member_role?: 'owner' | 'admin' | 'member';
|
|
875
|
+
/** 是否机器人 */
|
|
876
|
+
bot?: boolean;
|
|
877
|
+
/** 入群时间戳(RFC3339 格式) */
|
|
878
|
+
joined_at?: string;
|
|
879
|
+
/** 用户在应用/开放平台下的统一标识(如有) */
|
|
880
|
+
union_openid?: string;
|
|
881
|
+
}
|
|
882
|
+
/** 群成员列表查询参数(GET /v2/groups/{group_openid}/members) */
|
|
883
|
+
interface GetGroupMemberListParams {
|
|
884
|
+
/** 分页游标,首次请求可不传或传空串;后续传上一次响应的 next_cursor */
|
|
885
|
+
cursor?: string;
|
|
886
|
+
}
|
|
887
|
+
/** 群成员列表响应(GET /v2/groups/{group_openid}/members) */
|
|
888
|
+
interface GetGroupMemberListResponse {
|
|
889
|
+
/** 成员列表,每次最多返回 30 条 */
|
|
890
|
+
members: GroupMemberItem[];
|
|
891
|
+
/** 下一页游标,空串表示已到末页 */
|
|
892
|
+
next_cursor: string;
|
|
893
|
+
}
|
|
894
|
+
/** 群成员批量移除请求体(POST /v2/groups/{group_openid}/batch_remove_members) */
|
|
895
|
+
interface BatchRemoveGroupMembersBody {
|
|
896
|
+
/** 需要移除的成员 member_openid 列表,单次最多 20 个 */
|
|
897
|
+
member_openids: string[];
|
|
898
|
+
/** 是否同时加入群黑名单,默认 false */
|
|
899
|
+
add_to_member_blacklist?: boolean;
|
|
900
|
+
}
|
|
901
|
+
/** 群成员批量移除响应 */
|
|
902
|
+
interface BatchRemoveGroupMembersResponse {
|
|
903
|
+
/** 成功时返回 success */
|
|
904
|
+
remove_members_result?: string;
|
|
905
|
+
/** 拉黑失败的 openid */
|
|
906
|
+
add_to_member_blacklist_fail_openids?: string[];
|
|
907
|
+
}
|
|
908
|
+
/** 群黑名单用户(GET /v2/groups/{group_openid}/member_blacklist 列表项) */
|
|
909
|
+
interface GroupBlacklistUser {
|
|
910
|
+
/** 用户在应用/开放平台下的统一标识(如有) */
|
|
911
|
+
union_openid?: string;
|
|
912
|
+
/** 用户 openid */
|
|
913
|
+
member_openid: string;
|
|
914
|
+
/** 用户昵称 */
|
|
915
|
+
username?: string;
|
|
916
|
+
/** 拉黑时间戳(RFC3339 格式) */
|
|
917
|
+
banned_at?: string;
|
|
918
|
+
/** 是否为机器人账号 */
|
|
919
|
+
bot?: boolean;
|
|
920
|
+
}
|
|
921
|
+
/** 群黑名单查询参数(GET /v2/groups/{group_openid}/member_blacklist) */
|
|
922
|
+
interface GetGroupMemberBlacklistParams {
|
|
923
|
+
/** 分页游标,首次请求可不传或传空串 */
|
|
924
|
+
cursor?: string;
|
|
925
|
+
/** 单页数量,默认 20,最大 100 */
|
|
926
|
+
limit?: number;
|
|
927
|
+
}
|
|
928
|
+
/** 群黑名单查询响应(GET /v2/groups/{group_openid}/member_blacklist) */
|
|
929
|
+
interface GetGroupMemberBlacklistResponse {
|
|
930
|
+
/** 黑名单用户列表 */
|
|
931
|
+
users: GroupBlacklistUser[];
|
|
932
|
+
/** 下一页游标,空串表示已到末页 */
|
|
933
|
+
next_cursor: string;
|
|
934
|
+
}
|
|
935
|
+
/** 群黑名单操作请求体(POST /v2/groups/{group_openid}/member_blacklist) */
|
|
936
|
+
interface SetGroupMemberBlacklistBody {
|
|
937
|
+
/** 操作类型:add 加入黑名单(目标成员在群中时无法加入),del 移出黑名单 */
|
|
938
|
+
op: 'add' | 'del';
|
|
939
|
+
/** 目标成员 openid 列表,单次最多 20 个 */
|
|
940
|
+
member_openids: string[];
|
|
941
|
+
}
|
|
942
|
+
/** 群黑名单操作响应 */
|
|
943
|
+
interface SetGroupMemberBlacklistResponse {
|
|
944
|
+
/** 操作失败的 openid 列表,op=add / op=del 同义 */
|
|
945
|
+
fail_openids?: string[];
|
|
946
|
+
}
|
|
748
947
|
/** 入群自动审批策略 */
|
|
749
948
|
interface JoinApprovalStrategy {
|
|
750
949
|
/** 策略 ID */
|
|
@@ -770,7 +969,7 @@ interface JoinApprovalStrategy {
|
|
|
770
969
|
interface GetJoinApprovalStrategyListParams {
|
|
771
970
|
/** 分页游标,首次请求可不传或传空串 */
|
|
772
971
|
cursor?: string;
|
|
773
|
-
/** 单页数量,默认 20,最大
|
|
972
|
+
/** 单页数量,默认 20,最大 50 */
|
|
774
973
|
limit?: number;
|
|
775
974
|
}
|
|
776
975
|
/** 查询入群自动审批策略列表响应 */
|
|
@@ -1176,10 +1375,12 @@ declare class MetaApi extends Http {
|
|
|
1176
1375
|
//#endregion
|
|
1177
1376
|
//#region src/core/api/groups.d.ts
|
|
1178
1377
|
/**
|
|
1179
|
-
* QQ
|
|
1378
|
+
* QQ 群信息与群成员管理接口
|
|
1180
1379
|
*
|
|
1181
1380
|
* 注意:以下接口均为白名单接口,未开通权限时平台返回错误码 11253,
|
|
1182
|
-
*
|
|
1381
|
+
* 需要向平台运营申请后可用。接口文档 v1.28.0(2026-09-03)新增的群成员管理
|
|
1382
|
+
* 接口(成员列表 / 批量移除 / 黑名单)官方标注为「正在内邀接入中」,
|
|
1383
|
+
* 开放范围可能比其它白名单接口更窄。
|
|
1183
1384
|
*/
|
|
1184
1385
|
declare class GroupsApi extends Http {
|
|
1185
1386
|
/**
|
|
@@ -1192,17 +1393,58 @@ declare class GroupsApi extends Http {
|
|
|
1192
1393
|
* @param groupOpenid 群 openid
|
|
1193
1394
|
*/
|
|
1194
1395
|
getBotState(groupOpenid: string): Promise<GroupBotStateResponse>;
|
|
1396
|
+
/**
|
|
1397
|
+
* 获取群成员列表
|
|
1398
|
+
*
|
|
1399
|
+
* 每次最多返回 30 条,只支持 cursor 翻页:首次不传 `cursor`,之后回传上一次
|
|
1400
|
+
* 响应的 `next_cursor`,`next_cursor` 为空串表示已到末页。
|
|
1401
|
+
*
|
|
1402
|
+
* @param groupOpenid 群 openid
|
|
1403
|
+
* @param params 分页参数
|
|
1404
|
+
*/
|
|
1405
|
+
getGroupMemberList(groupOpenid: string, params?: GetGroupMemberListParams): Promise<GetGroupMemberListResponse>;
|
|
1195
1406
|
/**
|
|
1196
1407
|
* 获取群成员详情
|
|
1197
1408
|
*
|
|
1409
|
+
* 昵称字段为 `username`;`nick` 是该接口转为公开文档之前的字段名,仅作兼容。
|
|
1410
|
+
*
|
|
1198
1411
|
* @param groupOpenid 群 openid
|
|
1199
1412
|
* @param memberOpenid 群成员 openid
|
|
1200
1413
|
*/
|
|
1201
1414
|
getGroupMember(groupOpenid: string, memberOpenid: string): Promise<QQGroupMemberResponse>;
|
|
1415
|
+
/**
|
|
1416
|
+
* 群成员批量移除
|
|
1417
|
+
*
|
|
1418
|
+
* 单次最多 20 个成员,可通过 `add_to_member_blacklist` 在移除的同时拉黑。
|
|
1419
|
+
* 机器人需拥有群管理员身份。
|
|
1420
|
+
*
|
|
1421
|
+
* @param groupOpenid 群 openid
|
|
1422
|
+
* @param body 待移除的成员列表与是否同时拉黑
|
|
1423
|
+
*/
|
|
1424
|
+
batchRemoveGroupMembers(groupOpenid: string, body: BatchRemoveGroupMembersBody): Promise<BatchRemoveGroupMembersResponse>;
|
|
1425
|
+
/**
|
|
1426
|
+
* 查询群黑名单
|
|
1427
|
+
*
|
|
1428
|
+
* @param groupOpenid 群 openid
|
|
1429
|
+
* @param params 分页参数,`limit` 默认 20、最大 100
|
|
1430
|
+
*/
|
|
1431
|
+
getGroupMemberBlacklist(groupOpenid: string, params?: GetGroupMemberBlacklistParams): Promise<GetGroupMemberBlacklistResponse>;
|
|
1432
|
+
/**
|
|
1433
|
+
* 群黑名单操作
|
|
1434
|
+
*
|
|
1435
|
+
* 只有目标用户不在群中时才能加入黑名单,需要先移除再拉黑;单次最多 20 个。
|
|
1436
|
+
* 返回的 `fail_openids` 在 `op=add` / `op=del` 下同义,都是操作失败的 openid。
|
|
1437
|
+
*
|
|
1438
|
+
* @param groupOpenid 群 openid
|
|
1439
|
+
* @param body 操作类型与目标成员列表
|
|
1440
|
+
*/
|
|
1441
|
+
setGroupMemberBlacklist(groupOpenid: string, body: SetGroupMemberBlacklistBody): Promise<SetGroupMemberBlacklistResponse>;
|
|
1202
1442
|
/**
|
|
1203
1443
|
* 设置群成员禁言
|
|
1204
1444
|
*
|
|
1205
|
-
* 机器人需拥有群管理员身份,平台限制最大禁言时长为 30
|
|
1445
|
+
* 机器人需拥有群管理员身份,平台限制最大禁言时长为 30 天;
|
|
1446
|
+
* 只能操作普通成员,不能操作群主、管理员与机器人。
|
|
1447
|
+
* 需要一次设置多个成员时用 {@link GroupsApi.setGroupMuteBatch}。
|
|
1206
1448
|
*
|
|
1207
1449
|
* @param groupOpenid 群 openid
|
|
1208
1450
|
* @param memberOpenid 群成员 openid
|
|
@@ -1210,6 +1452,17 @@ declare class GroupsApi extends Http {
|
|
|
1210
1452
|
* @param duration 禁言时间使用RFC3339 格式
|
|
1211
1453
|
*/
|
|
1212
1454
|
setGroupMute(groupOpenid: string, memberOpenid: string, op: 'add' | 'update' | 'del', duration: string): Promise<{}>;
|
|
1455
|
+
/**
|
|
1456
|
+
* 批量设置群成员禁言
|
|
1457
|
+
*
|
|
1458
|
+
* 每项通过自身的 `op` 控制增 / 改 / 删,可以在一次请求里混用。
|
|
1459
|
+
* 平台限制单次最多 20 个成员(接口文档 v1.28.0 由 10 提升至 20),
|
|
1460
|
+
* 超出时平台会直接拒绝整个请求。
|
|
1461
|
+
*
|
|
1462
|
+
* @param groupOpenid 群 openid
|
|
1463
|
+
* @param members 成员禁言设置列表
|
|
1464
|
+
*/
|
|
1465
|
+
setGroupMuteBatch(groupOpenid: string, members: SetMemberMuteState[]): Promise<{}>;
|
|
1213
1466
|
/**
|
|
1214
1467
|
* 设置群成员禁言
|
|
1215
1468
|
* @deprecated 方法名拼写错误,请使用 {@link GroupsApi.setGroupMute}
|
|
@@ -1230,7 +1483,8 @@ declare class GroupsApi extends Http {
|
|
|
1230
1483
|
* 机器人需拥有群管理员身份。
|
|
1231
1484
|
*
|
|
1232
1485
|
* @param groupOpenid 群 openid
|
|
1233
|
-
* @param params 分页参数,`limit` 默认 20、最大 100
|
|
1486
|
+
* @param params 分页参数,`limit` 默认 20、最大 50(接口文档 v1.28.0 由 100 下调),
|
|
1487
|
+
* 传入更大的值会被收敛到 50,避免平台直接拒绝
|
|
1234
1488
|
*/
|
|
1235
1489
|
getJoinRequestList(groupOpenid: string, params?: GetJoinRequestListParams): Promise<GetJoinRequestListResponse>;
|
|
1236
1490
|
/**
|
|
@@ -1404,7 +1658,8 @@ declare class JoinApprovalApi extends Http {
|
|
|
1404
1658
|
* 查询入群自动审批策略列表
|
|
1405
1659
|
*
|
|
1406
1660
|
* 按创建时间倒序,支持分页。
|
|
1407
|
-
* @param params 分页参数,`limit` 默认 20、最大 100
|
|
1661
|
+
* @param params 分页参数,`limit` 默认 20、最大 50(接口文档 v1.28.0 由 100 下调),
|
|
1662
|
+
* 传入更大的值会被收敛到 50,避免平台直接拒绝
|
|
1408
1663
|
*/
|
|
1409
1664
|
getStrategyList(params?: GetJoinApprovalStrategyListParams): Promise<GetJoinApprovalStrategyListResponse>;
|
|
1410
1665
|
/**
|
|
@@ -1455,7 +1710,7 @@ declare class JoinApprovalApi extends Http {
|
|
|
1455
1710
|
* - media:富媒体上传
|
|
1456
1711
|
* - interaction:按钮回调 ack
|
|
1457
1712
|
* - meta:@me / dms / gateway / 分享链接
|
|
1458
|
-
* - groups:群基础信息 / 机器人群内状态 / 禁言 /
|
|
1713
|
+
* - groups:群基础信息 / 机器人群内状态 / 群成员列表与详情 / 禁言 / 批量移除 / 群黑名单 / 入群申请(白名单接口)
|
|
1459
1714
|
* - guilds:频道与子频道的查询和增删改
|
|
1460
1715
|
* - menu:全局自定义菜单(仅单聊)
|
|
1461
1716
|
* - panels:指令面板
|
|
@@ -1534,11 +1789,6 @@ interface QQBotConfig {
|
|
|
1534
1789
|
reg: string | RegExp;
|
|
1535
1790
|
rep: string;
|
|
1536
1791
|
}[];
|
|
1537
|
-
/** Markdown 通道 */
|
|
1538
|
-
markdown: {
|
|
1539
|
-
/** 是否启用 Markdown 通道发送消息 */
|
|
1540
|
-
enable: boolean;
|
|
1541
|
-
};
|
|
1542
1792
|
/** 消息缓存配置 */
|
|
1543
1793
|
messageCache: {
|
|
1544
1794
|
/** 是否启用数据库消息缓存,用于 bot.getMsg */
|
|
@@ -1977,8 +2227,10 @@ declare class MessageStore {
|
|
|
1977
2227
|
/**
|
|
1978
2228
|
* QQ Official Bot 适配器
|
|
1979
2229
|
*
|
|
1980
|
-
*
|
|
1981
|
-
*
|
|
2230
|
+
* 发送通道由平台能力决定,没有对应的用户配置项:QQ 单聊 / 群聊的自定义 Markdown
|
|
2231
|
+
* 已对所有机器人开放,固定走 msg_type=2;频道场景仍需内邀开通,先乐观尝试
|
|
2232
|
+
* Markdown,被拒后自动降级为普通消息(详见 pipeline-qq / pipeline-guild 与
|
|
2233
|
+
* guild-markdown)。视频 / 语音 / 文件由 pipeline 内部以 msg_type=7 紧随主消息补发。
|
|
1982
2234
|
*/
|
|
1983
2235
|
declare class AdapterQQBot extends AdapterBase implements AdapterType {
|
|
1984
2236
|
/** 与官方 API 交互 */
|
|
@@ -2022,8 +2274,16 @@ declare class AdapterQQBot extends AdapterBase implements AdapterType {
|
|
|
2022
2274
|
/**
|
|
2023
2275
|
* 发送合并转发消息
|
|
2024
2276
|
*
|
|
2025
|
-
*
|
|
2026
|
-
*
|
|
2277
|
+
* QQ 官方没有合并转发能力,这里把各节点摊平成一段 Markdown 正文,节点之间用
|
|
2278
|
+
* 强制换行隔开,不添加任何前缀提示文本。
|
|
2279
|
+
*
|
|
2280
|
+
* 图片以 markdown 图片语法写入,**保留原始来源**(本地路径 / base64 / URL):
|
|
2281
|
+
* 究竟走内置图床、第三方 fileToUrl,还是降级成 msg_type=7 富媒体,由发送
|
|
2282
|
+
* pipeline 统一决定。这里不自己上传,也不自己判断通道——否则频道场景在没有
|
|
2283
|
+
* Markdown 权限时会绕过降级逻辑,直接被平台拒掉。
|
|
2284
|
+
*
|
|
2285
|
+
* 视频 / 语音 / 文件进不了 markdown,作为普通消息段跟随主消息一起交给 pipeline,
|
|
2286
|
+
* 由它在同一次发送里以 msg_type=7 补发。
|
|
2027
2287
|
*/
|
|
2028
2288
|
sendForwardMsg(contact: Contact, elements: Array<NodeElement>, _options?: ForwardOptions): Promise<{
|
|
2029
2289
|
messageId: string;
|
|
@@ -2031,6 +2291,10 @@ declare class AdapterQQBot extends AdapterBase implements AdapterType {
|
|
|
2031
2291
|
}>;
|
|
2032
2292
|
/**
|
|
2033
2293
|
* 获取头像 url
|
|
2294
|
+
*
|
|
2295
|
+
* 第三方头像 CDN 的模式是 `qqapp/{appId}/{openid}/{size}`,只有拼用户 openid 才有效;
|
|
2296
|
+
* 机器人自身没有可用的 openid(selfId 就是 appId,拼出 appId/appid 只会得到默认头像),
|
|
2297
|
+
* 因此目标是自己时改走官方 `GET /users/@me` 返回的 avatar 字段,取值与缓存见 self-avatar。
|
|
2034
2298
|
*/
|
|
2035
2299
|
getAvatarUrl(_userId: string, _size?: 0 | 40 | 100 | 140): Promise<string>;
|
|
2036
2300
|
/**
|
|
@@ -2079,6 +2343,18 @@ declare class AdapterQQBot extends AdapterBase implements AdapterType {
|
|
|
2079
2343
|
sendLike(_targetId: string, _count: number): Promise<void>;
|
|
2080
2344
|
/**
|
|
2081
2345
|
* 群踢人
|
|
2346
|
+
*
|
|
2347
|
+
* 走官方 `POST /v2/groups/{group_openid}/batch_remove_members`,机器人需拥有群
|
|
2348
|
+
* 管理员身份。Karin 的 `rejectAddRequest` 映射为官方的 `add_to_member_blacklist`:
|
|
2349
|
+
* 移除的同时拉入群黑名单,该用户之后无法再次入群。官方接口没有踢人理由字段,
|
|
2350
|
+
* `kickReason` 只会被记录到日志。
|
|
2351
|
+
*
|
|
2352
|
+
* 需要一次移除多人时用 `bot.super.groups.batchRemoveGroupMembers()`,单次最多 20 个。
|
|
2353
|
+
*
|
|
2354
|
+
* @param _groupId 群 openid
|
|
2355
|
+
* @param _targetId 群成员 openid
|
|
2356
|
+
* @param _rejectAddRequest 是否同时拉入群黑名单,默认 false
|
|
2357
|
+
* @param _kickReason 官方不支持,仅在传入时输出提示
|
|
2082
2358
|
*/
|
|
2083
2359
|
groupKickMember(_groupId: string, _targetId: string, _rejectAddRequest?: boolean, _kickReason?: string): Promise<void>;
|
|
2084
2360
|
/**
|
|
@@ -2144,14 +2420,25 @@ declare class AdapterQQBot extends AdapterBase implements AdapterType {
|
|
|
2144
2420
|
/**
|
|
2145
2421
|
* 获取群成员信息
|
|
2146
2422
|
*
|
|
2147
|
-
* - 查询机器人自身(targetId 为 selfId)走官方 `GET /v2/groups/{group_openid}/bot_state
|
|
2148
|
-
* - 查询其他成员走 `GET /v2/groups/{group_openid}/members/{member_openid}
|
|
2149
|
-
*
|
|
2150
|
-
*
|
|
2423
|
+
* - 查询机器人自身(targetId 为 selfId)走官方 `GET /v2/groups/{group_openid}/bot_state`。
|
|
2424
|
+
* - 查询其他成员走 `GET /v2/groups/{group_openid}/members/{member_openid}`,该接口在
|
|
2425
|
+
* 接口文档 v1.28.0(2026-09-03)转为公开文档,昵称字段为 `username`,`nick` 是
|
|
2426
|
+
* 转公开之前的字段名,仅作兼容回退。
|
|
2427
|
+
*
|
|
2428
|
+
* 两者都是白名单接口,未开通权限(11253)或查询失败时降级为占位结构并告警。
|
|
2151
2429
|
*/
|
|
2152
2430
|
getGroupMemberInfo(_groupId: string, _targetId: string, _refresh?: boolean): Promise<GroupMemberInfo>;
|
|
2153
2431
|
/**
|
|
2154
2432
|
* 获取群成员列表
|
|
2433
|
+
*
|
|
2434
|
+
* 走官方 `GET /v2/groups/{group_openid}/members`(白名单接口),每页最多 30 条,
|
|
2435
|
+
* 这里按 `next_cursor` 自动翻完所有页;顺便把昵称写入
|
|
2436
|
+
* {@link AdapterQQBot.nicknameCache},让后续消息事件能直接取到昵称。
|
|
2437
|
+
*
|
|
2438
|
+
* 为防止平台返回的游标不收敛,翻页数有安全上限(约 6000 人),触顶会告警并返回已取到的部分。
|
|
2439
|
+
* 未开通权限(11253)或查询失败时返回已取到的部分并告警。
|
|
2440
|
+
*
|
|
2441
|
+
* @param _groupId 群 openid
|
|
2155
2442
|
*/
|
|
2156
2443
|
getGroupMemberList(_groupId: string, _refresh?: boolean): Promise<Array<GroupMemberInfo>>;
|
|
2157
2444
|
/**
|