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

如何使用discord.js检测特定用户是否对消息添加了反应

discord.js 检测特定用户指定反应实现方案

前置配置

首先需要在客户端初始化时开启GuildMessageReactions意图,否则无法接收反应相关事件、拉取反应数据,v14版本示例代码如下:

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
    GatewayIntentBits.GuildMessageReactions
  ]
});

场景1:实时监听新添加的反应

如果你需要在用户添加反应的瞬间触发逻辑,监听messageReactionAdd事件即可,同时需要处理partial反应的拉取逻辑:

// 按需替换以下常量
const TARGET_MSG_ID = '你的目标消息ID';
const TARGET_USER_ID = '待检测的用户ID';
const TARGET_EMOJI = '✅'; // 自定义emoji可直接填emoji ID,如'123456789012345678'

client.on('messageReactionAdd', async (reaction, user) => {
  // 拉取部分加载的反应完整数据
  if (reaction.partial) {
    try {
      await reaction.fetch();
    } catch (err) {
      return;
    }
  }

  // 同时满足三个匹配条件则触发逻辑
  if (
    reaction.message.id === TARGET_MSG_ID &&
    user.id === TARGET_USER_ID &&
    (reaction.emoji.name === TARGET_EMOJI || reaction.emoji.id === TARGET_EMOJI)
  ) {
    // 此处添加自定义业务逻辑
    console.log(`用户${user.tag}已添加指定反应`);
  }
});

场景2:查询历史消息的已存在反应

如果你需要检测程序启动前就已经存在的反应,主动拉取消息的反应数据校验即可:

async function checkReactionStatus() {
  // 按需替换以下常量
  const GUILD_ID = '目标服务器ID';
  const CHANNEL_ID = '目标消息所在频道ID';
  const TARGET_MSG_ID = '目标消息ID';
  const TARGET_USER_ID = '待检测的用户ID';
  const TARGET_EMOJI = '✅';

  const guild = await client.guilds.fetch(GUILD_ID);
  const channel = await guild.channels.fetch(CHANNEL_ID);
  const targetMsg = await channel.messages.fetch(TARGET_MSG_ID);

  // 匹配目标emoji的反应
  const matchedReaction = targetMsg.reactions.cache.find(r => 
    r.emoji.name === TARGET_EMOJI || r.emoji.id === TARGET_EMOJI
  );
  if (!matchedReaction) return false;

  // 校验目标用户是否在反应用户列表中
  return await matchedReaction.users.fetch().then(users => users.has(TARGET_USER_ID));
}

// 调用函数即可获取检测结果
const hasReaction = await checkReactionStatus();
console.log('用户是否添加指定反应:', hasReaction);

注意事项

  • v13及更低版本的discord.js意图命名存在差异,核心判断逻辑保持不变
  • 自定义emoji检测优先使用emoji ID,避免同名称不同emoji的误判

内容的提问来源于stack exchange,提问作者TheC0mpu1er

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:24:03