From 31c7768ca009fe9695f2037ea2743c93242bc896 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Wed, 30 Apr 2025 21:47:14 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=20perf:=20=E4=BC=98=E5=8C=96=20QQ?= =?UTF-8?q?=20=E4=B8=8B=E8=87=AA=E5=8A=A8=E4=B8=8B=E8=BD=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/message/components.py | 7 ++-- .../aiocqhttp/aiocqhttp_platform_adapter.py | 40 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/astrbot/core/message/components.py b/astrbot/core/message/components.py index 5020d6b26..4f9c3afb3 100644 --- a/astrbot/core/message/components.py +++ b/astrbot/core/message/components.py @@ -29,7 +29,7 @@ import uuid import typing as T from enum import Enum from pydantic.v1 import BaseModel -from astrbot.core.utils.io import download_image_by_url, file_to_base64 +from astrbot.core.utils.io import download_image_by_url, file_to_base64, download_file class ComponentType(Enum): @@ -552,17 +552,18 @@ class Unknown(BaseMessageComponent): class File(BaseMessageComponent): """ - 目前此消息段只适配了 Napcat。 + 文件消息段 """ type: ComponentType = "File" name: T.Optional[str] = "" # 名字 - file: T.Optional[str] = "" # url(本地路径) + file: T.Optional[str] = "" # url 或者本地路径 def __init__(self, name: str, file: str): super().__init__(name=name, file=file) + class WechatEmoji(BaseMessageComponent): type: ComponentType = "WechatEmoji" md5: T.Optional[str] = "" diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py index 9cf6b5bab..11c25976d 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py @@ -225,32 +225,30 @@ class AiocqhttpAdapter(Platform): if m["data"].get("url") and m["data"].get("url").startswith("http"): # Lagrange logger.info("guessing lagrange") - file_name = m["data"].get("file_name", "file") - path = os.path.join("data/temp", file_name) - await download_file(m["data"]["url"], path) - - m["data"] = {"file": path, "name": file_name} - a = ComponentTypes[t](**m["data"]) # noqa: F405 - abm.message.append(a) - + abm.message.append(File(name=file_name, file=m["data"]["url"])) else: try: - # Napcat, LLBot - ret = await self.bot.call_action( - action="get_file", - file_id=event.message[0]["data"]["file_id"], - ) - if not ret.get("file", None): - raise ValueError(f"无法解析文件响应: {ret}") - if not os.path.exists(ret["file"]): - raise FileNotFoundError( - f"文件不存在或者权限问题: {ret['file']}。如果您使用 Docker 部署了 AstrBot 或者消息协议端(Napcat等),请先映射路径。如果路径在 /root 目录下,请用 sudo 打开 AstrBot" + # Napcat + ret = None + if abm.type == MessageType.GROUP_MESSAGE: + ret = await self.bot.call_action( + action="get_group_file_url", + file_id=event.message[0]["data"]["file_id"], + group_id=event.group_id, ) + elif abm.type == MessageType.FRIEND_MESSAGE: + ret = await self.bot.call_action( + action="get_private_file_url", + file_id=event.message[0]["data"]["file_id"], + ) + if ret and "data" in ret and "url" in ret["data"]: + file_url = ret["data"]["url"] # https + a = File(name="", file=file_url) + abm.message.append(a) + else: + logger.error(f"获取文件失败: {ret}") - m["data"] = {"file": ret["file"], "name": ret["file_name"]} - a = ComponentTypes[t](**m["data"]) # noqa: F405 - abm.message.append(a) except ActionFailed as e: logger.error(f"获取文件失败: {e},此消息段将被忽略。") except BaseException as e: