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
相关产品推荐
相关产品推荐

