Discord机器人实现频道特定词放行 兼容词汇大小写变体的开发问题
Discord指定频道关键词过滤实现方案
需求梳理
需要实现Discord机器人在指定文本频道内的白名单词汇校验:仅允许用户发送指定词汇,非匹配内容自动删除,同时兼容词汇的大小写变体、前后误输入空格等场景。
原有代码仅能精确匹配完全等于upgrade的消息,存在全局生效、无法兼容格式变体、未做异常处理的问题。
核心调整逻辑
- 前置拦截机器人消息:优先判断消息发送者是否为机器人,是则直接跳过,避免循环触发删除逻辑
- 限定生效频道:增加频道ID判断,仅在配置的目标频道执行过滤规则,不影响其他频道正常聊天
- 文本标准化处理:对用户发送的内容先做预处理,通过
trim()清除首尾空白字符,通过toLowerCase()统一转为小写,兼容UPGRADE、Upgrade、upgrade这类大小写、前后带空格的变体 - 可扩展白名单:用数组维护允许发送的词汇列表,后续新增允许词汇直接修改数组即可
- 异常捕获:删除消息时加错误捕获,避免机器人没有频道管理权限时控制台抛出未处理错误
调整后可直接运行的代码
// 配置项:按需修改 const TARGET_CHANNEL_ID = "替换为需要启用规则的文本频道ID"; const ALLOWED_WORD_LIST = ["upgrade"]; client.on("messageCreate", (message) => { // 跳过所有机器人发送的消息 if (message.author.bot) return; // 非目标频道直接放行 if (message.channel.id !== TARGET_CHANNEL_ID) return; // 预处理消息内容:去首尾空格 + 统一转小写 const formatContent = message.content.trim().toLowerCase(); // 内容不在白名单内则删除 if (!ALLOWED_WORD_LIST.includes(formatContent)) { message.delete().catch(err => console.log("消息删除失败,可能缺少权限:", err)); } });
可选扩展建议
- 如果需要兼容词汇中间误输入空格的场景(比如用户打了
up grade),可以在预处理步骤新增一步去掉所有空白字符:const formatContent = message.content.replace(/\s/g, '').toLowerCase(); - 如果规则允许消息中包含目标词汇即可、不需要整条消息完全匹配,可以把判断逻辑替换为
!formatContent.includes("upgrade") - 可以在删除消息后给用户发一条临时提示,说明当前频道的发言规则,设置几秒后自动删除,减少用户困惑
注意:Discord.js v12以上版本推荐使用
messageCreate事件替代旧的message事件,旧事件在v14版本已被废弃,调用后不会正常触发。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

