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

如何检测消息是否被编辑?解决机器人仅允许发"ew"的编辑漏洞

嘿,我来帮你搞定这两个问题!

问题1:如何检测消息是否被编辑?

要检测消息编辑,核心是监听机器人框架提供的「消息更新」事件——几乎所有主流聊天机器人框架(比如Discord.js、Pycord等)都内置了这个事件,用来捕获消息被修改的动作。

以Discord.js为例,你可以这样实现:

client.on('messageUpdate', (oldMessage, newMessage) => {
  // 排除机器人自身的消息(避免无限循环)
  if (newMessage.author.bot) return;

  // 对比新旧消息内容,判断是否被编辑
  if (oldMessage.content !== newMessage.content) {
    console.log(`用户 ${newMessage.author.tag} 编辑了消息:`);
    console.log(`原内容:${oldMessage.content}`);
    console.log(`新内容:${newMessage.content}`);
    // 这里可以添加你需要的后续处理逻辑
  }
});

这个逻辑很直观:当事件触发时,框架会传入编辑前的旧消息和编辑后的新消息,只要两者的内容不一致,就说明消息被编辑过了。


问题2:解决编辑非"ew"内容后消息未删除的问题

你已经搞定了发送环节的拦截,现在只需要把相同的校验逻辑移植到消息更新事件里,就能覆盖编辑后的场景。

还是以Discord.js为例,修改刚才的messageUpdate事件,加入内容校验:

client.on('messageUpdate', (oldMessage, newMessage) => {
  if (newMessage.author.bot) return;

  // 检查编辑后的内容是否不是"ew"(兼容大小写)
  if (newMessage.content.toLowerCase() !== 'ew') {
    // 删除违规消息
    newMessage.delete()
      .then(() => {
        // 可选:给用户发个临时提醒(3秒后自动删除)
        newMessage.channel.send(`${newMessage.author} 只能发送"ew"哦!`).then(msg => setTimeout(() => msg.delete(), 3000));
      })
      .catch(err => console.error('删除消息失败:', err));
  }
});

另外,记得保留发送消息时的校验逻辑,形成完整的拦截闭环:

client.on('messageCreate', (message) => {
  if (message.author.bot) return;

  if (message.content.toLowerCase() !== 'ew') {
    message.delete()
      .then(() => {
        message.channel.send(`${message.author} 只能发送"ew"哦!`).then(msg => setTimeout(() => msg.delete(), 3000));
      })
      .catch(err => console.error('删除消息失败:', err));
  }
});

这样一来,不管用户是直接发送非"ew"内容,还是先发送"ew"再编辑成其他内容,都会被机器人检测到并删除。

小提示:用toLowerCase()是为了兼容大小写的情况(比如用户发"EW"或者"eW"),如果你的需求是严格区分大小写,去掉这个方法就行。


内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:54:24