如何在Pyrogram中从StickerSet获取file_id并发送随机贴纸?
如何在Pyrogram中通过贴纸包名称发送随机贴纸
你已经知道用await message.reply_sticker(sticker_file_id)发送贴纸,但通过底层client.invoke获取的types.Document对象没有直接的file_id字段,这里提供两种可行的解决方法:
方法一:使用Pyrogram高层API(推荐)
Pyrogram本身封装了更易用的get_sticker_set方法,返回的StickerSet里每个贴纸都自带可用的file_id,代码示例:
import random from pyrogram import Client async def send_random_sticker(client, message, sticker_set_name): # 获取目标贴纸包 sticker_set = await client.get_sticker_set(sticker_set_name) # 随机挑选一个贴纸 random_sticker = random.choice(sticker_set.stickers) # 发送贴纸 await message.reply_sticker(random_sticker.file_id)
这种方式不需要手动调用底层API,Pyrogram会自动处理file_id的生成,代码更简洁可靠。
方法二:从底层Document对象生成file_id
如果一定要用底层client.invoke获取贴纸数据,可以通过client.get_file把原始Document对象转换成带file_id的File对象,代码示例:
import random from pyrogram import Client from pyrogram.raw.functions.messages import GetStickerSet from pyrogram.raw.types import InputStickerSetShortName async def send_random_sticker_from_raw(client, message, sticker_set_name): # 调用底层API获取贴纸包 sticker_set = await client.invoke( GetStickerSet( stickerset=InputStickerSetShortName(short_name=sticker_set_name), hash=0 ) ) # 随机选一个贴纸对应的Document sticker_doc = random.choice(sticker_set.documents) # 转换为带file_id的File对象 sticker_file = await client.get_file(sticker_doc) # 发送贴纸 await message.reply_sticker(sticker_file.file_id)
补充说明
底层types.Document没有file_id是因为这个字段是Pyrogram为了简化操作封装的,Telegram原始API返回的对象只有id、access_hash等核心标识,需要通过Pyrogram的工具方法转换才能得到可用的file_id。
内容的提问来源于stack exchange,提问作者Lechko Faray
相关产品推荐
相关产品推荐

