From 5e2e85cb2d47f242c8229bd136cc81ac9037516a Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Mon, 3 Nov 2025 20:48:54 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20(#29)=20=E4=BF=AE=E5=A4=8D=20`=E7=BE=A4?= =?UTF-8?q?=E5=88=86=E6=9E=90=E8=8E=B7=E5=8F=96=E5=8E=86=E5=8F=B2=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E6=9C=BA=E5=88=B6=E5=B9=B6=E4=B8=8D=E4=B8=A5?= =?UTF-8?q?=E6=A0=BC=EF=BC=8C=E5=87=BA=E7=8E=B0=E8=B6=85=E8=BF=87=E5=BD=93?= =?UTF-8?q?=E5=A4=A9=E6=B6=88=E6=81=AF=E3=80=81=E8=B6=85=E8=BF=87=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E6=95=B0=E9=87=8F=E9=99=90=E5=88=B6=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5`=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/message_handler.py | 43 +++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/core/message_handler.py b/src/core/message_handler.py index 76b4f03..cd5bf0f 100644 --- a/src/core/message_handler.py +++ b/src/core/message_handler.py @@ -129,11 +129,21 @@ class MessageHandler: # 过滤时间范围内的消息 valid_messages_in_round = 0 oldest_msg_time = None + has_out_of_range_message = False for msg in round_messages: try: msg_time = datetime.fromtimestamp(msg.get("time", 0)) - oldest_msg_time = msg_time + + # 记录本轮最老的消息时间 + if oldest_msg_time is None or msg_time < oldest_msg_time: + oldest_msg_time = msg_time + + # 检查是否已经超出时间范围 + if msg_time < start_time: + has_out_of_range_message = True + # 继续处理本轮剩余消息,但不再查询下一轮 + continue # 过滤掉机器人自己的消息 sender_id = str(msg.get("sender", {}).get("user_id", "")) @@ -147,18 +157,19 @@ class MessageHandler: logger.warning(f"群 {group_id} 处理单条消息失败: {msg_error}") continue - # 如果最老的消息时间已经超出范围,停止获取 - if oldest_msg_time and oldest_msg_time < start_time: - logger.info(f"群 {group_id} 已获取到时间范围外的消息,停止获取。共获取 {len(messages)} 条消息") + # 如果本轮有消息已经超出时间范围,立即停止获取 + if has_out_of_range_message: + logger.info(f"群 {group_id} 已获取到时间范围外的消息(最老消息时间: {oldest_msg_time.strftime('%Y-%m-%d %H:%M:%S')}),停止获取。共获取 {len(messages)} 条消息") break + # 如果本轮没有获取到任何有效消息,停止获取 if valid_messages_in_round == 0: - logger.warning(f"群 {group_id} 本轮未获取到有效消息") + logger.warning(f"群 {group_id} 本轮未获取到有效消息,停止获取") break # 如果已经获取到足够的消息(达到 max_messages),停止获取 if len(messages) >= max_messages: - logger.info(f"群 {group_id} 已获取到足够的消息({len(messages)} 条,限制 {max_messages} 条),停止获取") + logger.info(f"群 {group_id} 已达到消息数量限制({len(messages)} 条,限制 {max_messages} 条),停止获取") break message_seq = round_messages[0]["message_id"] @@ -176,6 +187,26 @@ class MessageHandler: break await asyncio.sleep(1) + # ========== 最终清理步骤:严格过滤和限制 ========== + original_count = len(messages) + + # 1. 严格过滤时间范围外的消息 + messages = [ + msg for msg in messages + if start_time <= datetime.fromtimestamp(msg.get("time", 0)) <= end_time + ] + time_filtered_count = len(messages) + + # 2. 严格限制消息数量 + if len(messages) > max_messages: + # 保留最新的消息(假设messages已按时间排序,从新到旧) + messages = messages[:max_messages] + logger.info(f"群 {group_id} 消息数量超过限制,已截断: {time_filtered_count} -> {max_messages} 条") + + # 记录清理结果 + if original_count != len(messages): + logger.info(f"群 {group_id} 最终清理: 原始 {original_count} 条 -> 时间过滤 {time_filtered_count} 条 -> 最终 {len(messages)} 条") + logger.info(f"群 {group_id} 消息获取完成,共获取到 {len(messages)} 条有效消息(时间范围: 近{days}天),查询轮数: {query_rounds}") return messages