discord.py开发中on_reaction_add事件无响应无报错如何解决?
问题原因及修复方案
1. 缺少必要的Intents配置
discord.py v2.0及以上版本默认关闭了大部分敏感事件的推送权限,你需要手动开启反应相关的Intents:
- 首先在代码中初始化Bot的时候开启对应权限:
import discord import asyncio from discord.ext import commands from discord import utils # 开启需要的intents intents = discord.Intents.default() intents.reactions = True # 开启反应事件监听 intents.message_content = True # 开启消息内容访问权限 intents.members = True # 成员相关操作需要该权限 bot = commands.Bot(command_prefix='!"', intents=intents)
- 其次要到Discord开发者后台的机器人管理页,把「Privileged Gateway Intents」下的
Presence Intent、Server Members Intent、Message Content Intent三个开关全部打开。
2. 事件注册错误
你代码中@bot.command(name = '!"Help Ban', help = 'Bans a user')写在了on_ready事件的装饰器前面,属于无效且错误的代码,会干扰正常事件注册,直接删除这行即可。
3. 反应事件代码属性调用错误
你当前的on_reaction_add代码存在多处属性调用错误,直接导致逻辑无法正常执行:
message.message_id是不存在的属性,如果你要判断消息所在频道ID,应该用message.channel.id;如果要判断消息本身的ID,应该用message.idmessage.user_id是不存在的属性,消息发送者的ID是message.author.id,如果你要获取添加反应的用户,直接用函数传入的user参数即可- 发送消息是异步方法,前面必须加
await关键字,否则不会执行也不会抛出可见错误
修复后的事件代码参考:
@bot.event async def on_reaction_add(reaction, user): # 过滤机器人自身的反应,避免重复触发 if user.bot: return message = reaction.message # 替换为你需要监听的频道ID if message.channel.id == 目标频道数字ID: # 替换为你要发送通知的频道ID notify_channel = bot.get_channel(通知频道数字ID) await notify_channel.send(f'@here, {user.mention} wants to do parole')
4. 事件监听范围限制
on_reaction_add默认只会监听机器人启动之后发送的消息的添加反应事件,如果你需要监听启动前就存在的历史消息的反应,需要改用on_raw_reaction_add事件,该事件不受本地缓存限制。
5. 阻塞代码导致事件循环卡住
你当前on_message中的倒计时逻辑用了time.sleep(1),这是同步阻塞方法,会直接卡住整个机器人的事件循环,导致包括反应事件在内的所有异步事件都无法触发,需要把time.sleep(1)改成await asyncio.sleep(1)。
另外你现有的if '!"Ban' or '!"ban' in message.content逻辑存在语法错误,该判断会永远返回True,正确写法是if '!"Ban' in message.content or '!"ban' in message.content。
内容的提问来源于stack exchange,提问作者Hunter
相关产品推荐
相关产品推荐

