You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:09:03