fix(msgbot): bot表格日期剥离——只有年月日无时间→表格内容不用于丢弃判断

- 检测每个日期后是否紧跟时间(年月日+时:分 → 真消息;只有年月日 → bot表格)
- 若所有日期均无时间→判定为bot表格日期→剥离后继续处理,不触发历史消息丢弃
- 场景:用户问"近期公告"→bot回复表格含"2026年8月3日"→OCR读到日期→原逻辑整条丢弃→用户新消息丢失
- 修复后:表格日期被剥离,用户消息正常进入下游处理
This commit is contained in:
youpaishidifu
2026-08-29 18:24:51 +08:00
parent c55c382358
commit 4a7544c989
+18
View File
@@ -6398,7 +6398,25 @@ class MessageMonitor:
# OCR常把日期和时间连在一起:2026/8/319:45:20 → 匹配到2026/8/31(未来/非法)
# 需要截断到最后一个合法且≤今天的日期
# ⭐ 2026-08-15 修复:扩展正则支持中文日期格式(2026年8月3日)
# ⭐ 2026-08-29 修复:检测日期是否附带时间——bot表格只有日期无时间,QQ消息日期+时分
raw_dates = re.findall(r'\d{4}[/-]\d{1,2}[/-]\d{1,2}|\d{4}年\d{1,2}月\d{1,2}日', text)
# 检测每个日期后是否紧跟时间(年月日+时:分 → 真消息;只有年月日 → bot表格)
_dates_with_time = 0
_dates_without_time = 0
for _d_match in re.finditer(r'(\d{4}[/-]\d{1,2}[/-]\d{1,2}|\d{4}年\d{1,2}月\d{1,2}日)(\s*\d{1,2}:\d{1,2})', text):
_dates_with_time += 1
_dates_without_time = len(raw_dates) - _dates_with_time
_all_dates_are_table = len(raw_dates) > 0 and _dates_without_time == len(raw_dates)
if _all_dates_are_table:
logger.debug(f"[ocr] 所有日期均无附带时间({len(raw_dates)}个),判定为bot表格日期,剥离后继续处理")
# 剥离表格日期(用空格替换),保留其余文本给下游处理
text = re.sub(r'\d{4}[/-]\d{1,2}[/-]\d{1,2}|\d{4}年\d{1,2}月\d{1,2}日', '', text)
normalized = self._normalize_timestamps(text)
# 重新提取时间戳(日期被剥离后可能暴露新的时间戳)
timestamps = re.findall(r'\d{1,2}:\d{1,2}(?::\d{1,2})?', normalized)
# 重新设置 dates 为空,走后续"无日期"逻辑
raw_dates = []
dates = []
raw_dates = [d.replace('-', '/').replace('年', '/').replace('月', '/').replace('日', '') for d in raw_dates]
today = datetime.now().date()