microlinkhq/is-antibot
GitHub: microlinkhq/is-antibot
这是一个基于静态HTTP响应分析的Node.js库,用于识别请求是否被Cloudflare、Akamai等30余家反爬虫系统或验证码服务拦截。
Stars: 21 | Forks: 4
is-antibot detects antibot and CAPTCHA challenges from 30+ providers using signals.
## 为什么?
[microlink.io](https://microlink.io) 每月处理超过 7 亿次请求。
当您构建需要以 URL 作为输入来获取数据的基础设施时,您会不断与旨在阻止您的防御机制进行交互。
一个请求可能会遇到429 TOO_MANY_REQUESTS401 UNAUTHORIZED403 FORBIDDEN
随后是一个挑战页面、验证码或 JavaScript 谜题。
现代的反机器人系统在多个层面运作,通常在您的请求到达应用程序代码之前就已介入。
我们的库 **is-antibot** 做了一件根本性的事情:它告诉您何时发生了非成功的解析以及是谁触发了它,以便您可以对接下来的操作做出更好的决策。
常见的信号包括:
- **IP 信誉**:数据中心 IP 默认会被标记。住宅流量的行为则不同。
- **HTTP 一致性**:Headers 必须与真实浏览器配置文件匹配——不仅仅是 User-Agent,而是完整的集合。
- **TLS 指纹 (JA3)**:客户端协商 TLS 的方式会泄露它是浏览器还是脚本。
- **行为启发式分析**:时序、导航顺序和交互模式都很重要。
- **JavaScript 指纹识别**:Canvas、WebGL、字体、屏幕尺寸——微小的不一致就足以暴露问题。
基于这些信号,请求可能会被:
- **允许 (Allowed)**:如果启发式分析表明是合法的人类访问者,请求将被传递到目标网站。
- **阻止 (Blocked)**:如果请求高度可疑(例如,来自已知恶意 IP 或 TLS 指纹损坏),则会立即被阻止,并返回 403 Forbidden 或 429 Too Many Requests 错误。
- **挑战 (Challenged)**:如果系统不确定,它会提供一个“挑战”(例如 CAPTCHA 或基于 JavaScript 的插页广告),必须在释放实际内容之前解决该挑战。
## 快速开始
第一步是将其作为依赖项进行安装:
```
npm install is-antibot
```
**is-antibot** 的设计宗旨是占用极小。它通过静态 HTTP 响应分析工作。
无需无头浏览器。只需将响应信息传递给它:
```
import isAntibot from 'is-antibot'
const response = await fetch('https://example.com')
const { detected, provider, detection } = isAntibot({
headers: response.headers,
statusCode: response.status,
html: await response.text(),
url: response.url
})
if (detected) {
console.log(`Blocked by ${provider} (via ${detection})`)
// => "Blocked by CloudFlare (via headers)"
}
```
结果是确定性的且速度很快——旨在每次请求都能运行,而不会成为瓶颈。
它适用于任何 HTTP 客户端,包括 [got](https://github.com/sindresorhus/got)、[axios](https://github.com/axios/axios)、[undici](https://github.com/nodejs/undici) 或仅使用原生的 [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)。
## 工作原理
从高层次来看,**is-antibot** 使用以下方式对挑战响应进行分类:
- **HTTP 状态模式**:某些平台在阻止自动化时会使用不常见的状态码;例如,LinkedIn 在挑战流程中可能返回 `999`,而 Reddit 可能返回 `403`。
- **已知的挑战签名**:挑战页面通常包含可识别的产物,如 CAPTCHA 小部件、插页模板或验证脚本。
- **响应 headers 和 body 标记**:阻止响应通常会在 headers 和 HTML 中暴露线索,例如缓解 headers、挑战令牌或特定于提供商的脚本引用。
- **特定于提供商的指纹**:每个提供商都会留下独特的信号组合;例如,Cloudflare 通常会显示 `cf-mitigated: challenge`,而其他提供商则更多依赖 cookie、URL 或 HTML 指纹。
每个提供商在这些信号中的一个或多个上都有独特的指纹。该库按优先级顺序检查它们,并返回第一个匹配项。
## 提供商
**is-antibot** 目前可以检测反机器人系统、CAPTCHA 供应商和平台特定保护流程中的挑战。
| 提供商 |
类别 |
信号 |
检测方法 |
| Akamai | Antibot | 3 | HeadersCookiesHTML |
| AliExpress CAPTCHA | CAPTCHA | 2 | HTMLURL |
| Anubis | Antibot | 1 | HTML |
| AWS WAF | Antibot | 3 | HeadersCookiesHTML |
| Captcha.eu | CAPTCHA | 2 | HTMLURL |
| Cheq | Antibot | 2 | HTMLURL |
| Cloudflare | Antibot | 2 | HeadersCookies |
| Cloudflare Turnstile | CAPTCHA | 2 | HTMLURL |
| DataDome | Antibot | 2 | HeadersCookies |
| Friendly Captcha | CAPTCHA | 2 | HTMLURL |
| FunCaptcha (Arkose Labs) | CAPTCHA | 2 | HTMLURL |
| GeeTest | CAPTCHA | 2 | HTMLURL |
| hCaptcha | CAPTCHA | 2 | HTMLURL |
| Imperva / Incapsula | Antibot | 3 | HeadersCookiesHTML |
| Instagram | Platform-specific | 1 | HTML |
| Kasada | Antibot | <>2HeadersHTML |
| LinkedIn | Platform-specific | 1 | Status Code |
| Meetrics | Antibot | 2 | HTMLURL |
| Ocule | Antibot | 2 | HTMLURL |
| PerimeterX | Antibot | 3 | HeadersCookiesHTML |
| QCloud Captcha | CAPTCHA | 2 | HTMLURL |
| reCAPTCHA | CAPTCHA | 2 | HTMLURL |
| Reblaze | Antibot | 2 | CookiesHTML |
| Reddit | Platform-specific | 2 | HTMLStatus Code |
| Shape Security | Antibot | 2 | HeadersHTML |
| Sucuri | Antibot | 1 | HTML |
| ThreatMetrix | Antibot | 2 | HTMLURL |
| Vercel | Antibot | 1 | Headers |
| YouTube | Platform-specific | 1 | HTML |
当在您的爬虫管道中构建重试逻辑、升级规则或特定于提供商的分析时,可以将此表作为快速覆盖范围参考。
如果您缺少某个提供商或信号检测,请[向我们报告](https://github.com/microlinkhq/is-antibot/issues/new?title=Request%20a%20provider),我们将持续改进该库。
标签:403 Forbidden, 429 Too Many Requests, Akamai检测, Cloudflare检测, DataDome检测, hCaptcha, HTTP状态码, Imperva检测, JavaScript库, Kasada检测, MITM代理, Node.js库, PerimeterX检测, reCAPTCHA, TCP/UDP/TLS指纹, Turnstile, WAF, Web安全, 代理检测, 反机器人, 反爬虫, 命令控制, 挑战检测, 数据可视化, 数据采集, 浏览器自动化, 爬虫工具, 网络安全, 自动化绕过, 蓝队分析, 请求分析, 防御探测, 隐私保护, 验证码识别