Discord.js中检测Embed标题含关键词并@角色的实现问题
Discord机器人检测Embed标题并@指定角色的解决方案
你的代码存在几个关键问题:
- 关键词定义错误:逗号分隔的写法不是合法的JavaScript数组定义,数组需要用方括号包裹
- Embed获取方式错误:Discord消息中的Embed存放在
msg.embeds数组里,而非msg.embed单个对象 - 包含判断逻辑错误:
includes()方法不能直接用标题字符串匹配整个关键词数组,需要逐个检查关键词是否存在于标题中
修正后的完整代码示例
// 正确定义关键词数组 const keywords = ["Apple", "Bananas"]; // 遍历消息中的所有Embed(兼容单/多Embed场景) for (const embed of msg.embeds) { // 跳过无标题的Embed,避免报错 if (!embed.title) continue; // 检查标题是否包含任意一个关键词 const hasTargetKeyword = keywords.some(keyword => embed.title.includes(keyword)); if (hasTargetKeyword) { const matchedKeywords = keywords.filter(k => embed.title.includes(k)).join(", "); console.log(`Embed标题包含关键词:${matchedKeywords}`); // @指定角色,以下两种方式二选一 // 方式1:@everyone(需机器人有提及权限) msg.channel.send("@everyone"); // 方式2:@特定角色(替换为你的角色ID) // const targetRole = msg.guild.roles.cache.get("你的角色ID"); // msg.channel.send(targetRole.toString()); } }
关键细节说明
- 遍历
msg.embeds:确保不会遗漏消息中的多个Embed - 先判断
embed.title存在:避免因Embed无标题触发的运行错误 Array.some():只要标题包含任意一个关键词就返回true,满足检测需求- 提及权限:机器人需要服务器赋予的提及权限,@everyone还需额外开启对应权限
内容的提问来源于stack exchange,提问作者Expoespa
相关产品推荐
相关产品推荐

