Telegram机器人发送视频消息实现步骤详解:从API调用到实战

本文详细介绍Telegram机器人发送视频消息的完整实现步骤,包括BotFather创建机器人、获取Token、调用sendVideo API、发送URL视频和本地视频、处理常见错误,帮助开发者快速入门。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

在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())

使用filesdata区分文件与非文件参数。注意,一次请求只能上传一个视频文件,不能与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与本地文件)是关键。实际开发中,建议封装发送函数,并做好异常处理和日志记录,以构建稳定可靠的机器人服务。你可以在此基础上扩展功能,比如自动下载视频再发送、定时推送每日视频等。

FAQ

下载与安装

常见问题

Telegram机器人发送视频消息的大小限制是多少?

通过Telegram Bot API的sendVideo方法发送视频,文件大小不能超过50MB。如果使用官方Bot API服务器,这是硬性限制。如果超出,可以考虑压缩视频或使用本地Bot API服务器来绕过限制。

Telegram机器人支持发送哪些视频格式?

Telegram服务器要求视频为MP4格式,视频编码推荐H.264,音频编码推荐AAC。其他格式(如AVI、MKV)可能无法播放,建议先转码为MP4。

如何使用Python发送本地视频给Telegram用户?

使用requests库,通过multipart/form-data方式上传文件。代码示例:files = {'video': open('video.mp4','rb')},data = {'chat_id': '用户ID'},然后POST到sendVideo接口。

发送视频时如何添加说明文字?

在调用sendVideo时,使用caption参数传入文字说明,最长1024字符。可以使用简单HTML标签(如<b>、<i>、<a>)来格式化文字,但需要将parse_mode参数设置为'HTML'。

发送视频后如何获取视频的file_id?

发送成功后,API响应中会返回Message对象,其中包含video.file_id。你也可以通过getUpdates方法接收更新时获取用户发送的视频file_id。file_id可用于重复发送同一直播,且不会重复上传。