修复两个bug:

1. 问题3:OCR逗号断行 - 在_process_ocr_output中添加连续行合并逻辑,防止EasyOCR将中文逗号视为行边界导致消息前半段丢失
2. 问题4:回复重试逻辑失效 - 为_paste_and_send添加force_retry参数,_execute_reply重试时跳过60秒冷却检查,实现真正的5秒间隔重试机制
This commit is contained in:
youpaishidifu
2026-08-03 21:31:14 +08:00
parent d87e482e1e
commit 795a245de7
2 changed files with 25 additions and 6 deletions
+2 -1
View File
@@ -407,7 +407,8 @@ class MsgBotApp(ctk.CTk):
# 带重试的发送逻辑
for attempt in range(max_retries):
ok = self.monitor._paste_and_send(platform, answer)
# 首次正常发送,重试时 force_retry 跳过60秒冷却
ok = self.monitor._paste_and_send(platform, answer, force_retry=(attempt > 0))
if ok:
self._log(f"[{platform}] 🤖 已自动回复: {answer[:60]}...")
return # 成功直接退出
+19 -1
View File
@@ -2379,6 +2379,22 @@ class MessageMonitor:
l = re.sub(r'\s*(?:[A-Za-z0-9]~)+\s*$', '', l).strip()
if l:
ocr_lines.append(l)
# —— 连续行合并(修复 EasyOCR 逗号断行) ——
# EasyOCR 对长消息在中文逗号","处拆行,导致前半句无时间戳被丢弃。
# 合并规则:前一行不以句末标点结尾 且 后一行不以时间戳开头 → 合并
_SENT_END = re.compile(r'[。!?…~))」』\]]$')
_TS_START = re.compile(r'^(?:\d{1,2}[.;:]\d{2}|(?:昨天|前天|大前天|今天|明天|星期[一二三四五六日天]|\d+天前)\s*\d)')
merged_lines = []
for rl in ocr_lines:
if merged_lines and not _SENT_END.search(merged_lines[-1]) and not _TS_START.match(rl):
merged_lines[-1] = merged_lines[-1] + ',' + rl
else:
merged_lines.append(rl)
if len(merged_lines) != len(ocr_lines):
logger.info(f"[ocr] 行合并: {len(ocr_lines)}行→{len(merged_lines)}行")
ocr_lines = merged_lines
engine_label = self._last_chosen_engine.get(platform, "")
for i, rl in enumerate(ocr_lines):
logger.info(f"[ocr] [{engine_label}/后处理] line[{i}]: {rl[:120]!r}")
@@ -4185,14 +4201,16 @@ class MessageMonitor:
self._seen_messages.add(text.strip())
return True
def _paste_and_send(self, platform: str, text: str) -> bool:
def _paste_and_send(self, platform: str, text: str, force_retry: bool = False) -> bool:
"""粘贴文本到输入框并发送(剪贴板 + SendInput)。"""
hwnd = self._cached_hwnd.get(platform)
if not hwnd:
return False
# 失败冷却检查:60 秒内同一消息不重试(防止卡死)
# force_retry=True 时跳过冷却(用于 _execute_reply 主动重试场景)
msg_hash = hash(text) % 100000
if not force_retry:
last_fail = self._failed_send_cooldown.get(msg_hash, 0.0)
if time.time() - last_fail < 60.0:
logger.debug(f"[{platform}] 发送冷却中({int(60-(time.time()-last_fail))}s),跳过")