koishi-plugin-group-analysis-mx 1.3.9 → 1.4.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/lib/service/analysis.js +8 -3
- package/lib/service/message.js +4 -2
- package/lib/utils.js +19 -2
- package/package.json +1 -1
package/lib/service/analysis.js
CHANGED
|
@@ -226,7 +226,10 @@ class AnalysisService extends koishi_1.Service {
|
|
|
226
226
|
limit: totalLimit,
|
|
227
227
|
purpose: 'user-persona'
|
|
228
228
|
});
|
|
229
|
-
results.push(...history
|
|
229
|
+
results.push(...history
|
|
230
|
+
.map((message) => ({ ...message, content: (0, utils_1.cleanContent)(message.content) }))
|
|
231
|
+
.filter((message) => message.content && !(0, utils_1.isJunkMessage)(message.content))
|
|
232
|
+
.map((message) => ({
|
|
230
233
|
...message,
|
|
231
234
|
guildId: message.guildId ?? group.guildId,
|
|
232
235
|
channelId: message.channelId ?? group.channelId
|
|
@@ -811,8 +814,10 @@ class AnalysisService extends koishi_1.Service {
|
|
|
811
814
|
}
|
|
812
815
|
}
|
|
813
816
|
async analyzeGroupMessages(messages, selfId, target, context) {
|
|
814
|
-
//
|
|
815
|
-
messages = (messages || [])
|
|
817
|
+
// 清洗原始协议标签、过滤官方 bot 签名等非聊天垃圾内容
|
|
818
|
+
messages = (messages || [])
|
|
819
|
+
.map((m) => ({ ...m, content: (0, utils_1.cleanContent)(m.content) }))
|
|
820
|
+
.filter((m) => m.content && !(0, utils_1.isJunkMessage)(m.content));
|
|
816
821
|
this.ctx.logger.info(`开始分析 ${messages.length} 条消息...`);
|
|
817
822
|
const { userStats, totalChars, totalEmojiCount, allMessagesText } = (0, utils_1.calculateBasicStats)(messages);
|
|
818
823
|
const messagesText = allMessagesText.join('\n');
|
package/lib/service/message.js
CHANGED
|
@@ -69,8 +69,10 @@ class MessageService extends koishi_1.Service {
|
|
|
69
69
|
if (this.config.personaBlacklist?.includes(session.userId)) {
|
|
70
70
|
return;
|
|
71
71
|
}
|
|
72
|
+
// 清洗掉官方 bot 的原始表情/协议标签,只保留正常文字
|
|
73
|
+
const cleanContent = (0, utils_1.cleanContent)(session.content);
|
|
72
74
|
// 腾讯官方 bot 的签名等非聊天垃圾内容,不记录
|
|
73
|
-
if ((0, utils_1.isJunkMessage)(
|
|
75
|
+
if ((0, utils_1.isJunkMessage)(cleanContent) || !cleanContent) {
|
|
74
76
|
return;
|
|
75
77
|
}
|
|
76
78
|
const uniqueId = session.messageId
|
|
@@ -88,7 +90,7 @@ class MessageService extends koishi_1.Service {
|
|
|
88
90
|
avatarUrl: session.event.user?.avatar || '',
|
|
89
91
|
// 用户昵称可能存在事件缺失(如官方 QQ bot 作者未返回 username),做多级兜底
|
|
90
92
|
username: session.username || session.event?.user?.name || session.userId || '未知用户',
|
|
91
|
-
content:
|
|
93
|
+
content: cleanContent,
|
|
92
94
|
timestamp: new Date(session.timestamp),
|
|
93
95
|
messageId: session.messageId
|
|
94
96
|
};
|
package/lib/utils.js
CHANGED
|
@@ -28,6 +28,7 @@ exports.buildGroupAnalysisCacheKey = buildGroupAnalysisCacheKey;
|
|
|
28
28
|
exports.buildMessagePersistenceKey = buildMessagePersistenceKey;
|
|
29
29
|
exports.isNapCatBot = isNapCatBot;
|
|
30
30
|
exports.isJunkMessage = isJunkMessage;
|
|
31
|
+
exports.cleanContent = cleanContent;
|
|
31
32
|
const koishi_1 = require("koishi");
|
|
32
33
|
const skins_1 = require("./skins");
|
|
33
34
|
function calculateBasicStats(messages) {
|
|
@@ -381,12 +382,28 @@ function isJunkMessage(content) {
|
|
|
381
382
|
const s = String(content).trim();
|
|
382
383
|
if (!s)
|
|
383
384
|
return false;
|
|
384
|
-
// 腾讯 QQ
|
|
385
|
-
if (
|
|
385
|
+
// 腾讯 QQ 官方机器人消息签名(任意位置出现都过滤)
|
|
386
|
+
if (/ROBOT1\.0_/.test(s))
|
|
386
387
|
return true;
|
|
387
388
|
// 超长且无空白的 sign/token 串(正常聊天不会这样)
|
|
388
389
|
if (s.length > 150 && !/\s/.test(s) && /^[A-Za-z0-9+/=_.!-]+$/.test(s))
|
|
389
390
|
return true;
|
|
390
391
|
return false;
|
|
391
392
|
}
|
|
393
|
+
/**
|
|
394
|
+
* 清洗消息内容:移除 QQ 官方 bot 的原始协议标签(<faceType=...>、<@...>、<#...> 等),只保留正常文字。
|
|
395
|
+
*/
|
|
396
|
+
function cleanContent(content) {
|
|
397
|
+
if (content === null || content === undefined)
|
|
398
|
+
return '';
|
|
399
|
+
let s = String(content);
|
|
400
|
+
// 官方表情原始标签(含 faceId/ext)
|
|
401
|
+
s = s.replace(/<faceType=[^>]*>/gi, '');
|
|
402
|
+
s = s.replace(/<faceId=[^>]*>/gi, '');
|
|
403
|
+
// @ 提及 / 频道等原始标签
|
|
404
|
+
s = s.replace(/<@[^>]*>/g, '');
|
|
405
|
+
s = s.replace(/<#[^>]*>/g, '');
|
|
406
|
+
s = s.replace(/\s+/g, ' ').trim();
|
|
407
|
+
return s;
|
|
408
|
+
}
|
|
392
409
|
//# sourceMappingURL=utils.js.map
|
package/package.json
CHANGED