BotDetect v2 — 生产环境机器人检测库
客户端机器人与自动化检测库,具备加权评分、行为分析、浏览器指纹识别及可配置阈值。可检测无头浏览器、Selenium、Puppeteer、Playwright、基于CDP的工具以及隐身自动化框架。
v2.1.0 — 反检测蜜罐、GPU稳定的Canvas指纹识别、增强的行为分析、惰性初始化、服务端篡改检测、请求指纹绑定及速率限制。
目录
功能特性
- 28 个检测模块,覆盖自动化框架、无头浏览器、指纹识别、行为分析、蜜罐及堆栈跟踪陷阱
- 加权评分系统 — 每个信号具有可配置权重;最终分数在服务端计算
- 三种判定等级:
human(人类)、suspicious(可疑)、bot(机器人),对应不同摩擦动作(monitor 监控、challenge 挑战、block 阻止)
- 服务端验证 — 基于 nonce、防重放、PoW 签名
- 堆栈跟踪陷阱 — 猴子补丁 DOM API 以捕获自动化工具调用栈
- 行为分析 — 鼠标曲率、按键节奏方差、滚动加速度、触摸动态
- 反检测蜜罐 — 随机化 CSS 隐藏、诱饵字段、真实感字段名
- 服务端篡改检测 — 验证信号完整性,检测作弊尝试
- 请求指纹绑定 — PoW 令牌与 HTTP 请求属性绑定
- 速率限制 — 所有验证端点按会话限制
- 无脚本检测 — 识别从未发送检测载荷的客户端
- 已知爬虫白名单 — 排除 20+ 合法爬虫的评分
架构
浏览器 你的服务器
┌──────────────────────────┐ ┌──────────────────────┐
│ Collector(单例) │ POST │ Express 中间件 │
│ ├─ 28 个检测模块 │ 信号 │ ├─ NonceManager │
│ ├─ BehaviorTracker │ + nonce │ ├─ RateLimiter │
│ ├─ HoneypotTraps │───────────▶│ ├─ TamperDetector │
│ ├─ 堆栈跟踪陷阱 │ │ ├─ computeVerdict() │
│ └─ IframeContext │ │ └─ 工作量证明 │
│ │ 判定结果 │ │
│ ↓ collect() → │ + proof │ 返回: │
│ DetectionResult[] │◀───────────│ { verdict, score, │
└──────────────────────────┘ │ confidence, proof, │
│ tamperScore } │
└──────────────────────┘
│
▼
会话保护端点
(登录、结账等)
验证 proof 后放行
核心原则:浏览器仅收集原始 DetectionResult[] 信号。服务端使用秘密权重表计算最终判定。客户端计算的判定结果永远不可信。
快速开始
1. 构建
npm install
npm run build
输出到 dist/:
botdetect.min.js(含 polyfill,约 151 KB)
botdetect-clean.min.js(仅现代浏览器,约 74 KB)
2. 在页面中引入
<script src="/path/to/botdetect.min.js"></script>
<script>
BotDetect.collector.enableTraps();
BotDetect.collector.enableBehavioralTracking();
BotDetect.collector.enableHoneypots();
</script>
3. 设置服务端验证
cd server
npm install express cors express-session
node example-integration.js
4. 在敏感操作时发送信号
async function onLogin() {
const { nonce } = await (await fetch('/api/botdetect/nonce')).json();
BotDetect.collector.setNonce(nonce);
const signals = await BotDetect.collector.collect();
const resp = await fetch('/api/botdetect/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ signals, nonce })
});
const { verdict, score, proof, friction } = await resp.json();
document.getElementById('botdetect-proof').value = proof;
document.getElementById('login-form').submit();
}
5. 在服务端验证
app.post('/api/login', (req, res) => {
const bd = req.session.botdetect;
if (!bd) return res.status(403).json({ error: 'no_verification' });
if (bd.verdict === 'bot') return res.status(403).json({ error: 'access_denied' });
if (bd.verdict === 'suspicious') return challengeCaptcha(req, res);
res.json({ success: true });
});
客户端 API
Collector(单例)
import Collector from './collector/Collector';
// 或通过全局变量:BotDetect.collector
Detector(仅调试用)
import Detector from './detector/Detector';
警告:analyze() 完全在浏览器中运行。切勿将其输出用于生产决策。
类型定义
interface DetectionResult {
name: string; // 模块名称
score: number; // 0.0 – 1.0
weight: number; // 1 – 10(重要性)
detail?: string; // 人类可读描述
}
interface DetectionVerdict {
verdict: 'bot' | 'suspicious' | 'human';
score: number; // 0.0 – 1.0
confidence: number; // 0.0 – 1.0
signals: DetectionResult[];
threshold: number;
friction: 'monitor' | 'challenge' | 'block';
}
interface CollectorConfig {
detectionTimeoutMs: number; // 每个模块超时(默认:3000)
enableTraps: boolean;
enableBehavioralTracking: boolean;
enableHoneypots: boolean;
thresholds: { strict: number; balanced: number; relaxed: number };
}
服务端集成
Express 中间件
const { createBotDetectEndpoint } = require('./server');
const { router, generateProofOfWork, cleanup } = createBotDetectEndpoint({
secretSalt: process.env.BOTDETECT_SALT,
scoring: {
threshold: 'balanced', // 'strict' | 'balanced' | 'relaxed' | number
minSignals: 2,
signalBoostThreshold: 0.8,
frictionThresholds: { monitor: 0.2, challenge: 0.5, block: 0.8 }
},
nonce: { ttl: 300000 }, // 5 分钟 nonce 过期
noScript: { timeout: 10000 }, // 10 秒无脚本窗口
rateLimit: { maxRequests: 10, windowMs: 60000 },
noScriptPaths: ['/api/login', '/api/checkout', '/api/register']
});
app.use('/api', router);
端点
| 端点 | 方法 | 用途 |
|---|
/api/botdetect/nonce | GET | 发放一次性 nonce |
/api/botdetect/verify |
服务端响应格式
{
"verdict": "human",
"score": 0.125,
"confidence": 0.85,
"tamperScore": 0,
"friction": "monitor",
"threshold": 0.5,
"proof": "a1b2c3d4e5f6..."
}
服务端评分(Node.js)
const { computeVerdict, RateLimiter, NonceManager } = require('./scoring');
const verdict = computeVerdict(signals, {
threshold: 'balanced',
minSignals: 2,
signalBoostThreshold: 0.8,
frictionThresholds: { monitor: 0.2, challenge: 0.5, block: 0.8 }
});
// 检测到信号篡改时,verdict.tamperScore > 0
检测模块
自动化框架(权重 5–7)
Playwright 专用(权重 3–4)
| 模块 | 检测内容 | 权重 |
|---|
playwrightWebKit | WebKit 自动化痕迹 | 4 |
playwrightOrientation | 方向 + chrome.runtime 不一致 | 3 |
行为分析(权重 7)
| 模块 | 分析信号 | 权重 |
|---|
behavioralAnalysis | 鼠标曲率 + 直线比例、按键 CV + 爆发模式 + KPM、滚动加速度 + 方向变化、触摸力方差 + 半径 | 7 |
浏览器指纹识别(权重 3–4)
Navigator 与操作系统属性(权重 5)
| 模块 | 检测内容 | 权重 |
|---|
navigatorInconsistencies | 11 项检查:languages、plugins、mimeTypes、platform、UA、cookies、DNT、touch、hardwareConcurrency、deviceMemory、connection | 5 |
屏幕与性能(权重 3)
主动陷阱与蜜罐(权重 8–9)
| 模块 | 检测内容 | 权重 |
|---|
honeypotTraps | 随机隐藏字段 + 诱饵 + 金丝雀端点 | 9 |
stackTraceTraps | querySelector// 调用者栈分析 |
网络与上下文(权重 1–2)
白名单(权重 0)
| 模块 | 检测内容 | 权重 |
|---|
verifiedBots | 20+ 已知爬虫(Googlebot、Bingbot、Yandex、Facebook、Twitter 等)——返回 -1,排除评分 | 0 |
配置
Collector
const collector = Collector.getInstance({
detectionTimeoutMs: 1000, // 降低以提升用户体验
enableTraps: true,
enableBehavioralTracking: true,
enableHoneypots: true,
thresholds: {
strict: 0.3, // 严格(登录、结账)
balanced: 0.5, // 默认
relaxed: 0.7 // 宽松(内容浏览)
}
});
Detector(仅调试用)
const detector = Detector.getInstance({
threshold: 'balanced', // 'strict' | 'balanced' | 'relaxed' | number
minSignals: 2, // 提升前最少信号数
signalBoostThreshold: 0.8, // 高于此阈值的信号额外加权
failPolicy: 'open', // 'open' = 出错时判定为人类,'closed' = 出错时判定为机器人
frictionThresholds: {
monitor: 0.2,
challenge: 0.5,
block: 0.8
}
});
服务端
createBotDetectEndpoint({
secretSalt: process.env.BOTDETECT_SALT, // 保持秘密
scoring: { threshold: 'balanced' },
nonce: { ttl: 300000, cleanupInterval: 60000 },
noScript: { timeout: 10000 },
rateLimit: { maxRequests: 10, windowMs: 60000 },
requestFingerprint: true, // 将 PoW 绑定到请求属性
noScriptPaths: ['/api/login', '/api/checkout']
});
生产环境检查清单
安全
性能
监控
测试
npm test # 74 个 Jest 测试,跨越 6 个测试套件
npm run typecheck # TypeScript 严格模式
npm run lint # ESLint
npm run build # Webpack 生产打包
许可证
Apache — Lahmeri Mohamed Amine