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

使用Telethon保存Telegram消息时,媒体file_reference解码失败求助

解决Telethon中file_reference解码失败的问题

你遇到的错误根源在于**file_reference是二进制字节数据,并非UTF-16编码的文本**,直接尝试用文本编码解码二进制数据必然会抛出解码错误。

为什么不能这么做?

file_reference是Telegram用来定位媒体文件的内部二进制标识,它包含的是用于获取媒体的元信息,不是人类可读的文本内容,不存在对应的文本编码格式,自然无法通过decode()转成字符串。

正确的处理方式

根据你的需求(保存到数据库),有两种可行方案:

1. 直接存储二进制数据

如果你的数据库支持二进制字段(比如MySQL的BLOB、PostgreSQL的BYTEA),可以直接将file_reference的字节数据存入数据库:

def scraper_new_message(message):
    photo = message[0].media.photo
    # 直接获取二进制数据,存入数据库即可
    file_ref_bytes = photo.file_reference
    # 示例:将file_ref_bytes写入数据库的BLOB字段
    # db.execute("INSERT INTO media (file_reference) VALUES (?)", (file_ref_bytes,))

2. 转成Base64字符串存储

如果数据库只能存储文本,可以用Base64编码将二进制数据转成安全的字符串,后续需要使用时再解码回二进制:

import base64

def scraper_new_message(message):
    photo = message[0].media.photo
    # 将二进制数据编码为Base64字符串
    file_ref_b64 = base64.b64encode(photo.file_reference).decode('utf-8')
    print(file_ref_b64)
    
    # 后续需要使用file_reference时,解码回二进制
    # file_ref_bytes = base64.b64decode(file_ref_b64)
    # 示例:存入数据库的文本字段
    # db.execute("INSERT INTO media (file_reference_b64) VALUES (?)", (file_ref_b64,))

额外优化:避免重复获取消息

你的消息处理函数中,await client.get_messages(chat.channel_id)会获取频道的所有消息,这完全没必要——event对象本身已经包含了当前收到的消息,可以直接使用:

@client.on(events.NewMessage(chats=LIST_CHANNELS))
async def new_message_handler(event):
    # 直接传入当前事件的消息,无需重新请求
    scraper_new_message(message=[event.message])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:20:41