You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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代码存在两个关键错误:

  1. thumb 参数格式错误:你写的thumb=('picture.jpeg')本质只是一个字符串(括号在这里不构成元组,元组需要末尾加逗号:('picture.jpeg',)),而且直接传文件名的方式不符合python-telegram-bot的参数要求,库需要的是文件对象或规范的元组格式。
  2. 手动构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:56:55