Telegram机器人不仅可以发送单张图片或视频,还支持将多张照片或视频组合成一条媒体组(Media Group)消息发送,类似用户在聊天中发送的多媒体相册。这一功能在新闻推送、产品展示、教程分享等场景中非常实用。本文将深入讲解如何通过Telegram Bot API发送媒体组消息,并提供可直接运行的代码示例与避坑指南。
一、什么是媒体组(Media Group)?
媒体组是Telegram中的一种消息形式,将最多10个媒体文件(照片或视频)聚合在一条消息中,用户可左右滑动查看,所有文件共用一个消息ID和时间戳。机器人通过sendMediaGroup方法即可向单个聊天或频道发送此类消息。
二、准备:创建机器人与获取Token
在编写代码前,请确保你已满足以下条件:
- 在Telegram中与@BotFather对话,创建自己的机器人并获取API Token。
- 确定目标接收方:用户的
chat_id、频道或群组的ID。如果不是自己的ID,可通过getUpdates等方法获取。 - 准备好待发送的媒体文件,可以是网络URL或本地文件路径。
三、sendMediaGroup方法详解
sendMediaGroup的HTTP请求格式如下:
POST https://api.telegram.org/bot<TOKEN>/sendMediaGroup主要参数:
chat_id(必填):接收消息的聊天ID或频道用户名(如@channel)。media(必填):JSON数组,最多10个元素。每个元素是一个InputMedia对象,包含:type:媒体类型,可选photo或video。media:文件URL或通过multipart/form-data上传的文件ID(attach://格式)。caption(可选):整个媒体组的说明,只会显示在第一个媒体上。parse_mode(可选):HTML或Markdown格式。
注意:media参数必须作为JSON字符串传递(使用multipart/form-data时需特别处理)。
四、代码示例(Python)
下面提供两种常用方式发送媒体组。
方式一:使用requests库(直接调用API)
import requestsTOKEN = "YOUR_BOT_TOKEN"
chat_id = "@example_channel"
media = [
{"type": "photo", "media": "https://example.com/photo1.jpg"},
{"type": "photo", "media": "https://example.com/photo2.jpg"},
{"type": "photo", "media": "https://example.com/photo3.jpg"}
]
url = f"https://api.telegram.org/bot/sendMediaGroup"
payload = {"chat_id": chat_id, "media": media}
r = requests.post(url, json=payload)
print(r.json())
若使用本地文件,需将media字段改为attach://file1等形式,并添加files参数:
media = [{"type": "photo", "media": "attach://file1"},
{"type": "photo", "media": "attach://file2"}]
files = {"file1": open("photo1.jpg", "rb"), "file2": open("photo2.jpg", "rb")}
requests.post(url, data={"chat_id": chat_id, "media": json.dumps(media)}, files=files)方式二:使用python-telegram-bot库
from telegram import Bot
from telegram.error import TelegramErrorbot = Bot(token="YOUR_BOT_TOKEN")
media = [
InputMediaPhoto(media="https://example.com/photo1.jpg", caption="第一张"),
InputMediaPhoto(media="open("photo2.jpg", "rb")),
InputMediaVideo(media="https://example.com/video.mp4")
]
try:
messages = bot.send_media_group(chat_id="@example_channel", media=media)
print("成功发送", len(messages), "条消息")
except TelegramError as e:
print("失败:", e)
五、常见错误与注意事项
- 超过10个媒体:媒体组最多10个,超出后会报错。
- 媒体类型不一致:虽然可以混合照片和视频,但某些客户端可能显示异常,建议同组使用相同类型。
- caption位置:整个组的说明只显示在第一个媒体上,如需每个媒体单独说明,请通过
caption字段为每个媒体单独设置(但官方限制:只有第一个媒体支持caption,后续媒体的caption会被忽略)。 - URL必须可公开访问:如果使用URL,必须是机器人能直接下载的地址,且支持HTTPS。
- 文件大小限制:照片最大10MB,视频最大50MB(经压缩后可放宽)。
- 严格验证错误:使用
json.dumps(media)确保JSON格式正确,否则会返回“Bad Request: can't parse media”错误。
六、实用建议
- 将媒体组消息用于相册、多图新闻等场景,可提升用户体验。
- 若需要发送大量图片,建议分组发送(每组≤10),并控制频率以免触发限流。
- 通过
media_group_id属性可以管理和追踪已发送的媒体组,便于后续更新或删除。 - 结合Webhook回调,可实时监控发送状态,实现失败重试机制。
总结
发送媒体组消息是Telegram机器人开发的基础功能之一,通过sendMediaGroup即可轻松实现多图/视频的批量展示。只要注意参数格式和媒体数量限制,就能在项目中稳定运行。希望本教程能帮助你快速上手,构建更强大的Telegram机器人。