
Telethon 默认将列表形式的 file 参数视为媒体组,而 Telegram API 不支持 GIF 作为媒体组成员;正确做法是单独传递 GIF 文件路径(非列表),或转为 MP4 后参与群发。
telethon 默认将列表形式的 `file` 参数视为媒体组,而 telegram api 不支持 gif 作为媒体组成员;正确做法是单独传递 gif 文件路径(非列表),或转为 mp4 后参与群发。
在使用 Telethon 发送媒体时,client.send_file() 的行为会根据 file 参数的类型自动适配:
- 若传入单个文件路径(字符串),Telethon 将其识别为独立媒体(支持 GIF、图片、视频等);
- 若传入文件路径列表(如
["a.jpg", "b.png"]),则强制以媒体组(InputMediaAlbum)方式上传——但 Telegram 官方限制 GIF 无法加入媒体组,此时会抛出MediaInvalidError: Media invalid。
✅ 正确发送单个 GIF 的写法如下:
async def send_gif(self, chat_id: int):
async with self._get_client() as client:
chat = await client.get_entity(chat_id)
# 注意:这里必须是字符串,不是列表!
gif_path = "/my_path/3.gif"
msg = await client.send_file(
chat,
file=gif_path, # ← 关键:去掉方括号,不传 list
caption="<b>Animated GIF</b>",
parse_mode="html",
# allow_cache=True 已废弃,无需设置
)
return msg⚠️ 注意事项:
-
allow_cache=True已被弃用(自 Telethon v2.0+),传入后会被忽略,建议直接移除; - 若需将 GIF 与其他媒体(如图片/视频)一起批量发送,可先用
moviepy或ffmpeg将 GIF 转为无音轨 MP4(Telegram 对 MP4 动画兼容性更好,且支持媒体组):ffmpeg -i input.gif -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -f mp4 output.mp4
- Telegram 客户端对 GIF 的渲染依赖于文件头和帧率;若转换后动画异常,可添加
-pix_fmt yuv420p确保编码兼容性。
? 小结:发送 GIF 的本质是「避免误触媒体组逻辑」。只要确保 file= 后是单个字符串路径,即可像发送图片一样可靠发送动画,无需额外参数或特殊方法——这正是 aiogram.bot.send_animation() 在底层所依赖的同一 Telegram API 行为。

















