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

如何在discord.js-selfbot的message事件中捕获表情反应并解决emoji未定义报错

问题解决方法

错误原因

你当前使用的client.on("message", (message) => {})回调仅传入消息对象message,没有任何地方定义emoji变量,直接访问emoji.name自然会抛出ReferenceError: emoji is not defined错误。

实现逻辑调整

要在message事件回调内完成需求,需要从message对象的reactions属性中获取该消息已存在的所有表情反应,遍历取出对应emoji做匹配即可,同时还要修正原有代码中的其他逻辑问题:

  1. 原有if(message.embeds.length >= 0)判断永远为真,要判断消息携带embed应该修改为message.embeds.length >= 1
  2. 原有循环中遇到无description的embed直接return会终止整个回调执行,应该改为continue仅跳过当前embed的检查

修正后完整代码

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!');
 });

 let ListWish = ["❤","💖","💘"];
 let Wish;

client.on("message", (message) => {
    // 每次处理新消息先重置状态
    Wish = '';
    // 遍历消息已有的所有反应,匹配目标表情
    for (const reaction of message.reactions.cache.values()) {
        const emoji = reaction.emoji;
        if(ListWish.includes(emoji.name)){
            Wish = 'y';
            break;
        }
    }

    // 仅当消息有embed时才进入处理
    if(message.embeds.length >= 1) {
        let embed = message.embeds
        for(let i = 0; i < embed.length; i++) {
          if (!embed[i] || !embed[i].description) continue;
          if(Wish === 'y'){
            message.channel.send("Have emoji heart")
          }
        }
      }
});  
client.login(token); 

注意事项

该实现仅会在收到消息的瞬间检查该消息已有的表情反应,如果是消息收到后后续新增的反应,不会触发message事件,自然也不会更新Wish变量。如果要实时监听后续新增的反应,必须使用messageReactionAdd事件,和你要求的仅用message事件的限制冲突。

内容的提问来源于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 00:54:04