如何检测消息是否被编辑?解决机器人仅允许发"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
相关产品推荐
相关产品推荐

