From f9c4b161f3bcb79c6795ee9bc887a3b300af38ce Mon Sep 17 00:00:00 2001 From: youpaishidifu Date: Fri, 31 Jul 2026 21:20:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=81=8F=E6=97=81=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=81=8F=E6=97=81=E4=B8=A2=E5=BC=83=20+=20?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E9=85=8D=E7=BD=AE=E4=B9=B1=E7=A0=81=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 偏旁过滤逻辑:从'替换为补充字符'改为'包含偏旁字符就丢弃' 修复'法'被OCR拆成'氵去'后替换为'河去'的问题 - 新增英文配置格式+乱码过滤:拦截 key=value 后跟乱码的模式 如 'invite referral bonus=5a激<5' - OCR级和Poll级同步更新偏旁过滤和乱码过滤规则 --- monitor.py | 59 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/monitor.py b/monitor.py index 7980388..89e60fd 100644 --- a/monitor.py +++ b/monitor.py @@ -1997,6 +1997,21 @@ class MessageMonitor: logger.debug(f"[{platform}] OCR 过滤: 生僻字/罕见字 line={line!r}") continue + # —— 英文配置格式+乱码过滤:key=value 或 key: value 后跟乱码 —— + # 如 "invite referral bonus=5a激<5"、"config=file.txt乱码" + if re.search(r'[a-zA-Z_]{2,}\s*[=:]\s*\S+', line): + # 检查是否包含乱码特征:特殊字符、数字字母混合、非正常英文单词 + 乱码特征 = False + # 特征1:等号或冒号后包含特殊字符(<>!@#$%^&*等) + if re.search(r'[=:]\s*[a-zA-Z0-9]*[<>!@#$%^&*()\[\]{}|\\/:;\'",.?~`]+', line): + 乱码特征 = True + # 特征2:等号或冒号后包含数字字母混合但无空格(如"5a激<5") + if re.search(r'[=:]\s*[a-zA-Z0-9]{3,}[^\s,.;:!?。,;:!?\u4e00-\u9fff]', line): + 乱码特征 = True + if 乱码特征: + logger.debug(f"[{platform}] OCR 过滤: 英文配置+乱码 line={line!r}") + continue + # —— 系统配置内容过滤:Wiki/文档页面内容 —— if re.search(r'概览|数据看板|在线玩家|注册用户|活跃玩家|玩家数据', line): logger.debug(f"[{platform}] OCR 过滤: 系统配置内容(Wiki) line={line!r}") @@ -2069,17 +2084,12 @@ class MessageMonitor: logger.debug(f"[{platform}] OCR 过滤: 结构化面板 line={line!r}") continue - # —— OCR 偏旁碎片过滤:替换偏旁为正确汉字 —— - # 如果偏旁有补充字符(非空)→ 替换为补充字符,继续处理 - # 如果偏旁无补充字符(空)→ 整段丢弃 - line_replaced, discard = _replace_radicals(line) - if discard: - logger.debug(f"[{platform}] OCR 过滤: 偏旁无补充字符(丢弃) line={line!r}") + # —— OCR 偏旁碎片过滤:包含偏旁字符就丢弃 —— + # 偏旁字符(U+2E80-U+2FDF)在正常中文聊天中不会出现 + # OCR 拆字碎片如"亻牛""彡"只要出现就是碎片 + if any(ch in _RADICAL_MAP for ch in line): + logger.debug(f"[{platform}] OCR 过滤: 包含偏旁字符(丢弃) line={line!r}") continue - if line_replaced != line: - # 有偏旁被替换,使用替换后的文本继续处理 - logger.debug(f"[{platform}] OCR 偏旁替换: {line!r} → {line_replaced!r}") - line = line_replaced # —— 系统配置内容过滤:SMTP/邮件地址/代码片段不是用户消息 —— if re.search(r'@example|smtp|\.py\b|\.bat\b|\.sh\b|//.*\.\w{2,4}\b', line, re.IGNORECASE): logger.debug(f"[{platform}] OCR 过滤: 系统配置内容 line={line!r}") @@ -3748,6 +3758,20 @@ class MessageMonitor: if cjk > 0 and cjk / max(len(ts), 1) < 0.15: logger.debug(f"[{platform}] Poll过滤: CJK比例过低乱码 ts={ts!r}") continue + # === 英文配置格式+乱码过滤:key=value 或 key: value 后跟乱码 === + # 如 "invite referral bonus=5a激<5"、"config=file.txt乱码" + if re.search(r'[a-zA-Z_]{2,}\s*[=:]\s*\S+', ts): + # 检查是否包含乱码特征:特殊字符、数字字母混合、非正常英文单词 + 乱码特征 = False + # 特征1:等号或冒号后包含特殊字符(<>!@#$%^&*等) + if re.search(r'[=:]\s*[a-zA-Z0-9]*[<>!@#$%^&*()\[\]{}|\\/:;\'",.?~`]+', ts): + 乱码特征 = True + # 特征2:等号或冒号后包含数字字母混合但无空格(如"5a激<5") + if re.search(r'[=:]\s*[a-zA-Z0-9]{3,}[^\s,.;:!?。,;:!?\u4e00-\u9fff]', ts): + 乱码特征 = True + if 乱码特征: + logger.debug(f"[{platform}] Poll过滤: 英文配置+乱码 ts={ts!r}") + continue # === 斜线英文命令碎片:"/sdfl undo撤销导入" 命令帮助碎片 === if re.match(r'^/[A-Za-z]', ts): logger.debug(f"[{platform}] Poll过滤: 斜线英文命令 ts={ts!r}") @@ -3779,17 +3803,12 @@ class MessageMonitor: if len(colon_kv) >= 3: logger.debug(f"[{platform}] Poll过滤: 结构化面板 ts={ts!r}") continue - # === 偏旁碎片过滤:替换偏旁为正确汉字 === - # 如果偏旁有补充字符(非空)→ 替换为补充字符,继续处理 - # 如果偏旁无补充字符(空)→ 整段丢弃 - ts_replaced, discard = _replace_radicals(ts) - if discard: - logger.debug(f"[{platform}] Poll过滤: 偏旁无补充字符(丢弃) ts={ts!r}") + # === 偏旁碎片过滤:包含偏旁字符就丢弃 === + # 偏旁字符(U+2E80-U+2FDF)在正常中文聊天中不会出现 + # OCR 拆字碎片如"亻牛""彡"只要出现就是碎片 + if any(ch in _RADICAL_MAP for ch in ts): + logger.debug(f"[{platform}] Poll过滤: 包含偏旁字符(丢弃) ts={ts!r}") continue - if ts_replaced != ts: - # 有偏旁被替换,使用替换后的文本继续处理 - logger.debug(f"[{platform}] Poll偏旁替换: {ts!r} → {ts_replaced!r}") - ts = ts_replaced # === 系统配置内容过滤:SMTP/邮件地址/代码片段不是用户消息 === if re.search(r'@example|smtp|\.py\b|\.bat\b|\.sh\b|//.*\.\w{2,4}\b', ts, re.IGNORECASE): logger.debug(f"[{platform}] Poll过滤: 系统配置内容 ts={ts!r}")