如何在discord.js-selfbot的message事件中捕获表情反应并解决emoji未定义报错
问题解决方法
错误原因
你当前使用的client.on("message", (message) => {})回调仅传入消息对象message,没有任何地方定义emoji变量,直接访问emoji.name自然会抛出ReferenceError: emoji is not defined错误。
实现逻辑调整
要在message事件回调内完成需求,需要从message对象的reactions属性中获取该消息已存在的所有表情反应,遍历取出对应emoji做匹配即可,同时还要修正原有代码中的其他逻辑问题:
- 原有
if(message.embeds.length >= 0)判断永远为真,要判断消息携带embed应该修改为message.embeds.length >= 1 - 原有循环中遇到无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
相关产品推荐
相关产品推荐

