如何让Node.js开发的Discord机器人删除含特定词汇的消息?
解决Discord机器人误删消息及过滤不良词汇问题
你的代码存在三个核心问题:
- 错误绑定了
messageDelete事件:这个事件是消息被删除后才触发的,此时再调用删除操作完全无效,逻辑完全颠倒,这也是你出现误删问题的根源。 - 未正确调用删除方法:
message.delete只是引用了方法本身,必须加括号message.delete()才会执行删除操作。 - 匹配逻辑过于严格:
===是完全相等匹配,只能检测内容和"Bad word"完全一致的消息,无法识别包含该词汇的内容。
正确的实现代码(以Discord.js v14+为例):
client.on("messageCreate", async (message) => { // 跳过机器人自身消息,避免循环处理 if (message.author.bot) return; // 定义需要过滤的不良词汇列表 const forbiddenWords = ["Bad word", "其他违规词汇"]; // 检查消息是否包含任一不良词汇,支持大小写不敏感匹配 const hasForbiddenWord = forbiddenWords.some(word => message.content.toLowerCase().includes(word.toLowerCase()) ); if (hasForbiddenWord) { try { // 删除违规消息 await message.delete(); // 可选:向用户发送违规提示(需确保机器人有频道发言权限) await message.channel.send(`${message.author},你的消息包含违规内容,已被系统删除。`); } catch (err) { console.error("处理违规消息时出错:", err); } } });
关键说明:
- 使用
messageCreate事件:这是Discord.js v14及以上版本中监听用户新消息的标准事件(旧版Discord.js使用message事件)。 - 跳过机器人消息:防止机器人处理自己发送的提示消息,引发无限循环。
- 灵活的匹配逻辑:通过
includes检测包含关系,结合toLowerCase()实现大小写不敏感的过滤,覆盖更多违规场景。 - 异步处理:
message.delete()是异步操作,必须用await等待执行完成,避免出现Promise未处理的报错。 - 异常捕获:加入
try-catch块处理权限不足、消息已被删除等异常情况,避免机器人崩溃。
内容的提问来源于stack exchange,提问作者Toad
相关产品推荐
相关产品推荐

