使用python-telegram-bot发送带缩略图的视频/文档报错求助
问题分析与解决方案
一、send_video 出现 BrokenPipeError 的原因及修复
你碰到的 BrokenPipeError 核心问题是视频文件大小超出了Telegram send_video 接口的限制。Telegram官方明确规定,send_video 支持的单视频文件最大为50MB,你的视频是52MB,已经超过阈值,所以即便设置了超长超时时间,服务器也会主动中断连接,导致管道破裂错误。
另外你提到之前40MB无缩略图的视频能正常发送,但添加缩略图后无法显示,这大概率是因为传递缩略图时的文件打开模式错误:
thumb=open('picture.jpg') # 未指定二进制读取模式
正确的写法需要用'rb'模式打开缩略图,因为Telegram要求接收二进制格式的媒体文件:
thumb=open('picture.jpg', 'rb')
二、send_document 触发 TypeError 的错误点
你的send_document代码存在两个关键错误:
thumb参数格式错误:你写的thumb=('picture.jpeg')本质只是一个字符串(括号在这里不构成元组,元组需要末尾加逗号:('picture.jpeg',)),而且直接传文件名的方式不符合python-telegram-bot的参数要求,库需要的是文件对象或规范的元组格式。- 手动构造
files字典冗余且错误:当你直接传递文件对象给document参数时,库会自动处理文件上传流程,不需要手动构造files字典。这种手动构造的方式会引发序列化问题,因为BufferedReader对象无法被JSON序列化——这正是你看到报错的原因。
修正后的send_document代码
from flask import Flask, request import telegram bot_token = "12345678:ABCDEEFGHIjksdfsusk" bot = telegram.Bot(token=bot_token) # 使用上下文管理器确保文件正确关闭,同时以二进制模式打开文件 with open('k 2.mkv', 'rb') as video_file, open('picture.jpeg', 'rb') as thumb_file: bot.send_document( chat_id='-123456789', document=video_file, thumb=thumb_file, timeout=1000000 )
如果需要自定义文件显示名称,可以用元组格式传递:
bot.send_document( chat_id='-123456789', document=('k 2.mkv', open('k 2.mkv', 'rb')), thumb=('picture.jpeg', open('picture.jpeg', 'rb')), timeout=1000000 )
三、缩略图不显示的通用注意事项
确保你的缩略图完全符合Telegram的要求:
- 文件大小不超过200KB(你已满足)
- 尺寸为320x320像素以内的正方形(注意必须是正方形,而非仅宽或高为320px)
- 格式为JPG或PNG(避免使用其他格式)
- 必须以二进制模式(
rb)打开后传递给API
内容的提问来源于stack exchange,提问作者Kit Walker
相关产品推荐
相关产品推荐

