discord.py中如何获取DMChannel对象?私有频道表情反应触发报错问题问询
如何在Discord.py中获取DMChannel对象以处理私有频道的表情反应?
这个问题我之前也碰到过,核心原因是bot.get_channel()只能从服务器(Guild)频道缓存里查找,而DM频道属于用户私信,并不在这个缓存集合中,所以会返回None。和你处理payload.member的思路类似,我们可以通过API直接获取频道,或者通过用户对象关联到对应的DM频道。
解决方案1:使用fetch_channel直接获取频道
bot.fetch_channel()会直接调用Discord API请求频道信息,不管是服务器频道还是DM频道都能获取到,完美解决缓存找不到的问题:
@bot.event async def on_raw_reaction_add(payload): print(bot.get_channel(payload.channel_id), payload.channel_id) if payload.user_id is not None: # 优先从缓存取,缓存没有则调用API获取 channel = bot.get_channel(payload.channel_id) if not channel: channel = await bot.fetch_channel(payload.channel_id) msg = await channel.fetch_message(payload.message_id) emoji = payload.emoji # 注意:DM场景下payload.member为None,改用get_user/fetch_user获取用户 author = bot.get_user(payload.user_id) or await bot.fetch_user(payload.user_id) if emoji.is_custom_emoji(): emoji_count = discord.utils.get(msg.reactions, emoji=emoji).count else: emoji_count = discord.utils.get(msg.reactions, emoji=emoji.name).count if payload.channel_id == channel_i: if emoji_count > 1: # 你的业务逻辑代码 ...
解决方案2:通过用户对象获取DM频道
如果已经确定触发场景是DM频道,也可以直接通过用户对象的dm_channel属性获取对应的私信频道:
# 替换频道获取部分 user = await bot.fetch_user(payload.user_id) channel = user.dm_channel
关键注意点
payload.member仅在服务器频道中有效,DM场景下会返回None,必须用bot.get_user()或await bot.fetch_user()获取用户对象。bot.get_channel()依赖本地缓存,仅存储服务器频道;fetch_channel()则是实时请求API,支持所有频道类型,但会有轻微的网络请求开销(一般可以忽略)。
内容的提问来源于stack exchange,提问作者Tony_I
相关产品推荐
相关产品推荐

