Discord JS Bot:如何创建脏话过滤器?能否仅针对特定用户生效?
嘿,这需求太适合和朋友整活了!我刚好折腾过Discord.js的类似功能,给你一步步拆解清楚,既能实现基础脏话过滤,还能精准针对你的朋友“开炮”~
一、先搞基础版脏话过滤器(全频道全用户生效)
假设你已经搭好了Discord.js v14的Bot框架(没搭的话,先初始化项目装discord.js就行),核心思路就是监听消息事件,检测内容里的脏话关键词,然后执行整活操作。
步骤1:定义脏话列表+监听消息
先把你想过滤的脏话存进数组,然后监听messageCreate事件:
// 自定义脏话列表,换成你想过滤的词就行,会自动处理大小写 const badWords = ['卧槽', '傻逼', '垃圾']; client.on('messageCreate', async (message) => { // 忽略Bot自己发的消息,防止无限循环 if (message.author.bot) return; // 把消息转成小写,避免大小写影响匹配 const lowerContent = message.content.toLowerCase(); // 检查消息里是否包含任何脏话 const hasBadWord = badWords.some(word => lowerContent.includes(word)); if (hasBadWord) { // 第一步:删掉脏话消息 await message.delete().catch(err => console.log('没权限删消息哦')); // 第二步:发个搞笑警告,@用户加表情包 const warningMsg = await message.channel.send(`<@${message.author.id}> 嘴巴放干净点!🤬`); // 可选:5秒后自动删除警告,避免频道刷屏 setTimeout(() => warningMsg.delete().catch(err => {}), 5000); } });
小优化:精确匹配避免误判
如果担心比如“傻逼”和“傻逼兮兮”这种半匹配,可以用正则表达式做精确单词匹配:
// 用正则表达式匹配独立单词(忽略大小写) const hasBadWord = badWords.some(word => new RegExp(`\\b${word}\\b`, 'i').test(message.content) );
\\b是单词边界,这样只会匹配独立的脏话,不会误判包含该词的正常词汇。
二、升级成「针对特定用户的专属过滤器」
要只对你朋友的脏话做出反应,其实就是加个用户ID判断,只有目标用户发的消息才检测。
步骤1:指定目标用户ID
先把你朋友的Discord用户ID存进数组(可以加多个):
// 替换成你朋友的用户ID(找ID方法:Discord开开发者模式,右键用户复制ID) const targetFriends = ['123456789012345678', '987654321098765432'];
步骤2:修改监听逻辑,只检测目标用户
在原来的代码里加个判断,只有消息作者在目标列表里才执行过滤:
client.on('messageCreate', async (message) => { if (message.author.bot) return; // 关键:只处理目标用户的消息 if (!targetFriends.includes(message.author.id)) return; const lowerContent = message.content.toLowerCase(); const hasBadWord = badWords.some(word => lowerContent.includes(word)); if (hasBadWord) { // 整活升级:比如禁言1分钟(需要Bot有管理员权限) await message.delete().catch(err => console.log('删消息失败')); // 禁言1分钟(单位是毫秒,60*1000=60秒) await message.member.timeout(60 * 1000, '嘴臭惩罚').catch(err => console.log('没权限禁言哦')); // 发个搞笑的惩罚通知 const punishMsg = await message.channel.send(`<@${message.author.id}> 被当场抓获嘴臭!罚禁言1分钟😈`); setTimeout(() => punishMsg.delete().catch(err => {}), 8000); } });
一些整活小提示
- 权限要到位:确保Bot在服务器里有「删除消息」「管理成员(禁言用)」的权限,不然会报错
- 个性化回复:把警告换成你们之间的梗,比如发自定义表情包(用
<:表情名:表情ID>格式) - 白名单频道:如果想在某些频道不开玩笑,可以加个频道ID判断,比如
if (message.channel.id === '频道ID') return; - 反向整活:比如只允许目标用户说脏话,其他人说就惩罚?改个判断逻辑就行~
内容的提问来源于stack exchange,提问作者Genji Shimada




