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

discord.js如何移除指定用户添加的消息Reaction

问题根因

你现有代码直接调用无参的reaction.remove(),该方法默认会清空当前表情下的所有用户反应,遍历执行后自然会移除消息上的全部Reaction,没有做指定用户的过滤和定向移除。

修复方案

核心逻辑是:遍历每个Reaction时,先判断目标用户是否对该表情添加过反应,确认存在后调用带用户ID参数的移除方法,仅删除该用户的对应反应,不会影响其他用户的Reaction。

v13/v14 版本discord.js 实现(当前主流版本)

// 替换为需要移除Reaction的指定用户ID
const TARGET_USER_ID = '填写你的目标用户ID';

channel.messages.fetch('981767936949747722').then(function (message) { 
  message.reactions.cache.forEach(reaction => {
    // 校验目标用户是否点过当前反应
    if (reaction.users.cache.has(TARGET_USER_ID)) {
      // 传入用户ID,仅移除该用户的这一个反应
      reaction.users.remove(TARGET_USER_ID);
    }
  })
});

适配反应数超20个的异步稳妥写法

如果单条消息反应较多,缓存可能没有拉取全所有反应用户,建议先拉取全量用户列表再判断,避免漏删:

const TARGET_USER_ID = '填写你的目标用户ID';

async function removeTargetUserReactions() {
  const message = await channel.messages.fetch('981767936949747722');
  for (const reaction of message.reactions.cache.values()) {
    // 拉取当前反应下的全量用户列表
    await reaction.users.fetch();
    if (reaction.users.cache.has(TARGET_USER_ID)) {
      await reaction.users.remove(TARGET_USER_ID);
    }
  }
}
removeTargetUserReactions();

v12及更早版本写法

旧版本直接给reaction.remove()传入用户ID即可,不需要走users属性:

const TARGET_USER_ID = '填写你的目标用户ID';

channel.messages.fetch('981767936949747722').then(function (message) { 
  message.reactions.cache.forEach(reaction => {
    if (reaction.users.cache.has(TARGET_USER_ID)) {
      reaction.remove(TARGET_USER_ID);
    }
  })
});
注意事项
  • 机器人必须持有MANAGE_MESSAGES权限,否则无法移除其他用户添加的反应
  • 目标用户ID需要是字符串格式,不要传数字类型避免精度丢失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:09:25