Discord.js v14:如何删除包含指定词汇的用户消息?
Discord 违禁词消息检测与删除方案
原代码存在的问题
- 事件逻辑完全错误:
guildBanAdd是用户已被封禁后才触发的事件,和检测违禁词删除消息的需求完全不匹配,应该监听新消息创建事件。 - 冗余操作:事件触发时用户已经被封禁,再次调用
guild.members.ban(user)毫无意义。 - 消息覆盖范围有限:仅检查缓存中的消息,缓存只保留近期消息,无法处理更早的历史内容。
- 匹配逻辑有缺陷:直接用
match(badWord)未处理大小写,且可能误匹配包含违禁词的正常词汇(比如违禁词是"bad","badly"也会被判定违规)。
修正后的实时消息检测代码
针对新发送的消息实时检测并处理:
const badWords = ["badword1", "badword2", "badword3"]; // 构建正则:匹配完整单词、忽略大小写,避免误匹配 const badWordRegex = new RegExp(`\\b(${badWords.join('|')})\\b`, 'gi'); // 监听新消息创建事件(Discord.js v14+版本,旧版用message事件) client.on('messageCreate', async (message) => { // 跳过机器人发送的消息,防止自循环 if (message.author.bot) return; // 检查消息是否包含违禁词 if (badWordRegex.test(message.content)) { try { // 删除违规消息 await message.delete(); // 可选:给违规用户发送提醒私信 await message.author.send('你的消息包含违禁词,已被系统删除!'); // 可选:如果需要直接封禁用户,取消下方注释 // await message.member.ban({ reason: '发送违规违禁词' }); } catch (err) { console.error('处理违规消息失败:', err); } } });
历史消息扫描处理代码
如果需要清理历史消息中的违规内容,可以用以下方法:
// 扫描指定频道的历史消息(示例) async function scanChannelHistory(channel) { try { // 批量获取历史消息,limit最大为100,如需更多可分页处理 const messages = await channel.messages.fetch({ limit: 100 }); for (const [_, message] of messages) { if (message.author.bot) continue; if (badWordRegex.test(message.content)) { await message.delete(); console.log(`已删除用户 ${message.author.tag} 的违规消息`); } } } catch (err) { console.error('扫描历史消息出错:', err); } } // 调用示例:扫描服务器名为"general"的频道 // const targetChannel = client.guilds.cache.get('服务器ID').channels.cache.find(ch => ch.name === 'general'); // scanChannelHistory(targetChannel);
注意事项
- 确保机器人拥有对应权限:删除消息权限(Manage Messages)、封禁成员权限(Ban Members,若需封禁)、读取消息历史权限(Read Message History,若扫描历史)。
- 正则规则可按需调整:不需要完整单词匹配就去掉
\\b;需要严格大小写就去掉正则的i标志。 - 批量处理历史消息时,注意Discord API的速率限制,避免频繁请求导致被限制。
内容的提问来源于stack exchange,提问作者Croblanc
相关产品推荐
相关产品推荐

