From 6d055e81e95fb2ad527183f6bdb3b199a70e3b14 Mon Sep 17 00:00:00 2001 From: Trainingcqy Date: Sun, 15 Mar 2026 21:33:30 +0800 Subject: [PATCH] fix: GIF sent as static image in Telegram adapter (#6329) * fix(telegram): route GIF files to send_animation instead of send_photo * fix: narrow exception in _is_gif to OSError Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * refactor: simplify image send dispatch in send_with_client Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * refactor: simplify image dispatch in _process_chain_items * ruff format --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Soulter <905617992@qq.com> --- .../platform/sources/telegram/tg_event.py | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/astrbot/core/platform/sources/telegram/tg_event.py b/astrbot/core/platform/sources/telegram/tg_event.py index e75fb9214..f963969b7 100644 --- a/astrbot/core/platform/sources/telegram/tg_event.py +++ b/astrbot/core/platform/sources/telegram/tg_event.py @@ -25,6 +25,16 @@ from astrbot.api.platform import AstrBotMessage, MessageType, PlatformMetadata from astrbot.core.utils.metrics import Metric +def _is_gif(path: str) -> bool: + if path.lower().endswith(".gif"): + return True + try: + with open(path, "rb") as f: + return f.read(6) in (b"GIF87a", b"GIF89a") + except OSError: + return False + + class TelegramPlatformEvent(AstrMessageEvent): # Telegram 的最大消息长度限制 MAX_MESSAGE_LENGTH = 4096 @@ -291,7 +301,13 @@ class TelegramPlatformEvent(AstrMessageEvent): await client.send_message(text=chunk, **cast(Any, payload)) elif isinstance(i, Image): image_path = await i.convert_to_file_path() - await client.send_photo(photo=image_path, **cast(Any, payload)) + if _is_gif(image_path): + send_coro = client.send_animation + media_kwarg = {"animation": image_path} + else: + send_coro = client.send_photo + media_kwarg = {"photo": image_path} + await send_coro(**media_kwarg, **cast(Any, payload)) elif isinstance(i, File): path = await i.get_file() name = i.name or os.path.basename(path) @@ -406,12 +422,20 @@ class TelegramPlatformEvent(AstrMessageEvent): on_text(i.text) elif isinstance(i, Image): image_path = await i.convert_to_file_path() + if _is_gif(image_path): + action = ChatAction.UPLOAD_VIDEO + send_coro = self.client.send_animation + media_kwarg = {"animation": image_path} + else: + action = ChatAction.UPLOAD_PHOTO + send_coro = self.client.send_photo + media_kwarg = {"photo": image_path} await self._send_media_with_action( self.client, - ChatAction.UPLOAD_PHOTO, - self.client.send_photo, + action, + send_coro, user_name=user_name, - photo=image_path, + **media_kwarg, **cast(Any, payload), ) elif isinstance(i, File):