You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动