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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:43:27