You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:53:21