Telegram Bot是否有统一存储不同媒体类型的方法?希望用file_id
问题描述
我正在开发多个可向用户发送媒体的Telegram Bot。处理视频文件时,我使用以下代码存储管理员上传的视频:
caption = event.message.text or "" file_id = event.message.file.id data['file_id'] = file_id data['caption'] = caption save_data(data)
恢复并发送给用户的代码如下:
data = load_data() file_id = data['file_id'], caption = data['caption'] bot.send_video(message.chat.id, file_id ], caption=caption)
处理图片时,我未找到file_id的使用方式,转而采用PKL格式存储:
async with client.conversation(user_id) as conv: await conv.send_message("Upload a photo") photo_event = await conv.get_response() save_price_pic(photo_event.photo) def save_price_pic(photo): with open('price.pkl', 'wb') as file: pickle.dump(photo, file)
恢复代码:
def load_price_pic(): with open('price.pkl', 'rb') as file: return pickle.load(file) photo = load_price_pic() client.send_file(user_id, photo, caption = "my caption")
请问是否存在类似的统一处理方法?我更希望在两种场景下都使用file_id。
解决方案
完全可以统一用file_id处理图片和视频,核心是找到图片对应的file_id字段,具体实现如下:
1. 图片的file_id获取与存储
Telegram图片消息的photo字段是不同尺寸图片的列表,通常取最后一个元素(分辨率最高的版本)获取file_id,修改存储代码:
async with client.conversation(user_id) as conv: await conv.send_message("Upload a photo") photo_event = await conv.get_response() # 提取最高清图片的file_id file_id = photo_event.photo[-1].file.id caption = photo_event.text or "" # 复用视频的存储逻辑 data = {'file_id': file_id, 'caption': caption} save_data(data)
2. 图片的恢复与发送
和视频发送逻辑对齐,直接用存储的file_id调用send_photo:
data = load_data() file_id = data['file_id'] caption = data['caption'] client.send_photo(user_id, file_id, caption=caption)
3. 封装通用函数(可选)
为了进一步减少重复代码,可以封装通用的媒体存储和发送函数:
通用存储函数
def save_media(file_id, caption, media_type): data = { 'file_id': file_id, 'caption': caption, 'media_type': media_type } save_data(data)
通用发送函数
async def send_media(client, chat_id, data): file_id = data['file_id'] caption = data['caption'] if data['media_type'] == 'video': await client.send_video(chat_id, file_id, caption=caption) elif data['media_type'] == 'photo': await client.send_photo(chat_id, file_id, caption=caption)
这样不管是图片还是视频,都能统一用file_id完成存储和发送,无需再用pickle序列化整个对象,既节省空间,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Plem
相关产品推荐
相关产品推荐

