discord.js v13实现不良词过滤无法识别非独立违规词的解决方法
不良词过滤逻辑问题排查
现有代码存在3个直接导致功能异常的错误:
- 条件判断写为赋值语句:
message.guild.id = 'GUILD_ID'是赋值操作而非相等校验,会直接覆写当前服务器ID值,判断逻辑完全不生效 - 匹配范围仅覆盖消息第一个词:拆分消息后仅取
args[0](即消息第一个空格前的片段)做校验,只有违规词出现在消息最开头时才会触发匹配,带前后缀的消息自然无法命中 - 无效方法调用:
args[0]是字符串类型,不存在.join(' ')数组方法,代码运行到该行会直接抛出类型错误
修正后可运行代码
实现全消息任意位置违规词识别,同时补充大小写绕过防护、权限错误捕获,代码如下:
// 消息内容统一转小写,规避大小写混写绕过(如WorD1、WORD1) const lowerCaseContent = message.content.toLowerCase(); // 严格相等判断校验当前服务器ID,注意是===不是= if (message.guild.id === '替换为你的实际服务器ID') { const badWordList = ['word1', 'word2']; // 只要消息任意位置包含任意一个违规词,就命中过滤规则 const hitFilter = badWordList.some(word => lowerCaseContent.includes(word.toLowerCase())); if (hitFilter) { // 加catch捕获权限不足等异常,避免机器人进程崩溃 message.delete().catch(err => console.error('删除违规消息失败:', err)); } }
可选优化方向
- 若需要避免子串误判(比如匹配
word1时误删正常词word1test),可使用正则\b边界符做全词匹配 - 可补充形近字、特殊符号插入的匹配规则,降低用户绕过过滤的概率
- 命中过滤后可发送临时违规提示,明确告知用户消息被删除的原因
内容的提问来源于stack exchange,提问作者Pooyan
相关产品推荐
相关产品推荐

