discord.py中on_reaction_add无输出问题,如何检测特定消息的表情反应
问题排查与解决方案
现有代码的核心错误
- 消息ID判断逻辑错误:你写的
876180955621113886-881237159665881098是两个整数做减法运算,得到的结果不是任何有效消息ID,无法匹配到目标消息。如果需要匹配多个消息ID,应该将ID存入列表后用in关键字判断。 - 缺失协程调用关键字
await:discord.py中所有发送消息、修改消息等API都是异步协程,必须在前面加await才会执行,你直接调用send方法不会触发任何操作,还会抛出未等待协程的报错。 on_reaction_add事件存在缓存限制:该事件仅会对机器人启动后收到的、存在于内部缓存中的消息触发,如果你的目标消息是机器人启动前发送的,该事件不会响应。- 可能缺失反应相关意图:discord.py v2.0及以上版本需要显式声明消息反应相关的意图,同时需要在Discord开发者后台开启对应的特权意图,否则无法收到反应事件回调。
正确实现方式
1. 优先使用on_raw_reaction_add事件
该事件不受缓存限制,无论消息是否在缓存中都能触发,更适合监听特定消息的反应:
import discord from discord.ext import commands # 显式声明需要的意图 intents = discord.Intents.default() intents.message_reactions = True # 开启消息反应意图 client = commands.Bot(command_prefix='!', intents=intents) # 你要监听的目标消息ID列表 TARGET_MESSAGE_IDS = [876180955621113886, 881237159665881098] @client.event async def on_raw_reaction_add(payload): # 判断反应的消息ID是否在目标列表,且表情匹配 if payload.message_id in TARGET_MESSAGE_IDS and str(payload.emoji) == '1️⃣': # 获取频道对象 channel = client.get_channel(payload.channel_id) if channel: # 发送消息必须加await await channel.send("I got a message.")
2. 额外注意事项
- 确认你在Discord开发者后台的机器人设置页,已经开启了
Message Content Intent和Guild Reactions Intent权限 - 如果仅需要监听单条消息的反应,直接将
TARGET_MESSAGE_IDS替换为单值判断即可:if payload.message_id == 你的消息ID
内容的提问来源于stack exchange,提问作者Broken DEV
相关产品推荐
相关产品推荐

