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

基于Node.js的Twitch聊天机器人垃圾消息过滤优化问询

针对Twitch垃圾机器人的高效过滤方案

当前方案的核心问题

你现在采用的逐个添加后缀匹配的方式属于事后被动防御,只能在垃圾消息出现后手动补全规则,不仅效率低下,还极易被垃圾机器人通过更换后缀快速绕过,长期可靠性完全无法保障。

先提炼垃圾消息的共性特征

从你遇到的情况来看,这类垃圾机器人消息通常有以下共性,可作为过滤依据:

  • 包含固定格式的后缀(如a739、e644这类字母+3位数字的组合)
  • 发送账号多为新注册账号(创建时间短、无粉丝积累、无历史发言记录)
  • 短时间内批量发送,或同一内容重复推送
  • 内容多为违规广告、无意义乱码,和正常用户发言逻辑不符

多维度的高效过滤方案

1. 用正则表达式匹配通用后缀模式

不用逐个添加后缀,直接匹配这类字母+数字的组合格式,覆盖同类型的所有后缀:

// 匹配"字母+3位数字"结尾的模式,i表示忽略大小写
const spamSuffixRegex = /[a-zA-Z]\d{3}$/i;

if (spamSuffixRegex.test(text)) {
  await apiClient.asUser(
    nyaka,
    async (ctx) =>
      await ctx.moderation.banUser(msg.channelId, {
        reason: `${user}: ${text}`,
        user: msg.userInfo.userId,
      })
  );
}

如果后缀格式有变化(比如数字和字母顺序调换、长度改变),可调整正则规则,比如/[a-zA-Z\d]{4}$/i可匹配任意4位字母数字混合的结尾。

2. 从账号维度做前置过滤

垃圾机器人基本都是新注册的小号,可通过Twitch API获取账号信息做判断:

// 获取当前发言用户的详细信息
const userDetails = await apiClient.users.getUserById(msg.userInfo.userId);
const accountAge = Date.now() - new Date(userDetails.createdAt).getTime();
const oneDay = 24 * 60 * 60 * 1000; // 1天的毫秒数

// 结合账号年龄和消息内容判断:注册不满1天+匹配垃圾后缀,直接封禁
if (accountAge < oneDay && spamSuffixRegex.test(text)) {
  await apiClient.asUser(
    nyaka,
    async (ctx) =>
      await ctx.moderation.banUser(msg.channelId, {
        reason: "新账号发送垃圾消息",
        user: msg.userInfo.userId,
      })
  );
}

3. 消息频率/重复度检测

维护一个简易缓存,检测同一账号短时间内的重复发言或高频发送行为:

// 用Map缓存用户最近一次发言的时间,过期时间设为5分钟
const userMessageCache = new Map();
const now = Date.now();
const cacheExpiry = 5 * 60 * 1000;

// 清理过期缓存
userMessageCache.forEach((timestamp, userId) => {
  if (now - timestamp > cacheExpiry) {
    userMessageCache.delete(userId);
  }
});

// 检测:用户5分钟内发过消息+当前消息匹配垃圾后缀,直接封禁
if (userMessageCache.has(msg.userInfo.userId) && spamSuffixRegex.test(text)) {
  // 执行封禁逻辑
} else {
  userMessageCache.set(msg.userInfo.userId, now);
}

4. 关键词组合过滤

如果垃圾消息包含固定违规话术,可搭配关键词列表做双重验证:

const spamKeywords = ["免费代练", "刷粉丝", "抽奖链接"]; // 根据实际违规内容补充
const hasSpamKeyword = spamKeywords.some(keyword => text.toLowerCase().includes(keyword));

// 匹配后缀或关键词,任一条件触发封禁
if (hasSpamKeyword || spamSuffixRegex.test(text)) {
  // 执行封禁逻辑
}

进阶优化方向

  • 收集垃圾消息和正常消息样本,用TensorFlow.js训练简单的文本分类模型,实现自动识别
  • 开启Twitch内置的自动审核工具,配合自定义规则使用,减少手动开发的工作量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:35:12