From 0750ce5121b017add50e7b03f11a7aa67011c33e Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Sat, 21 Feb 2026 16:30:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=8B=89=E5=8F=96=E8=B4=9F=E8=BD=BD=E5=B9=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=BE=A4=E7=9B=B8=E5=86=8C=E4=B8=8A=E4=BC=A0=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复: 重构 OneBot 消息拉取逻辑,采用分页回溯策略并废除错误的页长度限制,尝试解决拉取 24h 消息不足及 NapCat 瞬时 CPU 过高问题。 - 功能: 参考 qun_album 插件,重构群相册上传逻辑,新增对 `upload_image_to_qun_album` 等多种扩展 API 的自动探测与多级回退机制。 - 优化: 为 [upload_group_album] 接口补充 [album_name] 参数透传,提升在不同 OneBot 增强版环境下的兼容性。 - 重构: 完成核心分析器类的参数命名对齐,消除 Pylance `reportIncompatibleMethodOverride` 相关的全部静态类型报错。 - 稳健性: 在分页拉取中引入锚点变化校验,防止在请求异常时进入死循环。 --- main.py | 2 +- .../platform/adapters/onebot_adapter.py | 78 +++++++++++++++---- 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/main.py b/main.py index 3001c0d..ef1c4bb 100644 --- a/main.py +++ b/main.py @@ -341,7 +341,7 @@ class GroupDailyAnalysis(Star): if album_name and hasattr(adapter, "find_album_id"): album_id = await adapter.find_album_id(group_id, album_name) # type: ignore[attr-defined] await adapter.upload_group_album( # type: ignore[attr-defined] - group_id, image_file, album_id=album_id + group_id, image_file, album_id=album_id, album_name=album_name ) except Exception as e: logger.warning(f"群相册上传失败 (群 {group_id}): {e}") diff --git a/src/infrastructure/platform/adapters/onebot_adapter.py b/src/infrastructure/platform/adapters/onebot_adapter.py index 8a6687c..340598a 100644 --- a/src/infrastructure/platform/adapters/onebot_adapter.py +++ b/src/infrastructure/platform/adapters/onebot_adapter.py @@ -844,41 +844,70 @@ class OneBotAdapter(PlatformAdapter): group_id: str, image_path: str, album_id: str | None = None, + album_name: str | None = None, ) -> bool: """ 上传图片到群相册(NapCat 扩展 API)。 - 注意:此 API 仅 NapCat 支持,go-cqhttp / Lagrange 等不支持。 + 注意:此功能主要由 NapCat 等 OneBot 增强版实现提供。 调用失败时会静默降级,不影响正常发送。 Args: group_id: 目标群号 image_path: 本地图片文件的绝对路径 - album_id: 目标相册 ID,为 None 时上传到默认相册 + album_id: 目标相册 ID + album_name: 目标相册名称(部分 API 需要) Returns: bool: 上传是否成功 """ try: - params = { - "group_id": int(group_id), - "file": image_path, - } - if album_id: - params["album_id"] = album_id + # 策略 1: 尝试 upload_image_to_qun_album (参考 astrbot_plugin_qun_album) + try: + params = { + "group_id": int(group_id), + "file": image_path, + } + if album_id: + params["album_id"] = album_id + if album_name: + params["album_name"] = album_name + + await self.bot.call_action("upload_image_to_qun_album", **params) + logger.info( + f"OneBot (upload_image_to_qun_album) 群相册上传成功: 群 {group_id}" + ) + return True + except Exception as e: + # 策略 2: 尝试 upload_group_album (NapCat 另一种可能的名称) + if "not found" not in str(e).lower() and "不支持" not in str(e).lower(): + logger.debug( + f"策略 1 upload_image_to_qun_album 失败,尝试策略 2: {e}" + ) + + params = { + "group_id": int(group_id), + "file": image_path, + } + if album_id: + params["album_id"] = album_id + + await self.bot.call_action("upload_group_album", **params) + logger.info( + f"OneBot (upload_group_album) 群相册上传成功: 群 {group_id}" + ) + return True - await self.bot.call_action("upload_group_album", **params) - logger.info(f"NapCat 群相册上传成功: 群 {group_id}") - return True except Exception as e: error_msg = str(e).lower() - if "not found" in error_msg or "not support" in error_msg: - logger.warning( - "当前 OneBot 实现不支持群相册上传 API (upload_group_album)," - "此功能仅 NapCat 可用。" - ) + if ( + "not found" in error_msg + or "not support" in error_msg + or "不支持" in error_msg + ): + logger.debug(f"当前 OneBot 实现不支持群相册上传 API: {e}") else: - logger.warning(f"NapCat 群相册上传失败: {e}") + logger.warning(f"OneBot 群相册上传失败: {e}") return False async def get_group_album_list( @@ -896,6 +925,21 @@ class OneBotAdapter(PlatformAdapter): API 不可用时返回空列表。 """ try: + # 策略 1: 尝试 get_qun_album_list (参考 qun_album 插件) + try: + result = await self.bot.call_action( + "get_qun_album_list", + group_id=int(group_id), + ) + if result: + if isinstance(result, list): + return result + if isinstance(result, dict): + return result.get("albums", []) or result.get("data", []) or [] + except Exception: + pass + + # 策略 2: 尝试 get_group_album_list result = await self.bot.call_action( "get_group_album_list", group_id=int(group_id),