Discord.js v13垃圾消息检测器失效:无报错但无法删除消息
Discord.js v13 垃圾消息检测器修复方案
核心问题拆解
spamTracker作用域错误:每次触发messageCreate事件都会新建一个Map,完全无法追踪用户的历史消息记录,自然检测不到垃圾行为。- 未定义变量:代码里直接用
author、content、MAX_MESSAGE_LENGTH,但这些变量根本没声明,得换成message.author、message.content,还要给MAX_MESSAGE_LENGTH设具体值。 - 异步操作未处理:
message.delete()、消息发送这类异步方法没加await,容易出现执行顺序混乱或静默失败。 - 检测逻辑不完善:没有设置用户记录的过期清理,时间久了
spamTracker会占满内存;触发条件的时机也有问题,当前逻辑要等第5条消息才会触发检测。 - 隐性权限问题:机器人必须有「管理消息」权限才能删除用户消息,不然
message.delete()会悄悄失败。
修复后的完整代码
// 把spamTracker放在模块作用域,跨事件保留用户消息记录 const spamTracker = new Map(); // 自定义最大消息长度,可按需调整 const MAX_MESSAGE_LENGTH = 2000; // 用户记录过期时间(5分钟,单位毫秒),避免内存溢出 const RECORD_EXPIRE_TIME = 5 * 60 * 1000; module.exports = { name: 'messageCreate', async run(client, message) { // 跳过机器人自身消息,避免误判 if (message.author.bot) return; const { author, content, createdTimestamp } = message; // 垃圾消息检测逻辑 if (spamTracker.has(author.id)) { const data = spamTracker.get(author.id); const timeDifference = createdTimestamp - data.lastMessageTimestamp; // 更新用户的消息计数和时间戳 data.messageCount++; data.lastMessageTimestamp = createdTimestamp; spamTracker.set(author.id, data); // 2秒内发送5条及以上消息则判定为垃圾 if (timeDifference < 2000 && data.messageCount >= 5) { console.log(`检测到垃圾消息,用户:${author.tag}`); try { await message.delete(); await message.channel.send(`${author}, 请不要发送垃圾消息。`); // 触发提醒后重置计数,避免重复警告 spamTracker.set(author.id, { messageCount: 1, lastMessageTimestamp: createdTimestamp, }); } catch (err) { console.error('处理垃圾消息时出错:', err); } } } else { spamTracker.set(author.id, { messageCount: 1, lastMessageTimestamp: createdTimestamp, }); // 设置定时器,过期后自动删除用户记录 setTimeout(() => { spamTracker.delete(author.id); }, RECORD_EXPIRE_TIME); } // 超长消息检测逻辑 if (content.length > MAX_MESSAGE_LENGTH) { try { await message.delete(); await message.reply('注意!你的消息长度超过了允许的最大值。'); } catch (err) { console.error('删除超长消息时出错:', err); } } }, };
额外注意事项
- 确认机器人在服务器中拥有「管理消息」权限,否则无法执行删除操作。
- 可以根据需求调整
MAX_MESSAGE_LENGTH、2000(垃圾消息时间窗口)、5(窗口内消息阈值)、RECORD_EXPIRE_TIME这些参数。 - 代码里加了
try/catch捕获错误,终端会输出具体问题,方便排查。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

