在Telegram机器人开发中,向用户或群组发送单张照片、视频已经不能满足日益丰富的互动需求。想象一下,你想向用户展示一组产品图片、一系列步骤截图,或者一次旅行中的多张风景照——如果逐条发送,不仅会刷屏,还会让聊天记录显得杂乱无章。多媒体相册(Media Group)功能应运而生,它允许你将最多10张图片或视频组合成一个相册,以一条消息的形式展示,用户既可以滑动查看,也可以逐张保存,体验极佳。
本文将从零开始,深入讲解Telegram Bot API中的sendMediaGroup方法,包括其参数、代码实现、常见问题以及高级技巧,帮助你快速在自己的机器人中实现多媒体相册发送功能。
一、什么是多媒体相册?为什么需要sendMediaGroup?
多媒体相册是Telegram客户端特有的一种消息展示形式,它将多条媒体消息(图片、视频)聚合在一条可横向滑动的卡片中。对用户来说,它节省了聊天空间,浏览方便;对开发者来说,它提供了一种结构化的消息组织方式。
在Bot API中,要发送多媒体相册,必须使用sendMediaGroup方法。这个方法比直接调用sendPhoto或sendVideo更高效,因为它一次网络请求就能完成多媒体的传输,并且保证它们在客户端显示为一个整体。
二、sendMediaGroup方法详解
在深入代码之前,我们先来剖析sendMediaGroup的请求参数。
2.1 参数解析
- chat_id(必填):接收者的唯一标识(用户ID、群组ID或频道用户名)。
- media(必填):一个包含多个媒体对象的JSON数组,每个对象可以是
InputMediaPhoto或InputMediaVideo类型。 - message_thread_id(可选):用于在话题群组中发送到特定话题。
- disable_notification(可选):为True时静默发送。
- protect_content(可选):为True时禁止用户转发和保存内容。
- reply_parameters(可选):用于回复某条消息时设置。
2.2 媒体对象详解
每个媒体对象都需要指定type(photo或video)、media(文件ID、HTTP URL或使用attach://的文件标识),还支持caption(最多1024字符)和parse_mode(HTML或Markdown)。需要注意的是,多个媒体中只有第一个可以包含caption,或者每个都可以有单独说明,但推荐在第一个媒体上设置整体说明。
三、代码实战:从零发送多媒体相册
我们以Python和python-telegram-bot库为例,演示如何发送本地图片和视频组成的相册。
3.1 安装依赖与初始化
pip install python-telegram-bot==20.6from telegram import Bot, InputMediaPhoto, InputMediaVideo, Update
from telegram.ext import Application, CommandHandler, ContextTypes
BOT_TOKEN = "YOUR_BOT_TOKEN"
# 初始化应用
application = Application.builder().token(BOT_TOKEN).build()
# 定义一个命令处理函数
async def album(update: Update, context: ContextTypes.DEFAULT_TYPE):
try:
media_group = [
InputMediaPhoto(media=open('photo1.jpg', 'rb'), caption='第一张照片'),
InputMediaPhoto(media=open('photo2.jpg', 'rb')),
InputMediaVideo(media=open('video1.mp4', 'rb')),
]
await context.bot.send_media_group(chat_id=update.effective_chat.id, media=media_group)
except Exception as e:
await update.message.reply_text(f'发送失败:')
application.add_handler(CommandHandler("album", album))
application.run_polling()
3.2 使用文件ID发送相册(推荐)
如果你已经上传过文件并获得了file_id,那么无需再次上传,直接引用即可,这样发送速度会更快,减少带宽消耗。file_id可以通过getFile等API获取。示例:
media_group = [
InputMediaPhoto(media='AgACAgUAAx0E1dQAAQZ_fwexF_sK0Q', caption='已上传的文件ID'),
InputMediaVideo(media='BAACAgUAAx0E1dQAAQZ_gwexF_sK0Q'),
]
await context.bot.send_media_group(chat_id=chat_id, media=media_group)
3.3 通过URL发送远程图片
当媒体文件托管在服务器上时,可以直接传递URL。但请确保URL是公开可访问的,并且Telegram服务器能够成功下载。示例:
media_group = [
InputMediaPhoto(media='https://example.com/image1.jpg'),
InputMediaPhoto(media='https://example.com/image2.jpg'),
]
await context.bot.send_media_group(chat_id=chat_id, media=media_group)
四、使用HTTP请求直接调用API
如果你不使用Python库,可以通过纯HTTP请求调用sendMediaGroup。需要使用multipart/form-data编码,将每个媒体的内容作为文件字段。下面是一个curl示例:
curl -F "chat_id=123456" \
-F "media=[{\"type\":\"photo\",\"media\":\"attach://photo1\"},{\"type\":\"photo\",\"media\":\"attach://photo2\"}]" \
-F "photo1=@photo1.jpg" \
-F "photo2=@photo2.jpg" \
https://api.telegram.org/bot<BOT_TOKEN>/sendMediaGroup
五、常见问题与高级技巧
5.1 相册数量限制
一次最多发送10个媒体项,超过限制会返回400错误。如果确实需要发送更多,可以将它们拆分成多个相册,或者使用媒体合并技术(如将多张图片合成为一张长图)。
5.2 混排照片与视频
允许在同一个媒体组中混合照片和视频,但需要注意顺序。Telegram客户端会按照数组顺序显示,建议先放封面图,再放视频。
5.3 相册中的说明文字
只有第一个媒体项可以设置caption,如果其他项也设置了caption,API会忽略它们。但你可以通过reply_markup为整个相册添加行内按钮,实现更多交互功能。
5.4 处理上传失败
如果某个媒体文件过大或网络问题导致上传失败,整个请求会失败。建议使用file_id或先上传文件获取file_id,再发送相册,这样可以避免每次都读取大文件。另外,可以使用重试机制,但注意不要无限重试,以免触发429错误。
5.5 保存和复用file_id
file_id在同一个机器人下是永久有效的,所以当第一次上传成功后,务必保存file_id到数据库。后续发送时直接使用file_id,既快又稳定。
5.6 使用缩略图提升体验
对于视频,可以设置thumb参数来指定缩略图,如果没有设置,Telegram会自动生成。自定义缩略图能让相册看起来更精致。
六、实际应用场景与建议
- 电商导购:将商品多角度照片和视频组合成一个相册,直观展示细节。
- 新闻推送:将多张新闻图片配以文字说明,让读者快速浏览关键信息。
- 教程类机器人:将操作步骤截图打包发送,用户可逐张查看,不易遗漏。
- 旅游分享:批量发送旅行照片,保持聊天记录整洁。
总结
发送多媒体相册是Telegram机器人增强互动体验的重要能力。sendMediaGroup方法简洁高效,只要掌握其参数和注意事项,你就能灵活运用。在实际开发中,建议优先使用file_id来发送,以提升性能和稳定性。如果你遇到任何问题,欢迎在评论区留言交流。