koishi-plugin-onebot-verifier 1.1.5 → 1.1.7
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/lib/index.d.ts +3 -10
- package/lib/index.js +29 -35
- package/package.json +2 -2
- package/readme.md +42 -45
package/lib/index.d.ts
CHANGED
|
@@ -3,23 +3,17 @@ export declare const name = "onebot-verifier";
|
|
|
3
3
|
export declare const inject: {
|
|
4
4
|
optional: string[];
|
|
5
5
|
};
|
|
6
|
-
export declare const usage = "\n<div style=\"border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n <h2 style=\"margin-top: 0; color: #4a6ee0;\">\uD83D\uDCCC \u63D2\u4EF6\u8BF4\u660E</h2>\n <p>\uD83D\uDCD6 <strong>\u4F7F\u7528\u6587\u6863</strong>\uFF1A\u8BF7\u70B9\u51FB\u5DE6\u4E0A\u89D2\u7684 <strong>\u63D2\u4EF6\u4E3B\u9875</strong> \u67E5\u770B\u63D2\u4EF6\u4F7F\u7528\u6587\u6863</p>\n <p>\uD83D\uDD0D <strong>\u66F4\u591A\u63D2\u4EF6</strong>\uFF1A\u53EF\u8BBF\u95EE <a href=\"https://github.com/YisRime\" style=\"color:#4a6ee0;text-decoration:none;\">\u82E1\u6DDE\u7684 GitHub</a> \u67E5\u770B\u672C\u4EBA\u7684\u6240\u6709\u63D2\u4EF6</p>\n</div>\n<div style=\"border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n <h2 style=\"margin-top: 0; color: #e0574a;\">\u2764\uFE0F \u652F\u6301\u4E0E\u53CD\u9988</h2>\n <p>\uD83C\uDF1F \u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF1F\u8BF7\u5728 <a href=\"https://github.com/YisRime\" style=\"color:#e0574a;text-decoration:none;\">GitHub</a> \u4E0A\u7ED9\u6211\u4E00\u4E2A Star\uFF01</p>\n <p>\uD83D\uDC1B \u9047\u5230\u95EE\u9898\uFF1F\u8BF7\u901A\u8FC7 <strong>Issues</strong> \u63D0\u4EA4\u53CD\u9988\uFF0C\u6216\u52A0\u5165 QQ \u7FA4 <a href=\"https://qm.qq.com/q/PdLMx9Jowq\" style=\"color:#e0574a;text-decoration:none;\"><strong>855571375</strong></a> \u8FDB\u884C\u4EA4\u6D41</p>\n</div>\n";
|
|
6
|
+
export declare const usage = "\n<div style=\"border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n <h2 style=\"margin-top: 0; color: #4a6ee0;\">\uD83D\uDCCC \u63D2\u4EF6\u8BF4\u660E</h2>\n <p>\uD83D\uDCD6 <strong>\u4F7F\u7528\u6587\u6863</strong>\uFF1A\u8BF7\u70B9\u51FB\u5DE6\u4E0A\u89D2\u7684 <strong>\u63D2\u4EF6\u4E3B\u9875</strong> \u67E5\u770B\u63D2\u4EF6\u4F7F\u7528\u6587\u6863</p>\n <p>\uD83D\uDD0D <strong>\u66F4\u591A\u63D2\u4EF6</strong>\uFF1A\u53EF\u8BBF\u95EE <a href=\"https://github.com/YisRime\" style=\"color:#4a6ee0;text-decoration:none;\">\u82E1\u6DDE\u7684 GitHub</a> \u67E5\u770B\u672C\u4EBA\u7684\u6240\u6709\u63D2\u4EF6</p>\n</div>\n<div style=\"border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n <h2 style=\"margin-top: 0; color: #e0574a;\">\u2764\uFE0F \u652F\u6301\u4E0E\u53CD\u9988</h2>\n <p>\uD83C\uDF1F \u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF1F\u8BF7\u5728 <a href=\"https://github.com/YisRime\" style=\"color:#e0574a;text-decoration:none;\">GitHub</a> \u4E0A\u7ED9\u6211\u4E00\u4E2A Star\uFF01</p>\n <p>\uD83D\uDC1B \u9047\u5230\u95EE\u9898\uFF1F\u8BF7\u901A\u8FC7 <strong>Issues</strong> \u63D0\u4EA4\u53CD\u9988\uFF0C\u6216\u52A0\u5165 QQ \u7FA4 <a href=\"https://qm.qm.qq.com/q/PdLMx9Jowq\" style=\"color:#e0574a;text-decoration:none;\"><strong>855571375</strong></a> \u8FDB\u884C\u4EA4\u6D41</p>\n</div>\n";
|
|
7
7
|
export interface Config {
|
|
8
8
|
notifyTarget?: string;
|
|
9
9
|
debugMode?: boolean;
|
|
10
10
|
kickBan?: boolean;
|
|
11
|
-
friendTimeout:
|
|
12
|
-
action: 'accept' | 'reject';
|
|
13
|
-
timeout: number;
|
|
14
|
-
};
|
|
11
|
+
friendTimeout: false | number;
|
|
15
12
|
friendLevel?: number;
|
|
16
13
|
friendRegex?: string;
|
|
17
14
|
minMembers?: number;
|
|
18
15
|
maxCapacity?: number;
|
|
19
|
-
memberTimeout:
|
|
20
|
-
action: 'accept' | 'reject';
|
|
21
|
-
timeout: number;
|
|
22
|
-
};
|
|
16
|
+
memberTimeout: false | number;
|
|
23
17
|
verifyRules?: {
|
|
24
18
|
guildId: string;
|
|
25
19
|
keyword?: string;
|
|
@@ -28,7 +22,6 @@ export interface Config {
|
|
|
28
22
|
}[];
|
|
29
23
|
specialRules?: {
|
|
30
24
|
guildId: string;
|
|
31
|
-
enabled: boolean;
|
|
32
25
|
mode: 'vote' | 'captcha';
|
|
33
26
|
}[];
|
|
34
27
|
captchaDiff?: 'simple' | 'medium' | 'hard';
|
package/lib/index.js
CHANGED
|
@@ -39,7 +39,7 @@ var usage = `
|
|
|
39
39
|
<div style="border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
|
|
40
40
|
<h2 style="margin-top: 0; color: #e0574a;">❤️ 支持与反馈</h2>
|
|
41
41
|
<p>🌟 喜欢这个插件?请在 <a href="https://github.com/YisRime" style="color:#e0574a;text-decoration:none;">GitHub</a> 上给我一个 Star!</p>
|
|
42
|
-
<p>🐛 遇到问题?请通过 <strong>Issues</strong> 提交反馈,或加入 QQ 群 <a href="https://qm.qq.com/q/PdLMx9Jowq" style="color:#e0574a;text-decoration:none;"><strong>855571375</strong></a> 进行交流</p>
|
|
42
|
+
<p>🐛 遇到问题?请通过 <strong>Issues</strong> 提交反馈,或加入 QQ 群 <a href="https://qm.qm.qq.com/q/PdLMx9Jowq" style="color:#e0574a;text-decoration:none;"><strong>855571375</strong></a> 进行交流</p>
|
|
43
43
|
</div>
|
|
44
44
|
`;
|
|
45
45
|
var Config = import_koishi.Schema.intersect([
|
|
@@ -50,15 +50,9 @@ var Config = import_koishi.Schema.intersect([
|
|
|
50
50
|
}).description("基础配置"),
|
|
51
51
|
import_koishi.Schema.object({
|
|
52
52
|
friendTimeout: import_koishi.Schema.union([
|
|
53
|
-
import_koishi.Schema.const(
|
|
54
|
-
import_koishi.Schema.
|
|
55
|
-
|
|
56
|
-
import_koishi.Schema.const("accept").description("同意"),
|
|
57
|
-
import_koishi.Schema.const("reject").description("拒绝")
|
|
58
|
-
]).description("操作").required(),
|
|
59
|
-
timeout: import_koishi.Schema.number().description("时长").default(360).min(1)
|
|
60
|
-
}).description("自动")
|
|
61
|
-
]).description("模式").default("manual"),
|
|
53
|
+
import_koishi.Schema.const(false).description("手动"),
|
|
54
|
+
import_koishi.Schema.number().description("正数同意/负数拒绝").default(360)
|
|
55
|
+
]).description("超时处理").default(false),
|
|
62
56
|
friendLevel: import_koishi.Schema.number().description("最低好友等级").default(0).min(0).max(256),
|
|
63
57
|
friendRegex: import_koishi.Schema.string().description("好友验证正则"),
|
|
64
58
|
minMembers: import_koishi.Schema.number().description("最低群成员数").default(0).min(0).max(3e3),
|
|
@@ -66,15 +60,9 @@ var Config = import_koishi.Schema.intersect([
|
|
|
66
60
|
}).description("好友邀群配置"),
|
|
67
61
|
import_koishi.Schema.object({
|
|
68
62
|
memberTimeout: import_koishi.Schema.union([
|
|
69
|
-
import_koishi.Schema.const(
|
|
70
|
-
import_koishi.Schema.
|
|
71
|
-
|
|
72
|
-
import_koishi.Schema.const("accept").description("同意"),
|
|
73
|
-
import_koishi.Schema.const("reject").description("拒绝")
|
|
74
|
-
]).description("操作").required(),
|
|
75
|
-
timeout: import_koishi.Schema.number().description("超时").default(360).min(1)
|
|
76
|
-
}).description("自动")
|
|
77
|
-
]).description("模式").default("manual"),
|
|
63
|
+
import_koishi.Schema.const(false).description("手动"),
|
|
64
|
+
import_koishi.Schema.number().description("正数同意/负数拒绝").default(360)
|
|
65
|
+
]).description("超时处理").default(false),
|
|
78
66
|
verifyRules: import_koishi.Schema.array(import_koishi.Schema.object({
|
|
79
67
|
guildId: import_koishi.Schema.string().description("群号").required(),
|
|
80
68
|
keyword: import_koishi.Schema.string().description("正则"),
|
|
@@ -91,8 +79,7 @@ var Config = import_koishi.Schema.intersect([
|
|
|
91
79
|
mode: import_koishi.Schema.union([
|
|
92
80
|
import_koishi.Schema.const("vote").description("投票"),
|
|
93
81
|
import_koishi.Schema.const("captcha").description("验证码")
|
|
94
|
-
]).description("模式").default("vote")
|
|
95
|
-
enabled: import_koishi.Schema.boolean().description("前置规则").default(true)
|
|
82
|
+
]).description("模式").default("vote")
|
|
96
83
|
})).description("配置列表").role("table"),
|
|
97
84
|
voteRatio: import_koishi.Schema.string().description("[投票]支持/反对人数").default("3:2"),
|
|
98
85
|
voteInSitu: import_koishi.Schema.boolean().description("[投票]对应群中发起").default(true),
|
|
@@ -168,7 +155,7 @@ function apply(ctx, config) {
|
|
|
168
155
|
}
|
|
169
156
|
}, "sendNotice");
|
|
170
157
|
const setupManual = /* @__PURE__ */ __name(async (session, kind, specialMode, useInSitu) => {
|
|
171
|
-
const
|
|
158
|
+
const timeoutCfg = kind === "member" ? config.memberTimeout : config.friendTimeout;
|
|
172
159
|
let targetStr = config.notifyTarget || "";
|
|
173
160
|
if (useInSitu && kind === "member" && session.guildId) targetStr = `guild:${session.guildId}`;
|
|
174
161
|
const msgIds = await sendNotice(session, kind, "waiting", targetStr);
|
|
@@ -180,23 +167,23 @@ function apply(ctx, config) {
|
|
|
180
167
|
task.votes = { yes: /* @__PURE__ */ new Set(), no: /* @__PURE__ */ new Set() };
|
|
181
168
|
}
|
|
182
169
|
msgIds.forEach((id) => activeTasks.set(id, task));
|
|
183
|
-
if (
|
|
184
|
-
const
|
|
170
|
+
if (typeof timeoutCfg === "number") {
|
|
171
|
+
const waitMinutes = Math.abs(timeoutCfg);
|
|
172
|
+
const isPass = timeoutCfg > 0;
|
|
185
173
|
task.timer = setTimeout(async () => {
|
|
186
174
|
if (!activeTasks.has(msgIds[0])) return;
|
|
187
175
|
msgIds.forEach((id) => activeTasks.delete(id));
|
|
188
|
-
let
|
|
189
|
-
if (specialMode === "vote")
|
|
190
|
-
|
|
191
|
-
await executeAction(session, kind, isPass, isPass ? "" : "等待超时,自动拒绝");
|
|
176
|
+
let finalActionPass = isPass;
|
|
177
|
+
if (specialMode === "vote") finalActionPass = false;
|
|
178
|
+
await executeAction(session, kind, finalActionPass, finalActionPass ? "" : "等待超时,自动拒绝");
|
|
192
179
|
const [targetType, targetId] = targetStr.split(":");
|
|
193
180
|
if (targetId && session.bot) {
|
|
194
|
-
const statusText = `已自动${
|
|
181
|
+
const statusText = `已自动${finalActionPass ? "通过" : "拒绝"}该请求`;
|
|
195
182
|
await (targetType === "private" ? session.bot.sendPrivateMessage(targetId, statusText) : session.bot.sendMessage(targetId, statusText)).catch(() => {
|
|
196
183
|
});
|
|
197
184
|
}
|
|
198
|
-
if (config.debugMode) logger.info(`[操作] 等待超时,默认${
|
|
199
|
-
},
|
|
185
|
+
if (config.debugMode) logger.info(`[操作] 等待超时,默认${finalActionPass ? "通过" : "拒绝"}`);
|
|
186
|
+
}, waitMinutes * 6e4);
|
|
200
187
|
}
|
|
201
188
|
}, "setupManual");
|
|
202
189
|
const hookEvent = /* @__PURE__ */ __name((kind) => async (session) => {
|
|
@@ -224,7 +211,7 @@ function apply(ctx, config) {
|
|
|
224
211
|
}
|
|
225
212
|
}
|
|
226
213
|
}
|
|
227
|
-
const specialRule = config.specialRules?.find((r) => String(r.guildId) === String(session.guildId)
|
|
214
|
+
const specialRule = config.specialRules?.find((r) => String(r.guildId) === String(session.guildId));
|
|
228
215
|
if (specialRule) {
|
|
229
216
|
if (specialRule.mode === "vote") return await setupManual(session, kind, "vote", config.voteInSitu);
|
|
230
217
|
if (specialRule.mode === "captcha") {
|
|
@@ -317,7 +304,7 @@ function apply(ctx, config) {
|
|
|
317
304
|
ctx.on("guild-added", hookEvent("guild"));
|
|
318
305
|
ctx.on("guild-member-added", async (session) => {
|
|
319
306
|
if (!config.specialRules || !session.guildId || !session.userId) return;
|
|
320
|
-
const rule = config.specialRules.find((r) => String(r.guildId) === String(session.guildId)
|
|
307
|
+
const rule = config.specialRules.find((r) => String(r.guildId) === String(session.guildId));
|
|
321
308
|
if (rule?.mode === "captcha") {
|
|
322
309
|
let a, b, op = "+", answer;
|
|
323
310
|
if (config.captchaDiff === "simple") {
|
|
@@ -356,13 +343,20 @@ function apply(ctx, config) {
|
|
|
356
343
|
});
|
|
357
344
|
ctx.on("guild-removed", async (session) => {
|
|
358
345
|
if (session.guildId) {
|
|
359
|
-
|
|
346
|
+
const eventData = session.event?._data || {};
|
|
347
|
+
if (eventData.sub_type === "kick_me") {
|
|
360
348
|
const inviterId = inviterMap.get(session.guildId);
|
|
361
349
|
if (inviterId) {
|
|
362
350
|
await session.onebot?.deleteFriend(inviterId).catch(() => {
|
|
363
351
|
});
|
|
364
352
|
inviterMap.delete(session.guildId);
|
|
365
|
-
if (config.debugMode) logger.info(`[操作]
|
|
353
|
+
if (config.debugMode) logger.info(`[操作] 删除邀请者好友: ${inviterId}`);
|
|
354
|
+
}
|
|
355
|
+
const adminId = String(eventData.operator_id || session.event?.operator?.id || "");
|
|
356
|
+
if (adminId && adminId !== inviterId) {
|
|
357
|
+
await session.onebot?.deleteFriend(adminId).catch(() => {
|
|
358
|
+
});
|
|
359
|
+
if (config.debugMode) logger.info(`[操作] 删除管理员好友: ${adminId}`);
|
|
366
360
|
}
|
|
367
361
|
}
|
|
368
362
|
await session.execute(`analyse.clear -g ${session.guildId}`).catch(() => {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-onebot-verifier",
|
|
3
|
-
"description": "适用于
|
|
4
|
-
"version": "1.1.
|
|
3
|
+
"description": "适用于 OneBot 的审核插件。不仅支持好友/加群自动审核,还支持入群验证码、投票表决、被踢自动清理等功能。",
|
|
4
|
+
"version": "1.1.7",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Yis_Rime <yis_rime@outlook.com>"
|
|
7
7
|
],
|
package/readme.md
CHANGED
|
@@ -2,66 +2,63 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/koishi-plugin-onebot-verifier)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
适用于 OneBot 的审核插件。不仅支持好友/加群自动审核,还支持**入群验证码**、**投票表决**、**被踢自动清理**等功能。
|
|
6
6
|
|
|
7
|
-
## ✨
|
|
7
|
+
## ✨ 核心特性
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- `manual`(手动模式):全人工介入。
|
|
18
|
-
- **交互式人工审核**:通过引用通知消息并回复 `y/n` 即可快速通过或拒绝申请。
|
|
19
|
-
- **超时自动处理**:防止人工审核积压,支持超时后自动通过或拒绝。
|
|
9
|
+
- 🛡️ **全场景覆盖**:好友申请、用户加群、机器人受邀进群、被踢后续处理。
|
|
10
|
+
- 🧩 **多种验证模式**:
|
|
11
|
+
- **自动规则**:基于 QQ 等级、正则关键词、群规模(成员数/容量)的秒级自动化处理。
|
|
12
|
+
- **入群验证码**:新成员进群后触发数学运算挑战,失败自动移出。
|
|
13
|
+
- **民主投票**:将加群申请转为群内投票,达到指定票数自动通过/拒绝。
|
|
14
|
+
- 交互式人工干预:引用通知消息回复 `y/n` 即可操作,支持超时自动决策。
|
|
15
|
+
- 🧹 **智能清理**:机器人被恶意踢出时,可自动删除邀请者或操作者的好友,并清理数据统计。
|
|
16
|
+
- 📍 **就地审核**:支持在发生申请的群内直接发起审核,无需跳转管理群。
|
|
20
17
|
|
|
21
|
-
## ⚙️
|
|
18
|
+
## ⚙️ 配置项深度解析
|
|
22
19
|
|
|
23
20
|
### 1. 基础配置
|
|
24
21
|
|
|
25
|
-
- **通知目标 (`notifyTarget`)**:
|
|
26
|
-
-
|
|
27
|
-
- **调试模式 (`debugMode`)**: 开启后将输出更详细的日志。
|
|
22
|
+
- **通知目标 (`notifyTarget`)**: 必填。格式为 `private:QQ号` 或 `guild:群号`。
|
|
23
|
+
- **被踢自动处理 (`kickBan`)**: 开启后,若机器人被移出群组,将自动尝试删除邀请者和操作者的好友。
|
|
28
24
|
|
|
29
|
-
### 2.
|
|
25
|
+
### 2. 好友与邀群 (机器人被邀)
|
|
30
26
|
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
- **最低受邀容量 (`maxCapacity`)**: 机器人被邀请进群时,该群的群上限人数要求。
|
|
27
|
+
- **超时处理 (`friendTimeout`)**: 数字表示分钟。正数表示超时自动同意,负数表示超时自动拒绝,`false` 表示永久等待。
|
|
28
|
+
- **验证维度**:
|
|
29
|
+
- `friendLevel`: 申请人最低 QQ 等级。
|
|
30
|
+
- `friendRegex`: 匹配好友申请说明。
|
|
31
|
+
- `minMembers` / `maxCapacity`: 校验目标群的活跃程度与规模。
|
|
37
32
|
|
|
38
|
-
### 3.
|
|
33
|
+
### 3. 加群请求 (用户入群)
|
|
39
34
|
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
- **加群验证配置 (`verifyRules`)**:
|
|
45
|
-
- 为特定群设置专属的验证正则、最低等级要求及超时处理动作。
|
|
35
|
+
- **普通验证规则 (`verifyRules`)**: 表格化配置。可针对不同群设置不同的关键词正则和等级要求。
|
|
36
|
+
- **特殊验证模式 (`specialRules`)**:
|
|
37
|
+
- **投票模式 (vote)**: 引用通知回复 `y/n` 累计票数。
|
|
38
|
+
- **验证码模式 (captcha)**: 机器人自动先通过申请,用户进群后需在 60s 内回复计算题。
|
|
46
39
|
|
|
47
|
-
|
|
40
|
+
### 4. 进阶安全
|
|
48
41
|
|
|
49
|
-
|
|
42
|
+
- **投票比例 (`voteRatio`)**: 格式如 `3:2`,表示 3 票赞成则通过,2 票反对则拒绝。
|
|
43
|
+
- **就地投票 (`voteInSitu`)**: 开启后,投票通知将直接发往“该申请所属的群”而非全局通知目标。
|
|
44
|
+
- **验证码难度 (`captchaDiff`)**: 简单(100以内加减)、中等(两位数乘一位数)、困难(两位数乘两位数)。
|
|
50
45
|
|
|
51
|
-
|
|
46
|
+
## 🎮 指令交互指南
|
|
52
47
|
|
|
53
|
-
|
|
54
|
-
- *提示:若是好友申请,后面可跟备注(如:`y 朋友`)。*
|
|
55
|
-
- **拒绝申请**:回复 `n` 或 `拒绝`。
|
|
56
|
-
- *提示:后面可以跟拒绝理由(如:`n 等级太低`)。*
|
|
48
|
+
### 人工审核 / 投票
|
|
57
49
|
|
|
58
|
-
|
|
50
|
+
当收到审核通知时,**引用该消息**并回复:
|
|
59
51
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
52
|
+
- **通过**:回复 `y` 或 `通过`。
|
|
53
|
+
- **拒绝**:回复 `n` 或 `拒绝 [理由]`。
|
|
54
|
+
- **备注**:好友申请通过时,`y 备注名` 可直接修改好友备注。
|
|
63
55
|
|
|
64
|
-
|
|
56
|
+
### 自动清理逻辑
|
|
65
57
|
|
|
66
|
-
|
|
67
|
-
|
|
58
|
+
1. **数据清理**:当机器人退出或被踢出群组时,插件会自动执行 `analyse.clear`清理相关统计。
|
|
59
|
+
2. **反制措施**:若开启 `kickBan`,被踢后会自动切断与相关管理员的好友关系。
|
|
60
|
+
|
|
61
|
+
## ⚠️ 注意事项
|
|
62
|
+
|
|
63
|
+
- 使用验证码模式时,请确保机器人拥有**管理员权限**,否则无法在验证失败时踢出成员。
|
|
64
|
+
- `notifyTarget` 必须符合 `platform:id` 格式,且机器人必须与该目标存在好友或群成员关系。
|