fix: QQ头衔+bot账号垃圾消息过滤,清理查库队列

根因:OCR把QQ群聊头衔[专业皮肤定制]、bot账号(youpaishidifu)自身回复识别为用户消息,
重启后_replied_texts清空,bot旧回复无历史记录可比对,全部混入查库队列。

修复:
- 规则2扩展:半角方括号[]匹配OCR头衔(原只匹配全角【】)
- 规则2b新增:行内嵌入头衔+无问号+长度≤30字→bot回复(头衔在消息体中间=bot特征)
- 规则7新增:含bot账号名(youpaishidifu)+无问号→bot系统消息,过滤

回归:截图场景4条垃圾消息全FILTER,关于我们/专业皮肤定制怎么配 KEEP,[GG]游戏管理员 FILTER
This commit is contained in:
youpaishidifu
2026-08-19 20:48:26 +08:00
parent 81a9a7c51c
commit 61dc653915
+23 -2
View File
@@ -6655,11 +6655,22 @@ class MessageMonitor:
if re.match(r'^!0?\s*\(?\s*img/', s, re.IGNORECASE):
logger.debug(f"[qq-ui] 规则1匹配(图片引用): {s}")
return True
# 2) 用户头衔/徽章: 【...】Username
# 2) 用户头衔/徽章: 【...】Username 或 [...]Username
# QQ 群成员的头衔标签,如【专业皮肤定制】C418minecraft
if re.match(r'^【[^】]{1,30}】\s*[\w\u4e00-\u9fff]+', s):
# ⭐ 2026-08-19: OCR 常把全角【】识别成半角[],两种都匹配
# ⚠ 扩展:行内含头衔+无问号→bot消息(头衔出现在消息体中间,说明是bot回复,
# 用户消息头衔在用户名上方不在消息体里);行首头衔+独立用户名→同样过滤。
if re.match(r'^(?:【[^】]{1,30}】|\[[^\]]{1,30}\])\s*[\w\u4e00-\u9fff]+', s):
logger.debug(f"[qq-ui] 规则2匹配(头衔徽章): {s}")
return True
# ⭐ 2026-08-19: 行内含半角/全角头衔 + 无问号 + 长度≤30字 → bot回复
# 如"来吧小姐姐,[专业皮肤定制]"(12字)、"我>新问题,[专业皮肤定制]"(16字)
# 头衔出现在消息体中间 = bot消息(用户消息头衔不在消息体里)
# ⚠ 长度限制:用户正常消息含头衔(如"专业皮肤定制怎么配?")>30字不拦截
_q_in_s = ('?' in s or '?' in s or any(q in s for q in ('怎么', '如何', '什么', '请问', '哪')))
if not _q_in_s and len(s) <= 30 and (re.search(r'(?:【[^】]{1,30}】|\[[^\]]{1,30}])', s)):
logger.debug(f"[qq-ui] 规则2b匹配(消息体嵌入头衔): {s}")
return True
# 3) 用户标签: ## @Username — QQ 的 @ 提及格式
if re.match(r'^##\s*@[\w\u4e00-\u9fff]+', s):
logger.debug(f"[qq-ui] 规则3匹配(##标签): {s}")
@@ -6713,6 +6724,16 @@ class MessageMonitor:
if re.match(r'^(?:[\u4e00-\u9fff]+)?@[\w\u4e00-\u9fff]+[\s]+[\w\u4e00-\u9fff]+(?:[\s]+[\w\u4e00-\u9fff]+)*$', s):
logger.debug(f"[qq-ui] 规则6匹配(纯@消息): {s}")
return True
# 7) Bot账号自身消息:行内含bot账号名(youpaishidifu)+ 无疑问词
# 重启后历史清空,bot旧回复被OCR重新识别当成新消息入库。
# 特征:含账号名 + 无问号/疑问词 → bot系统消息,过滤。
# ⚠ 含疑问词时放行(如"youpaishidifu是什么?"可能是用户真实查询)
_bot_accounts = ('youpaishidifu',)
if any(acc in s for acc in _bot_accounts):
_qwords7 = ('?', '?', '请问', '是不是', '怎么', '如何', '什么', '哪', '谁', '多少', '几')
if not any(q in s for q in _qwords7):
logger.debug(f"[qq-ui] 规则7匹配(bot账号消息): {s}")
return True
return False
@staticmethod