From 2a98df85c528e9cff65e6a0445dc129e04734672 Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Sat, 31 Jan 2026 16:12:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(scheduler):=20=E4=BF=AE=E5=A4=8D=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=88=86=E6=9E=90=E5=8F=91=E9=80=81=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E4=B8=8D=E5=AE=8C=E5=85=A8=E9=9D=99=E9=BB=98=E7=9A=84=20Bug?= =?UTF-8?q?=EF=BC=8C=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E5=8F=91=E9=80=81=E5=9B=9E=E9=80=80=E6=97=B6=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scheduler/auto_scheduler.py | 80 ++++++++++++--------------------- 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/src/scheduler/auto_scheduler.py b/src/scheduler/auto_scheduler.py index 9577361..311493e 100644 --- a/src/scheduler/auto_scheduler.py +++ b/src/scheduler/auto_scheduler.py @@ -514,6 +514,8 @@ class AutoScheduler: if self.html_render_func: # 使用图片格式 logger.info(f"群 {group_id} 自动分析使用图片报告格式") + image_report_sent = False + try: ( image_url, @@ -529,73 +531,53 @@ class AutoScheduler: ) if image_url: - success = await self._send_image_message( + # 尝试发送图片 + image_report_sent = await self._send_image_message( group_id, image_url ) - if success: + if image_report_sent: logger.info(f"群 {group_id} 图片报告发送成功") - else: - # 图片发送失败,回退到文本 - logger.warning( - f"群 {group_id} 发送图片报告失败,回退到文本报告" - ) - text_report = ( - self.report_generator.generate_text_report( - analysis_result - ) - ) - await self._send_text_message( - group_id, f"📊 每日群聊分析报告:\n\n{text_report}" - ) - elif html_content: - # 生成失败但有HTML,加入重试队列 + except Exception as img_e: + logger.error(f"群 {group_id} 图片报告处理异常: {img_e}") + image_report_sent = False + # 确保 html_content 至少为 None (如果异常发生在解包之前) + if "html_content" not in locals(): + html_content = None + + # 如果图片并未成功发送(无论是生成失败,还是发送失败) + if not image_report_sent: + if html_content: + # 有 HTML 内容,尝试加入重试队列 logger.warning( - f"群 {group_id} 图片报告生成失败,加入重试队列" + f"群 {group_id} 图片报告未成功发送,尝试加入重试队列" ) - # 尝试获取 platform_id (如果参数为None) + # 尝试获取 platform_id if not platform_id: platform_id = await self.get_platform_id_for_group( group_id ) if platform_id: - # 定时任务静默重试,不发送提示消息,只记录日志 - logger.info( - f"群 {group_id} 图片生成失败,已静默加入重试队列" - ) + logger.info(f"群 {group_id} 已加入重试队列") await self.retry_manager.add_task( html_content, analysis_result, group_id, platform_id ) + return # 已加入队列,本次处理结束 + else: logger.error( f"群 {group_id} 无法获取平台ID,无法加入重试队列" ) - # Fallback to text - text_report = ( - self.report_generator.generate_text_report( - analysis_result - ) - ) - await self._send_text_message( - group_id, f"📊 每日群聊分析报告:\n\n{text_report}" - ) else: - # 图片生成失败(返回None),回退到文本 logger.warning( - f"群 {group_id} 图片报告生成失败(返回None),回退到文本报告" + f"群 {group_id} 图片生成失败且无HTML内容,无法重试" ) - text_report = self.report_generator.generate_text_report( - analysis_result - ) - await self._send_text_message( - group_id, f"📊 每日群聊分析报告:\n\n{text_report}" - ) - except Exception as img_e: - logger.error( - f"群 {group_id} 图片报告生成异常: {img_e},回退到文本报告" - ) + + # 最终兜底:发送文本报告 + # (执行到这里说明:要么没HTML,要么没PlatformID,无法重试) + logger.warning(f"群 {group_id} 回退到文本报告") text_report = self.report_generator.generate_text_report( analysis_result ) @@ -790,14 +772,10 @@ class AutoScheduler: ) # ========================================================= - # 3️⃣ 文本兜底 + # 3️⃣ 失败 # ========================================================= - logger.error(f"❌ 群 {group_id} 图片发送失败,回退到文本") - - await self._send_text_message( - group_id, - f"{prefix_text}\n图片发送失败,请查看链接:\n{image_url}", - ) + logger.error(f"❌ 群 {group_id} 图片发送失败 (URL 和 Base64 均失败)") + return False return False except Exception as e: