fix: 陈旧时间戳消息直接拒绝,不进入DB查库第二关 (Task #1713)

根因:第二关基于DB记录时间判断(created_at),但DB记录是当前OCR抓取时
由 record_ocr_message() 创建的,无法反映消息的真实发送时间。
一条昨天17:26的消息在今天15:32被OCR抓取,DB记录时间为15:32,
time_diff=0 ≤ 300 → 通关 → 旧消息被误处理。

修复:
1. 第一关失败后,如果消息时间戳明确超过1小时(freshness_score==-10.0),
   直接拒绝(score=-100.0),不进入第二关的DB查库逻辑。
2. freshness_scores字典查找默认值从0.0改为-999.0(无时间戳),
   防止查字典失败时误以为有新鲜时间戳而放行旧消息。
3. 增加cleaned_item二次查找,应对content filter修改ts导致的key不匹配。
This commit is contained in:
youpaishidifu
2026-09-15 15:47:15 +08:00
parent 811c26db9d
commit 680f3e6a89
+22 -4
View File
@@ -11056,8 +11056,12 @@ class MessageMonitor:
score = self._score_message_quality(cleaned_item) score = self._score_message_quality(cleaned_item)
# ⭐ 时间戳新鲜度评分:使用预先计算的freshness_score # ⭐ 时间戳新鲜度评分:使用预先计算的freshness_score
# 从freshness_scores字典中获取当前消息的时间戳新鲜度分数 # 从freshness_scores字典中获取当前消息的时间戳新鲜度分数
freshness_score = freshness_scores.get(item, 0.0) # ⭐ Task #1713: 默认值从0.0改为-999.0(无时间戳),防止查字典失败时
# ⭐ Task #1680: 调试日志 - 查看freshness_score查找 # 误以为有新鲜时间戳而放行旧消息。同时用cleaned_item做二次查找
# (content filter可能修改了ts,导致原始key不匹配)。
freshness_score = freshness_scores.get(item, -999.0)
if freshness_score == -999.0 and item != cleaned_item:
freshness_score = freshness_scores.get(cleaned_item, -999.0)
_in_dict = item in freshness_scores _in_dict = item in freshness_scores
logger.debug(f"[{platform}] freshness_score查找: item={item!r:.30}, score={freshness_score:.1f}, " logger.debug(f"[{platform}] freshness_score查找: item={item!r:.30}, score={freshness_score:.1f}, "
f"在字典中={_in_dict}") f"在字典中={_in_dict}")
@@ -11077,10 +11081,24 @@ class MessageMonitor:
score = max(score + 5.0, 5.0) score = max(score + 5.0, 5.0)
logger.info(f"[{platform}] 第一关通过:有新鲜时间戳(自身),放行: {old_score:.1f}→{score:.1f}: {item[:50]}") logger.info(f"[{platform}] 第一关通过:有新鲜时间戳(自身),放行: {old_score:.1f}→{score:.1f}: {item[:50]}")
else: else:
# 第一关未通过:没有新鲜时间戳,进入第二关 # 第一关未通过:没有新鲜时间戳
# ⭐ Task #1713: 陈旧时间戳直接拒绝,不进入第二关
# 根因:第二关基于DB记录时间判断(created_at),但DB记录是当前OCR抓取时
# 由 record_ocr_message() 创建的,无法反映消息的真实发送时间。
# 一条昨天17:26的消息在今天15:32被OCR抓取,DB记录时间为15:32,
# time_diff=0 ≤ 300 → 通关 → 旧消息被误处理。
# 修复:如果消息自身有明确时间戳但已超时(freshness_score == -10.0),
# 直接拒绝,不给第二关任何放行机会。
if freshness_score == -10.0:
score = -100.0
logger.info(f"[{platform}] 陈旧时间戳直接拒绝(freshness={freshness_score:.1f}): {item[:50]}")
self._last_new_msg_time[platform] = time.time()
continue
logger.debug(f"[{platform}] 第一关未通过:无新鲜时间戳(自身),进入第二关: {item[:50]}") logger.debug(f"[{platform}] 第一关未通过:无新鲜时间戳(自身),进入第二关: {item[:50]}")
# 第二关:查库判断 # 第二关:查库判断(仅用于无时间戳的消息,freshness_score == -999.0)
# ⭐ Task #1693: 修复旧消息"搭便车"问题 # ⭐ Task #1693: 修复旧消息"搭便车"问题
# 旧消息通过 get_latest_record_timestamp() 搭上新消息的新鲜DB记录, # 旧消息通过 get_latest_record_timestamp() 搭上新消息的新鲜DB记录,
# 导致 time_diff≤300s → 通关 → 分数从15→20/18→23,盖过真正的新消息。 # 导致 time_diff≤300s → 通关 → 分数从15→20/18→23,盖过真正的新消息。