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
相关产品推荐
相关产品推荐

