fix: OCR捕获bot自身回复菜单触发重复查库(Task #1515)

_is_noise_text(stage级)+逐行过滤新增bot回复菜单模式检测:
- 版本标签:(稳定版)(最新开发版)(官方版)等
- checkbox标记:[√][⚠][✗]
- md链接格式:[text](url)
防止OCR把屏幕上的bot回复菜单重新识别为新消息触发KB搜索。
This commit is contained in:
youpaishidifu
2026-08-11 22:07:15 +08:00
parent 92568c249f
commit 9080a4db0c
+33
View File
@@ -3733,6 +3733,30 @@ class MessageMonitor:
except Exception as e:
logger.debug(f"[{platform}] OCR 查库过滤异常: {e}")
# ⭐ Task #1515: bot回复菜单模式过滤
# OCR 把屏幕上的 bot 回复菜单(下载选项/checkbox 列表)重新识别为"新消息"。
# 典型特征:含版本标签 `(稳定版)` `(最新开发版)` `(官方版)` `(测试版)` 等,
# 或含 checkbox 标记 `[√]` `[⚠]` `[✗]`。正常用户聊天从不写这些。
_BOT_MENU_LABELS = re.compile(
r'\((?:稳定版|最新开发版|官方版|测试版|开发版|正式版|体验版|内测版|公测版|'
r'推荐|默认|可选|必选|已选|未选|免费|付费|专业版|企业版|个人版)\)'
)
if _BOT_MENU_LABELS.search(line):
logger.debug(f"[{platform}] OCR 过滤: bot回复菜单(版本标签) line={line!r}")
continue
# checkbox 标记:[ √ ] [ ⚠ ] [ ✗ ] [ X ] [ √] 等(OCR可能漏空格/括号)
if re.search(r'[\[【]\s*[√⚠✗×XvV✓✔]\s*[\]】]', line, re.IGNORECASE):
logger.debug(f"[{platform}] OCR 过滤: bot回复菜单(checkbox标记) line={line!r}")
continue
# 纯 checkbox 行:OCR 把 "[ √ ]" 读成 "√ " 或 "√"(无括号)
if re.match(r'^[√⚠✗×]{1,2}\s*$', line):
logger.debug(f"[{platform}] OCR 过滤: 纯checkbox符号 line={line!r}")
continue
# bot 回复中的下载链接格式:[官方下载](url) [bbsmc分流](url) 等
if re.search(r'\[.+\]\(https?://.+\)', line):
logger.debug(f"[{platform}] OCR 过滤: bot回复(md链接) line={line!r}")
continue
# === 全面 md 语法兜底:正常用户不写 md,只可能是 bot 回复 ===
# ** 加粗标记(用户聊天从不打 **)
if '**' in line:
@@ -5821,6 +5845,15 @@ class MessageMonitor:
if any(kw in text for kw in _SECURITY_POPUP_KEYWORDS):
logger.debug(f"[ocr] 过滤器2结果: 检测到安全软件弹窗内容,返回True: {text[:60]!r}")
return True
# ⭐ Task #1515: bot回复菜单内容过滤(stage级)
# OCR把屏幕上bot的回复菜单(下载选项列表等)整段识别为文本。
# 含版本标签或md链接→高概率bot回复内容,非用户消息。
if re.search(r'\((?:稳定版|最新开发版|官方版|测试版|开发版|正式版|体验版|内测版|公测版)\)', text):
logger.debug(f"[ocr] 过滤器2结果: 检测到bot回复菜单(版本标签),返回True: {text[:60]!r}")
return True
if re.search(r'\[.+\]\(https?://.+\)', text):
logger.debug(f"[ocr] 过滤器2结果: 检测到bot回复(md链接格式),返回True: {text[:60]!r}")
return True
# ⭐ Task #1514: OCR病句乱码检测:数字混杂在中文字符间(如"游0由")
# OCR把不同区域文字拼接时,数字被嵌入中文字符中间形成乱码。
# 正常中文聊天中,数字通常出现在完整数字串(时间戳/数量/版本号)中,