如何实现Discord机器人自动删除非"!test"开头的频道消息?
Discord消息自动管控功能修正方案
原代码存在的核心问题
- 存在未定义的无效变量:代码中直接使用了
input、J两个无上下文定义的变量,代码运行时会直接报错中断 - 判断逻辑完全反向:原代码逻辑为「消息包含!test命令时触发删除」,和需求「未携带!test命令时删除消息」的目标完全相反
- API调用不符合规范:使用全局
bot.deleteMessage(message)的调用方式存在兼容问题,实际可直接通过消息实例调用删除方法 - 缺少基础保护逻辑:没有跳过机器人自身发送的消息,会出现机器人删除自身消息的异常循环
适配Discord.js主流版本的正确实现
// 注:Discord.js v13+版本使用messageCreate事件,旧版v11/v12可替换为message事件 client.on("messageCreate", async (message) => { // 直接跳过指定ID频道的所有消息处理 if (message.channel.id === '823216214737289266') return; // 跳过所有机器人发送的消息,避免触发自删循环 if (message.author.bot) return; // 判断消息文本未携带!test命令 if (!message.content.includes("!test")) { // 按需求设置1秒延迟后执行删除 setTimeout(async () => { try { // 带异常捕获,避免因无权限/消息已被手动删除导致程序崩溃 await message.delete(); } catch (err) { console.error('消息删除失败:', err.message); } }, 1000); } });
上线前必要配置检查
- 在Discord开发者后台的机器人配置页,开启*消息内容意图(Message Content Intent)*权限,否则机器人无法读取普通消息的文本内容,所有判断逻辑都会失效
- 给机器人分配的服务器角色需勾选管理消息权限,否则无资格删除频道内其他用户发送的消息
- 延迟时间可根据实际管控需求调整,不需要延迟可直接移除setTimeout包裹逻辑
内容的提问来源于stack exchange,提问作者Andryxa
相关产品推荐
相关产品推荐

