From d18f45aaec4f0bf27d2683fe45f930af16c808a8 Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Tue, 18 Nov 2025 20:34:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=88=86=E6=9E=90=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=AD=A3=E7=A1=AE=E5=8C=B9=E9=85=8D):=20?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=E7=BE=A4=E8=81=8A=E5=88=86?= =?UTF-8?q?=E6=9E=90=E6=96=87=E4=BB=B6=E7=9A=84=E5=8F=91=E9=80=81=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=EF=BC=8C=E4=B8=8E=E6=B6=88=E6=81=AF=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E9=80=BB=E8=BE=91=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scheduler/auto_scheduler.py | 151 +++++++++++++++++++++++--------- 1 file changed, 110 insertions(+), 41 deletions(-) diff --git a/src/scheduler/auto_scheduler.py b/src/scheduler/auto_scheduler.py index 9e85b7e..f2ee2ea 100644 --- a/src/scheduler/auto_scheduler.py +++ b/src/scheduler/auto_scheduler.py @@ -475,56 +475,124 @@ class AutoScheduler: logger.error(f"发送图片消息到群 {group_id} 失败: {e}") async def _send_text_message(self, group_id: str, text_content: str): - """发送文本消息到群""" + """发送文本消息到群 - 依次尝试所有可用平台""" try: - # 获取该群对应的平台ID和bot实例 - platform_id = await self._get_platform_id_for_group(group_id) - - if not platform_id: - logger.error(f"❌ 群 {group_id} 无法获取平台ID,无法发送文本") - return - - bot_instance = self.bot_manager.get_bot_instance(platform_id) - - if not bot_instance: - logger.error(f"❌ 群 {group_id} 发送文本失败:缺少bot实例(平台: {platform_id})") - return + # 获取所有可用的平台,依次尝试发送 + if hasattr(self.bot_manager, "_bot_instances") and self.bot_manager._bot_instances: + available_platforms = list(self.bot_manager._bot_instances.items()) + logger.info(f"群 {group_id} 检测到 {len(available_platforms)} 个可用平台,开始依次尝试发送文本...") + + for test_platform_id, test_bot_instance in available_platforms: + try: + logger.info(f"尝试使用平台 {test_platform_id} 向群 {group_id} 发送文本...") + + # 发送文本消息到群 + await test_bot_instance.api.call_action( + "send_group_msg", group_id=group_id, message=text_content + ) + logger.info(f"✅ 群 {group_id} 成功通过平台 {test_platform_id} 发送文本") + return True # 成功发送,返回 + + except Exception as e: + error_msg = str(e) + # 检查是否是特定的错误码 + if "retcode=1200" in error_msg: + logger.debug(f"平台 {test_platform_id} 发送文本失败:机器人可能不在此群中,继续尝试下一个平台") + else: + logger.debug(f"平台 {test_platform_id} 发送文本失败: {e},继续尝试下一个平台") + continue + + # 所有平台都尝试失败 + logger.error(f"❌ 群 {group_id} 所有平台都尝试发送文本失败") + return False + else: + # 回退到原来的逻辑(单个平台) + logger.warning(f"群 {group_id} 没有多个平台可用,使用回退逻辑") + platform_id = await self._get_platform_id_for_group(group_id) + + if not platform_id: + logger.error(f"❌ 群 {group_id} 无法获取平台ID,无法发送文本") + return False + + bot_instance = self.bot_manager.get_bot_instance(platform_id) + + if not bot_instance: + logger.error(f"❌ 群 {group_id} 发送文本失败:缺少bot实例(平台: {platform_id})") + return False - # 发送文本消息到群 - await bot_instance.api.call_action( - "send_group_msg", group_id=group_id, message=text_content - ) - logger.info(f"群 {group_id} 文本消息发送成功") + # 发送文本消息到群 + await bot_instance.api.call_action( + "send_group_msg", group_id=group_id, message=text_content + ) + logger.info(f"群 {group_id} 文本消息发送成功") + return True except Exception as e: logger.error(f"发送文本消息到群 {group_id} 失败: {e}") + return False async def _send_pdf_file(self, group_id: str, pdf_path: str): - """发送PDF文件到群""" + """发送PDF文件到群 - 依次尝试所有可用平台""" try: - # 获取该群对应的平台ID和bot实例 - platform_id = await self._get_platform_id_for_group(group_id) - - if not platform_id: - logger.error(f"❌ 群 {group_id} 无法获取平台ID,无法发送PDF") - return - - bot_instance = self.bot_manager.get_bot_instance(platform_id) - - if not bot_instance: - logger.error(f"❌ 群 {group_id} 发送PDF失败:缺少bot实例(平台: {platform_id})") - return + # 获取所有可用的平台,依次尝试发送 + if hasattr(self.bot_manager, "_bot_instances") and self.bot_manager._bot_instances: + available_platforms = list(self.bot_manager._bot_instances.items()) + logger.info(f"群 {group_id} 检测到 {len(available_platforms)} 个可用平台,开始依次尝试发送PDF...") + + for test_platform_id, test_bot_instance in available_platforms: + try: + logger.info(f"尝试使用平台 {test_platform_id} 向群 {group_id} 发送PDF...") + + # 发送PDF文件到群 + await test_bot_instance.api.call_action( + "send_group_msg", + group_id=group_id, + message=[ + {"type": "text", "data": {"text": "📊 每日群聊分析报告已生成:"}}, + {"type": "file", "data": {"file": pdf_path}}, + ], + ) + logger.info(f"✅ 群 {group_id} 成功通过平台 {test_platform_id} 发送PDF") + return True # 成功发送,返回 + + except Exception as e: + error_msg = str(e) + # 检查是否是特定的错误码 + if "retcode=1200" in error_msg: + logger.debug(f"平台 {test_platform_id} 发送PDF失败:机器人可能不在此群中,继续尝试下一个平台") + else: + logger.debug(f"平台 {test_platform_id} 发送PDF失败: {e},继续尝试下一个平台") + continue + + # 所有平台都尝试失败 + logger.error(f"❌ 群 {group_id} 所有平台都尝试发送PDF失败") + return False + else: + # 回退到原来的逻辑(单个平台) + logger.warning(f"群 {group_id} 没有多个平台可用,使用回退逻辑") + platform_id = await self._get_platform_id_for_group(group_id) + + if not platform_id: + logger.error(f"❌ 群 {group_id} 无法获取平台ID,无法发送PDF") + return False + + bot_instance = self.bot_manager.get_bot_instance(platform_id) + + if not bot_instance: + logger.error(f"❌ 群 {group_id} 发送PDF失败:缺少bot实例(平台: {platform_id})") + return False - # 发送PDF文件到群 - await bot_instance.api.call_action( - "send_group_msg", - group_id=group_id, - message=[ - {"type": "text", "data": {"text": "📊 每日群聊分析报告已生成:"}}, - {"type": "file", "data": {"file": pdf_path}}, - ], - ) - logger.info(f"群 {group_id} PDF文件发送成功") + # 发送PDF文件到群 + await bot_instance.api.call_action( + "send_group_msg", + group_id=group_id, + message=[ + {"type": "text", "data": {"text": "📊 每日群聊分析报告已生成:"}}, + {"type": "file", "data": {"file": pdf_path}}, + ], + ) + logger.info(f"群 {group_id} PDF文件发送成功") + return True except Exception as e: logger.error(f"发送PDF文件到群 {group_id} 失败: {e}") @@ -537,3 +605,4 @@ class AutoScheduler: ) except Exception as e2: logger.error(f"发送PDF失败提示到群 {group_id} 也失败: {e2}") + return False