返回概览 更多文章

你会被识别为机器人吗?测试你的浏览器是否泄露自动化特征

正在扫描你的浏览器以查找自动化特征……

如果你会自动化操作浏览器,无论是用于爬虫、QA 测试还是账号管理,有一个问题决定了你是能顺利通过还是撞上一个 CAPTCHA:你的浏览器看起来像真人吗?本页上的这个小工具,会把这个问题逐项抛给你当前的浏览器。

几年前,一行 JavaScript 就能给出答案。Selenium、Puppeteer 和 Playwright 都会把 navigator.webdriver 设为 true,网站只要读回这个值就行。如今这项检查几乎抓不到任何人,因为每一套认真的自动化方案都会在页面加载前把这个标志改回去。检测手段早已向前发展。本文就来梳理它走到了哪一步。

简而言之:机器人检测早已不再是单一的一个标志,而是一整套堆叠起来的信号。那些容易暴露的破绽(webdriver、带 headless 字样的 User-Agent)已经作古。真正持久的信号藏在渲染管线和 DevTools 通道里,而且隐身插件越是卖力去掩盖那些容易暴露的破绽,它打的补丁本身就越容易被认出来。

那些经典破绽,以及它们为何失效了

以下这些检查,是每一篇 2019 年的教程至今仍在教的,也是每一款现代隐身插件都能破解的:

  • navigator.webdriver 被 Selenium、Puppeteer 和 Playwright 翻转为 true,又被每一款隐身工具用一行代码改回 false
  • 带 “HeadlessChrome” 字样的 User-Agent。 老版本的 headless Chrome 会在 User-Agent 字符串里自报家门。稍微用心的人都不会把它留在里面。
  • 空的插件列表和语言列表。 这些是 headless 的默认状态,一行设置就能修好。真正的桌面版 Chrome 自带 PDF 插件,并且始终至少上报一种语言。
  • 缺失的 window.chrome 对象。 某些自动化构建版本会把它剥离掉,这在一个自称是 Chrome 的浏览器上显得很奇怪。

这些如今都拦不住一个像样的机器人了。它们之所以还留在测试里,是因为能瞬间揪出那些粗心大意的,也因为真正的浏览器不费吹灰之力就能通过。

如今检测真正发生在哪里

那些依然有效的检查,并不是些表面的标志。它们是浏览器被驱动方式所带来的必然后果,这让它们难以被补丁抹去。

DevTools 通道。 Puppeteer 和 Playwright 通过 Chrome DevTools Protocol 来控制 Chrome,而为了完成工作,它们启用了其中的 Runtime 域,这个域会悄悄序列化每一个被交给控制台的对象。这种序列化会读取一些别的东西根本不会去读的属性。记录一个 Error 对象,并在它的 stack 属性上设个陷阱,自动化通道就会露出马脚,无论表层的标志被打磨得多么仔细。这是最难隐藏的一个信号。它在你此刻只是开着 DevTools 时也会触发,这也是小工具会特别提示这一点的原因。

软件渲染。 服务器上的 headless 浏览器没有 GPU,于是它会退回到软件渲染器:Chrome 上用 SwiftShader,Linux 上用 llvmpipe。WebGL 的渲染器字符串会把这一切明明白白地写出来。真正的笔记本会上报 Intel、Apple、AMD 或 NVIDIA 的 GPU,而 “Google SwiftShader” 意味着一台服务器在假扮成它们。我们的 canvas 指纹文章 出于别的原因读取的,也是同一个渲染器字符串。

被打过补丁的原生函数。 这就是隐身工具核心处的悖论:为了隐藏 navigator.webdriver,插件必须去覆盖它,而一个被覆盖过的内置函数,在脚本检视它的源码时就不再返回 [native code] 了。隐身插件动过的每一个函数,都会变成这个插件存在的证据。补丁打得越彻底,能被找到的东西就越多。那些伪造 canvas 或 WebGL 读数的隐私扩展也会触发同一项检查,哪怕你从不自动化任何东西,这一点也值得知道。

