discord.py中on_reaction_remove()事件无法触发问题求助
常见原因及对应解决方案如下:
1. 事件触发受本地缓存限制
on_reaction_remove 仅对机器人启动后加载到本地内存缓存的消息生效,如果你操作的消息是机器人启动前就发送的,不在缓存范围内,事件不会触发。
推荐直接使用不依赖本地缓存的 on_raw_reaction_remove 事件替代,示例代码:
@client.event async def on_raw_reaction_remove(payload): # payload内置所有核心参数:用户ID、消息ID、频道ID、反应内容 print('removed') # 若需要完整对象可主动拉取: channel = await client.fetch_channel(payload.channel_id) message = await channel.fetch_message(payload.message_id) user = await client.fetch_user(payload.user_id) reaction = next(r for r in message.reactions if str(r.emoji) == str(payload.emoji)) # 后续逻辑可直接复用原有on_reaction_remove的代码
2. 事件队列被阻塞
如果代码中存在其他异步事件(如on_message)漏加await关键字,或包含长时间运行的同步逻辑(如time.sleep、大量同步计算),会卡住事件队列导致后续事件无法触发。
排查点:
- 所有异步方法调用前必须加
await - 同步耗时逻辑请用
asyncio.to_thread包裹异步执行
3. 权限配置遗漏
请再次确认两项配置:
- 机器人在对应服务器拥有
读取消息历史权限,无该权限无法接收反应删除事件推送 - Discord开发者门户的三个特权网关意图(Presence Intent、Server Members Intent、Message Content Intent)全部开启,修改配置后必须重启机器人才能生效
内容的提问来源于stack exchange,提问作者TimeSauce
相关产品推荐
相关产品推荐

