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

discord.js-selfbot满足指定emoji.id条件后无法停发消息如何解决

问题根本原因

你的代码进入了死循环触发逻辑:
当指定表情反应被添加时,你在回调里主动调用了message.react(':wleft:847502744176820256'),你自己的账号添加这个表情的动作会再次触发messageReactionAdd事件,满足emoji.id的判断条件后又会执行一次相同的回调,重复发消息、加反应,就形成了无限循环。


修复方案

方案1:排除自己触发的反应事件

最直接的方式就是当事件触发来源是自身账号时,直接终止回调执行,修改后代码如下:

const { Client, Intents } = require("discord.js-selfbot");
const client = new Client({
    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS],
});

let token = "";

client.on('ready', () => {
    console.log('Ok');
 });
 
 client.on('messageReactionAdd', (messageReaction, user) => {
  // 新增判断:如果是自己添加的反应直接跳过
  if(user.id === client.user.id) return
  const { message, emoji } = messageReaction;
  if(emoji.id === '847502744176820256'){
        setTimeout(function(){
          console.log("reaction ADD")
          message.channel.send("ok")
          message.react(':wleft:847502744176820256')
      }, 350);
  }
});

方案2:标记已处理的消息避免重复触发

如果你确实需要监听自己添加的反应,你可以给已经处理过的消息加自定义标记,同一个消息的同个表情只处理一次:

client.on('messageReactionAdd', (messageReaction, user) => {
  const { message, emoji } = messageReaction;
  if(emoji.id === '847502744176820256'){
    // 新增判断:如果这条消息已经处理过该表情就跳过
    if(message._processedWleft) return
    // 标记已处理
    message._processedWleft = true
    setTimeout(function(){
      console.log("reaction ADD")
      message.channel.send("ok")
      message.react(':wleft:847502744176820256')
    }, 350);
  }
});

额外提示:discord.js-selfbot属于第三方非官方客户端,使用会违反Discord的服务条款,可能导致账号被封禁,谨慎使用。


内容的提问来源于stack exchange,提问作者Andres Avendaño Aguilar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:15:02