引擎一致性。 一些细小的内部常量,比如 eval 的确切源码长度,在每个 JavaScript 引擎里都是固定的。声称自己是 Chrome,而你的引擎常量却另有说法,那 User-Agent 就被戳穿成了一身戏服。这跟我们在 一个浏览器,五种操作系统声明 中描述的操作系统矛盾陷阱、以及在 你的 User-Agent 在撒谎 中描述的浏览器版本矛盾陷阱,是同一回事。

行为,隐身工具够不到的那一层

以上所讲的都是浏览器静止时的样子。没有任何插件能给它打补丁的信号,是页面打开之后发生的事。反机器人系统会观察交互的”物理规律”:一次点击之前没有任何鼠标移动,一个光标沿着一条完美的直线滑动,滚动时毫无缓动,按键之间以机器般的规律间隔。人类的”噪声”是以一致的方式出现的。而脚本的”干净”,则是人类永远不会有的那种干净。一份静态指纹可以一次性伪造出来;行为却必须在整个会话期间都表演得令人信服。

本页上的测试只是静态的,因为行为评分需要一个模型和一台服务器。但行为正是商业检测的发展方向,也正因如此,把每一个标志都打上补丁仍然不够。

Cloudflare 和 DataDome 如何给你打分

像 Cloudflare、DataDome、Kasada 和 HUMAN 这样的商业反机器人系统,不会依赖任何单一的检查。它们把上面这些 JavaScript 信号,与网络指纹(TLS 握手和 HTTP/2 行为,这些是 JavaScript 看不到也改不了的)、IP 信誉和行为评分结合起来,在毫秒之间把这一切融合成一个分数。DataDome 甚至会为它所保护的每一个站点单独训练一个模型。你要过的不是一场考试。你要做的是在所有考试上同时看起来一致。

这也是任何浏览器内测试(包括这一个)诚实的局限所在。它看到的是客户端那一半。而网络那一半,是在服务器端、在你的 JavaScript 还没跑一行代码之前就被测量好的。

AI 智能体正在改变这个问题

最新的一批机器人,是 AI 浏览器智能体。像 Claude 的 computer use、OpenAI 的 Operator 和 Browser Use 这样的工具,会驱动真实的浏览器替人完成任务,而它们能轻松滑过那些经典检查,因为它们底层往往就是普普通通的 Chrome。不过那些持久的破绽依然适用。它们是通过 DevTools Protocol 驱动的,经常在带软件 GPU 的服务器上以 headless 方式运行,而且它们的交互时序是机器般干净的。检测厂商正在悄悄地从”这是不是机器人?“转向”这是一个真人、一个善意的机器人,还是一个自主智能体?“,而他们用来回答这个问题的,恰恰就是本页小工具里的那些信号。

到底该怎么做

  1. 绝不要打一半的补丁。 一个明显被动过手脚的浏览器,是一个比诚实浏览器更罕见、也更刺耳的信号。那些一个接一个去修标志的隐身插件,正好制造出了反机器人系统苦苦追猎的那种证据。如果你没法让整套堆栈保持一致,那么多打补丁只会让情况更糟。
  2. 在依赖你的方案之前先测试它。 在它让你损失一个账号或一整天的爬虫工作之前,把你运行的东西对着本页、以及 完整浏览器扫描 跑一遍。你自己发现的破绽,是你能够修复的破绽。
  3. 如果你要管理多个身份,请使用一款从构造上就保持一致的浏览器。 真实的渲染引擎,真实的 GPU 输出,原生函数保持原封不动,以及一份从 WebGL 字符串到字体列表都自洽的指纹。这正是防关联(anti-detect)浏览器存在的意义。Incogniton 会把每一个配置文件都构建成一个真实、自洽的浏览器,让这些信号彼此吻合,而不是相互矛盾。

自动化浏览器和防关联浏览器都是合法的工具,有大量正当的用途,从 QA 测试、广告核验到管理商业账号。某个具体站点是否允许使用它们,取决于该站点的规则,所以在大规模行动之前,先了解清楚这些规则。

想看看你自己的浏览器扛不扛得住?本页上的小工具会检查客户端的自动化信号,而 完整浏览器扫描 则会连同 WebRTC 泄露测试、指纹哈希,以及平台和版本的交叉核对一起运行。

Incogniton 徽标

提升你的隐私保护

箭头