fix(monitor): 修复模糊匹配误删正常文本的严重bug

问题:
单字符昵称'祁'、'爱'等允许1字符编辑距离,导致:
- '一'被误识别为'祁'并删除
- '唉'被误识别为'祁'并删除
- '他'被误识别为'祁'并删除
消息内容被严重污染

根因:
_fuzzy_find()无长度限制,短昵称的模糊匹配过于宽松

修复:
添加长度保护:只有len(nick) >= 4的昵称才允许模糊匹配
短昵称仍支持精确匹配,但不进行容错

测试验证:
✓ 长昵称OCR误识别:'草原深险' → '草原探险' 正确模糊匹配
✓ 短昵称精确匹配:'祁' 仍然可以精确匹配删除
✓ 防误删:'服务器备用电源坏了' 不误匹配
✓ 防误删:'一'、'唉'、'他'等正常汉字不被删除
This commit is contained in:
youpaishidifu
2026-08-16 14:29:14 +08:00
parent 0b623fe098
commit 8bafd1e209
+10 -7
View File
@@ -4928,13 +4928,16 @@ class MessageMonitor:
break
# 精确匹配失败,尝试模糊匹配(OCR常见形近字误识别)
fuzzy_start = self._fuzzy_find(ts, nick, max_edits=1)
if fuzzy_start >= 0:
fuzzy_match = ts[fuzzy_start:fuzzy_start + len(nick)]
ts = (ts[:fuzzy_start] + ts[fuzzy_start + len(nick):]).lstrip()
logger.debug(f"[qq] 模糊匹配剥除OCR误识别昵称 {nick!r} -> {fuzzy_match!r} @ [{fuzzy_start}:{fuzzy_start + len(nick)}]")
changed = True
break
# ⭐ 长度保护:只有长度>=4的昵称才允许模糊匹配,防止单字符昵称误删正常文本
# 例:单字符昵称'祁'模糊匹配会把'一'/'唉'/'他'等正常汉字误删
if len(nick) >= 4:
fuzzy_start = self._fuzzy_find(ts, nick, max_edits=1)
if fuzzy_start >= 0:
fuzzy_match = ts[fuzzy_start:fuzzy_start + len(nick)]
ts = (ts[:fuzzy_start] + ts[fuzzy_start + len(nick):]).lstrip()
logger.debug(f"[qq] 模糊匹配剥除OCR误识别昵称 {nick!r} -> {fuzzy_match!r} @ [{fuzzy_start}:{fuzzy_start + len(nick)}]")
changed = True
break
# ⭐ 群聊多消息拆分:OCR多条消息拼接时,[头衔]用户名 或 裸昵称 作为分隔符出现在文本中间
# 如 "C4炸弹起来准备测试了,[专业皮肤定制] C4炸弹,[专业皮肤定制] C4炸弹,youpaishidifu关于我们"