在Telegram机器人开发中,发送视频消息是高频需求之一。无论是制作自动推送视频的订阅机器人,还是实现视频下载转发功能,掌握sendVideo接口的使用都是核心技能。本文将从零开始,逐步讲解如何利用Telegram Bot API发送视频消息,并附上可直接运行的Python代码示例。即使你刚接触机器人开发,也能按照步骤轻松实现。
准备工作:创建机器人与获取Token
在调用任何API之前,你需要一个合法的机器人身份。登录Telegram后,与@BotFather对话,发送/newbot指令,按照提示设置机器人名称和用户名。创建成功后,BotFather会返回一个HTTP API Token,格式类似123456789:ABCdefGhIJKlmNoPQRsTuvWxYz,这就是你调用API的唯一凭证。
请妥善保管Token,不要泄露到公开仓库。正式环境中建议通过环境变量或配置文件引用Token,避免硬编码在代码中。
核心API:sendVideo参数详解
Telegram Bot API的sendVideo方法用于发送视频文件。官方接口地址为https://api.telegram.org/bot<token>/sendVideo,常用参数如下:
- chat_id(必填):接收视频的聊天ID,可以是用户ID、群组ID或频道ID。
- video(必填):视频文件,支持两种传法——通过URL传入文件链接,或通过multipart/form-data上传本地文件。
- caption(可选):视频说明文字,最长1024字符,支持部分HTML标签。
- thumbnail(可选):视频缩略图的URL或上传文件,JPEG格式,最大200KB。
- duration(可选):视频时长(秒),用于预显示。
- width / height(可选):视频尺寸,用于预显示。
- supports_streaming(可选):布尔值,是否支持流式播放,常用于短视频。
注意:sendVideo要求视频格式为MP4或H.264编码,且文件大小不能超过50MB(通过Bot API上传)。如果你需要发送更大的视频,可以使用本地Bot API服务器或分片上传。
实战:使用Python发送视频消息
我们使用Python的requests库来演示发送流程。首先安装依赖:
pip install requests
场景一:通过URL发送视频
假设你有一个公开的视频文件链接,无需下载到本地,直接使用params传递给API即可。
import requests
token = 'YOUR_BOT_TOKEN'
chat_id = 'RECIPIENT_CHAT_ID'
video_url = 'https://example.com/sample.mp4'
url = f'https://api.telegram.org/bot/sendVideo'
params = {
'chat_id': chat_id,
'video': video_url,
'caption': '这是一条来自机器人的视频消息'
}
response = requests.post(url, params=params)
print(response.json())
注意:视频URL必须可公网访问,且Telegram服务器能下载到。如果视频较大,可能需要等待一段时间,建议将请求超时设置长一些。
场景二:发送本地视频文件
如果视频存储在本地,需要使用multipart/form-data方式上传。
import requests
token = 'YOUR_BOT_TOKEN'
chat_id = 'RECIPIENT_CHAT_ID'
video_path = '/path/to/local/video.mp4'
url = f'https://api.telegram.org/bot/sendVideo'
with open(video_path, 'rb') as f:
files = {'video': f}
data = {'chat_id': chat_id}
response = requests.post(url, files=files, data=data)
print(response.json())
使用files和data区分文件与非文件参数。注意,一次请求只能上传一个视频文件,不能与URL混用。
场景三:错误处理与状态码
API调用可能因为各种原因失败,比如凭证错误、视频格式不支持或网络问题。建议检查HTTP状态码和响应体中的description字段。
import requests
import json
def send_video(chat_id, video):
url = f'https://api.telegram.org/bot/sendVideo'
if video.startswith('http'):
params = {'chat_id': chat_id, 'video': video}
resp = requests.post(url, params=params)
else:
with open(video, 'rb') as f:
files = {'video': f}
data = {'chat_id': chat_id}
resp = requests.post(url, files=files, data=data)
if resp.status_code != 200:
try:
error_data = resp.json()
print(f"错误代码:{error_data['error_code']},描述:{error_data['description']}")
except:
print(f"HTTP错误:{resp.status_code}")
return False
return True
常见的错误码400表示参数错误,401表示Token无效,429表示请求过于频繁。
进阶技巧:群发与视频消息
如果你需要向多个用户或群组发送视频,可以用循环调用sendVideo,但要注意Telegram API的限流规则(每秒最多30条消息)。更高效的做法是使用sendMediaGroup一次发送多个视频或图文混排,但sendMediaGroup中的视频必须通过URL或已上传的file_id,不能混用本地文件。
另外,Telegram还提供sendVideoNote方法,用于发送圆形视频消息(类似视频动态),适用于短视频分享。参数与sendVideo类似,但video_note字段是必需的,且建议使用MP4格式,时长不超过60秒。
常见问题与优化建议
- 视频超过50MB怎么办?可以先将视频上传到Telegram服务器获取file_id,然后使用file_id发送(绕过尺寸限制?实际上sendVideo通过file_id发送时,大小限制仍为50MB,但本地Bot API服务器可以取消此限制)。或者对视频进行压缩。
- 如何获取视频的file_id?如果你已经有机器人收到了视频,可以在
getUpdates中查看video.file_id,或者在发送成功后从响应中读取。 - 发送视频时如何添加缩略图?使用
thumbnail参数,需为JPEG格式且不超过200KB,可通过URL或上传文件提供。 - 为什么消息发送成功但视频不显示?可能是视频编码或容器不被Telegram支持,请确保使用H.264视频编码和AAC音频编码的MP4文件。
- 批量发送时如何避免触发限流?在循环中加
time.sleep(0.1),并使用asyncio提高并发性能,但需注意全局速率。
总结
通过sendVideo接口,Telegram机器人可以轻松发送视频消息。掌握参数含义和Python的两种传参方式(URL与本地文件)是关键。实际开发中,建议封装发送函数,并做好异常处理和日志记录,以构建稳定可靠的机器人服务。你可以在此基础上扩展功能,比如自动下载视频再发送、定时推送每日视频等。