跳转到内容
Tutorial

使用 TLS 指纹检测 AI 抓取工具,而不是用户代理

| 6 min read

GPTBot、ClaudeBot 和 PerplexityBot 现在会欺骗 Chrome 用户代理超过 30% 的请求。 JA4 TLS 指纹识别在握手时捕获它们,甚至在您的源解析标头之前。

Network cables representing TLS handshakes and bot fingerprinting at the edge
Photo by Thomas Jensen on Unsplash

你的 robots.txt 说 User-agent: GPTBot Disallow: /。 GPTBot 对此表示敬意。 十几条 RAG 管道建在 requests, httpx,而标题中带有 Mozilla/5.0 字符串的无头 Chrome 则不会。 来自大型发布商的最新流量样本显示,30% 到 60% 的“Chrome”点击来自非浏览器 TLS 堆栈。 用户代理是剧院; TLS Client Hello 是事实。

JA4 是 FoxIO 于 2023 年发布的 TLS 指纹格式,它对客户端在不分叉其 TLS 库的情况下无法轻易更改的 Client Hello 部分进行哈希处理:密码顺序、扩展、ALPN、签名算法。 真正的 Chrome 和 Python httpx 无论用户在 User-Agent 标头中写入什么内容,脚本的指纹看起来都不相同。 这篇文章展示了如何在边缘读取 JA4,通过 /v1/tls/fingerprint,并在请求到达您的来源之前采取行动。

JA4长啥样

JA4 是由下划线连接的三个部分。 第一部分编码 TLS 版本、ALPN 和密码计数。 第二个哈希密码套件。 第三个哈希扩展和签名算法。 典型的 Chrome 124 指纹:

t13d1516h2_8daaf6152771_e5627efa2ab1

一条蟒蛇 httpx 0.27 客户端:

t13d1517h2_8daaf6152771_b1ff8ab2d16f

相同的 TLS 1.3、相同的 ALPN h2、相似的密码哈希,但扩展哈希不同,因为 httpx 与 BoringSSL 协商不同的延期顺序。 第三部分是鉴别器,可以捕获冒充 Chrome 的爬虫。

对指纹进行分类

将 JA4 发送至 /v1/tls/fingerprint 并获取客户身份、判决和置信度分数。 端点维护按客户端库和版本范围索引的指纹语料库。

Python 的示例响应 httpx JA4以上:

verdict 字段是您需要在边缘采取行动的唯一部分。 browser_match 是“这是任何已知的真实浏览器版本”的布尔快捷方式,并且是用于监视的有用分母。

Cloudflare Worker,30 行

Cloudflare 公开了 JA4 request.cf.ja4 对于启用了 TLS 指纹识别的任何区域(Pro 计划免费,可通过免费层上的 Workers 标头获得 tls_client_hello 要求)。 将判决缓存一小时,因为指纹在客户端库更新之前保持稳定。

缓存使 API 调用率与唯一指纹成正比,而不是与请求量成正比。 典型站点每天看到的不同 JA4 数量少于 5,000 个,因此在稳定状态下上游调用很少见。 Workers 在冷启动时隔离驱逐 Map,因此缓存在实践中是有限的; 对于高基数起源,交换为 caches.default 具有 1 小时 TTL。

Express 中也有同样的情况

如果您的 CDN 在标头中转发 JA4(Fastly 的 fastly-tls-ja4, Cloudflare 的 cf-ja4,或者您自己的来自上游 Worker 的处理程序),源处理程序是一个瘦中间件。

根据判决决定行动

三种响应路径涵盖了大多数情况。 不要阻塞未知的桶; 你会因为新颖的浏览器版本而烧死真正的用户。

402 状态码是故意的。 它向铲运机操作员指出 /api 获得许可而不是告诉他们他们被屏蔽了,这就是让你进入“出版商对人工智能怀有敌意”名单的原因。 友好的版本会让您偶尔成为 API 客户,而不是 Twitter 上的一堆人。

衡量影响

在翻转任何块之前,请记录 JA4 和 User-Agent 一周。 重要的图表是“User-Agent 声称是 Chrome 但 JA4 说 scraper 的请求份额”。 大多数团队的比例为 15% 到 40%。 如果您发送仅限用户代理的阻止列表,则该数字就是您的爆炸半径。 启用基于 JA4 的门控后,同一张图表应显示份额在数小时内降至个位数。

botoi 上的免费套餐涵盖每天 1,000 个指纹分类(5 个请求/分钟突发)。 与缓存配合使用,对于任何中小型网站来说,这都有足够的空间。 获取钥匙 botoi.com/api/signup

端点参考: TLS 指纹 API。 有关的: 当 AI 代理是您最频繁的调用者时,API 可观察性

FAQ

为什么用户代理不再工作?
AI 训练爬虫及其众多模仿者(真正的机器人、灰色市场抓取工具、客户构建的 RAG 管道)越来越多地发送“Mozilla/5.0 ... Chrome/120”,因为发布商添加了 robots.txt 和 User-Agent 块。 TLS 握手由客户端库(Go net/http、Python httpx、Node undici、headless Chrome)设置,并且在不重写客户端的情况下更难伪造。
JA4是什么?
JA4 是 FoxIO 在 2023 年发布的 TLS Client Hello 指纹格式。它将协商的 TLS 版本、密码套件、扩展、ALPN 和签名算法哈希为 t13d1516h2_8daaf6152771_e5627efa2ab1 等字符串。 共享 JA4 的两个客户端正在使用相同的 TLS 堆栈,无论其 User-Agent 标头声明如何。
这会阻止真实用户吗?
不会。Real Chrome、Safari 和 Firefox 都有众所周知的 JA4,它们仅在浏览器版本更新时才会更改。 botoi 端点标记与抓取库(curl、wget、requests、httpx、Go default、Node undici、带有反检测补丁的无头 Chrome)相关的指纹。 您允许浏览器指纹并对其余部分进行质询或速率限制。
爬虫能恶搞JA4吗?
是的,通过努力。 像curl-impersonate和Python tls_client库这样的工具可以模仿Chrome JA4。 到 2026 年,欺骗者仍然只占抓取流量的一小部分,一旦欺骗者 ID 公开,你就可以像任何其他指纹一样对其进行分类。 JA4 提高了从一个 HTTP 标头到分叉 TLS 库的成本; 这个成本足以阻止长尾。
如何获取边缘指纹?
Cloudflare 通过 cf.botManagement 在请求对象上公开 ja4,并通过 request.cf.tlsClientHelloLength 和 ja4 在工作人员上公开 ja4。 Fastly 通过 fastly.tls 公开它。 AWS CloudFront 尚未直接公开它; 通过 CF Worker 路由或使用 botoi /v1/tls/fingerprint 端点和原始 Client Hello。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。