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

