如何检测数组中的重复序列以识别应用内selfbot用户行为
数组指定重复序列检测实现方案
你之前实现的单个元素出现次数统计,只能判断单个字符的出现频率,无法确认这些字符是否按照固定顺序连续出现,因此不能满足固定序列的检测需求。要识别selfbot发送的周期性重复消息,你可以按以下方案实现:
1. 基础序列匹配功能
核心思路是遍历待检测数组,逐个位置和目标序列做全量匹配,统计目标序列的出现次数,代码实现如下:
// 定义待匹配的目标重复序列 const targetSequence = ["a", "b", "c", "f", "b"]; // 用户消息对应的字符数组 const userMessageArray = ["a", "b", "c", "f", "b", "a", "b", "c", "f", "b", "a", "b", "c", "f", "b", "a", "b", "c", "f", "b", "a", "b", "c", "f", "b"]; /** * 统计目标序列在源数组中的出现次数 * @param {Array} sourceArr 待检测的源数组 * @param {Array} targetSeq 要匹配的目标序列 * @returns {Number} 目标序列的出现次数 */ function countSequenceMatch(sourceArr, targetSeq) { const sourceLen = sourceArr.length; const targetLen = targetSeq.length; let matchCount = 0; // 源数组长度比目标序列短,不可能匹配直接返回0 if (sourceLen < targetLen) return 0; for (let i = 0; i <= sourceLen - targetLen; i++) { let isMatch = true; // 从当前位置开始逐个对比目标序列元素 for (let j = 0; j < targetLen; j++) { if (sourceArr[i + j] !== targetSeq[j]) { isMatch = false; break; } } if (isMatch) { matchCount++; // 匹配成功后跳过已匹配的位置,避免重叠计数,符合selfbot整段重复发送的特征 i += targetLen - 1; } } return matchCount; } // 测试调用 const resultCount = countSequenceMatch(userMessageArray, targetSequence); console.log(resultCount); // 示例数组返回结果为5,即目标序列重复了5次
2. Selfbot检测逻辑优化
为了提升检测准确率,降低误判概率,你可以配合以下规则一起判定:
- 设定重复次数阈值:比如目标序列连续重复超过3次即可判定为异常,你提供的示例中序列重复了5次,明显符合自动发送的bot特征
- 追加时间维度校验:如果这些序列对应的消息发送时间间隔完全一致或者误差极小,几乎可以100%判定为selfbot自动发送
- 结合账号历史行为判断:排除用户手动发送固定暗号、刻意刷屏的特殊场景,结合账号之前的发送习惯综合判定
内容的提问来源于stack exchange,提问作者SrNiix_
相关产品推荐
相关产品推荐

