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

Python开发Telegram Bot转发文件至Discord Webhook报错求助

报错根因

你传入hook.send()的message.document是Telegram Bot SDK封装的文档元数据对象,仅存储文件ID、文件名、文件大小这类属性,不包含文件实际二进制内容,不属于JSON可序列化的基础数据类型,因此触发类型错误。
你之前的文本转发逻辑可正常运行,是因为字符串属于原生可序列化类型,可以直接被Webhook接口解析。

修复方案

按照Telegram Bot API的文件交互逻辑,你需要先通过元数据里的文件ID从Telegram服务器拉取实际文件内容,再调用dhooks的文件发送接口完成转发,具体步骤如下:

  • 从接收到的document消息对象中提取文件元信息,拿到文件ID和原始文件名
  • 调用Bot实例的get_file()方法获取文件在Telegram服务器的存储路径
  • 调用download_file()方法拉取文件的二进制内容
  • 将二进制内容包装为dhooks支持的文件格式,通过hook.send()的file参数传入完成发送
可直接运行的参考代码
import io
# 其余你已有的导入、bot初始化、hook初始化代码保持不变即可

@bot.message_handler(content_types=['document'])
def handle_user_document(message):
    # 提取文档元数据
    doc = message.document
    file_name = doc.file_name
    # 获取文件信息、下载二进制内容
    file_info = bot.get_file(doc.file_id)
    file_content = bot.download_file(file_info.file_path)
    # 转发到Discord Webhook
    hook.send(
        content=f"用户上传了文件:{file_name}", # 不需要附带文本可以把content参数删掉
        file=(file_name, io.BytesIO(file_content))
    )
注意事项
  • Telegram Bot官方API默认仅支持下载20MB以内的文件,超过该大小的文件需要自行部署本地Bot API服务才能拉取
  • 如果需要转发图片、音频、视频等其他类型的文件,只需要在content_types列表中添加对应类型,再从message对象的对应属性(如message.photo、message.video)中提取file_id即可,核心逻辑完全一致
  • dhooks的file参数接收元组格式的输入,固定结构为(文件名, 二进制文件流),不要直接传原始二进制字节数据

内容的提问来源于stack exchange,提问作者nightmarr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:57:14