在Telegram机器人的开发中,向用户发送图片和视频是最常见的需求之一。无论是用于通知、教程、产品展示还是娱乐交互,多媒体消息都能显著提升用户体验。然而,很多开发者初次接触时会对Bot API的参数感到困惑,甚至在处理大文件或网络错误时无从下手。本文将带你从零开始,系统学习Telegram机器人发送图片和视频的所有关键知识点,并通过可运行的代码示例让你快速上手。
一、发送图片与视频的两种核心方式
Telegram Bot API提供了sendPhoto和sendVideo两个方法,分别用于发送图片和视频。在调用之前,你需要明确使用的是哪种方式:
- 通过文件ID发送:如果文件已经上传过Telegram,你可以直接使用其
file_id发送。这种方式不会产生重复上传,速度最快,推荐优先使用。 - 通过URL发送:直接传一个公网可访问的图片或视频URL,Telegram服务器会主动抓取并发送。注意URL必须公网可达,且文件格式被支持。
- 通过multipart/form-data上传:适用于本地文件或需要动态生成的内容,比如从服务器本地读取图片后发送。此时需要将文件作为二进制流放在请求中。
二、python-telegram-bot库快速入门
如果你使用Python开发机器人,python-telegram-bot是目前最流行的库。首先安装:
pip install python-telegram-bot
下面是一个最简单的示例,当用户发送“图片”时,机器人回一张图片;发送“视频”时,回一个视频:
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
async def send_photo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
chat_id = update.effective_chat.id
await context.bot.send_photo(chat_id, photo='https://example.com/pic.jpg', caption='你好,这是一张图片')
async def send_video(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
chat_id = update.effective_chat.id
await context.bot.send_video(chat_id, video='https://example.com/video.mp4', caption='请看这个视频')
def main() -> None:
app = Application.builder().token('YOUR_BOT_TOKEN').build()
app.add_handler(MessageHandler(filters.TEXT & filters.Regex('^图片$'), send_photo))
app.add_handler(MessageHandler(filters.TEXT & filters.Regex('^视频$'), send_video))
app.run_polling()
三、纯API调用:用requests发送文件
如果你不使用第三方库,直接调用HTTP接口也很简单。用requests发送本地文件的例子:
import requests
TOKEN = 'YOUR_BOT_TOKEN'
CHAT_ID = '123456789'
url = f'https://api.telegram.org/bot/sendPhoto'
files = {'photo': open('local_image.jpg', 'rb')}
data = {'chat_id': CHAT_ID, 'caption': '来自本地上传的图片'}
response = requests.post(url, data=data, files=files)
print(response.json())
发送视频时,将sendPhoto改为sendVideo,字段名改为video。注意:Telegram对上传文件的大小有限制,图片最大5MB,视频最大50MB(免费公共Bot)。如果视频大于50MB,需要使用sendDocument并设置as_document=True或采用本地Bot方式。
四、巧妙利用媒体组一次发送多张
如果一次要发送多张图片或多个视频,可以使用sendMediaGroup方法。它允许你一次性发送最多10个媒体附件,且可以混合图片和视频。每个媒体项由type、media和可选的caption组成:
from telegram import MediaGroup
media_group = MediaGroup()
media_group.add_photo(open('1.jpg', 'rb'))
media_group.add_photo(open('2.jpg', 'rb'))
media_group.add_video(open('v.mp4', 'rb'))
await context.bot.send_media_group(chat_id, media=media_group)
注意:在媒体组中,只有第一个媒体可以设置caption,且总计长度有限制。这在做轮播图或相册展示时非常实用。
五、常见错误与解决方案
- 400 Bad Request: wrong file identifier:说明
file_id无效或过期。请确认是通过Bot API获取的ID,且没有被删除。 - file is too big:图片超过5MB或视频超过50MB。尝试压缩文件,或改用
sendDocument发送。 - URL fetch timeout:Telegram无法访问你的URL,检查域名是否公网可达,或文件是否被墙。
- Unsupported URL protocol:URL必须为http或https,且不能包含本地路径。
- Chat not found:确保chat_id正确,且机器人已被添加到该会话。
六、性能与最佳实践
- 优先使用file_id:每次上传都会消耗资源,存储file_id可大幅提升效率。对于经常发送的固定资源,建议提前上传并记录其ID。
- 合理设置caption:简洁且说明性的caption能提升点击率。支持HTML或Markdown格式,但需注意解析模式对齐。
- 异步处理:在Web框架中,请将发送操作放在异步任务里,避免阻塞主线程。
- 错误重试:网络抖动可能导致发送失败,建议捕获
RetryAfter等异常并进行退避重试。 - 使用缩略图:对于视频,可以指定
thumb参数为本地文件或URL,让预览更美观。
总结
通过本文的学习,你已经掌握了Telegram机器人发送图片和视频的多种方法,包括Bot API参数、Python代码示例、媒体组、错误处理及优化技巧。实际操作时,请先梳理你的业务场景:如果是高频固定内容,走file_id;如果是用户生成内容,考虑上传后缓存ID。同时,时刻留意文件大小限制和网络异常,确保机器人在生产环境中稳定运行。现在就去实践吧,让你的机器人拥有更生动的表达能力!