跳到正文

开源的 puppeteer-extra-plugin-stealth 替代方案

给 Puppeteer 加装规避脚本,stealth 插件仍是安装量最大的方式,每周下载量约 840,000 次,但它自 2023 年 3 月以来就没有发布过新版本。每个规避脚本都是原版 Chrome 上的 JavaScript 补丁,而 JavaScript 补丁会自我暴露。Clearcote 则在引擎中原生地设置这些值。

puppeteer-extra-plugin-stealth 是什么?

puppeteer-extra-plugin-stealth(由 berstend 开发)是一组 JavaScript 规避模块,在页面脚本运行之前通过 page.evaluateOnNewDocument 注入。每个模块修补一个破绽:navigator.webdriver、插件、chrome.runtime、WebGL 厂商、iframe、编解码器等等。它采用 MIT 许可,极受欢迎,npm 周下载量约 840,000 次,其思路也被移植到了 playwright-stealth 和 selenium-stealth。

它实际上也已无人维护:最后一个 npm 版本(2.11.2)发布于 2023 年 3 月,仓库自 2024 年年中以来就没有变动。而结构上的局限在此之前就已存在。这些都是原版引擎上的 JavaScript 覆盖,而覆盖会通过 Function.prototype.toString、被改动的属性描述符,以及在补丁未生效的 Web Worker 或跨域 iframe 中重新读取而暴露。它不修改原生值,不触及 TLS 或 HTTP/2,也不处理 Runtime.enable 这个 CDP 泄露。它自己的 README 也承认,要堵住所有检测无头 Chromium 的途径,很可能是做不到的。

Clearcote 与 puppeteer-extra-plugin-stealth 对比

功能Clearcotepuppeteer-extra-plugin-stealth
实现方式 引擎层面的 C++ 补丁:原生值 按文档注入的 JavaScript 规避脚本
可被检测的痕迹 无:所有 realm(页面、worker、iframe)中都是原生值 可通过 toString、属性描述符、worker 和 iframe 重新读取发现
TLS / 网络层一致性 跟随所声明的 Chrome(JA3/JA4 + HTTP/2) 未处理
框架 Playwright 与 Puppeteer(Python、Node、.NET) Puppeteer(Node);Playwright 可用 playwright-extra
维护状态 活跃 最后一次发布于 2023 年 3 月
许可证 开源版构建:BSD-3 MIT
费用 开源版构建免费;最新构建凭 GitHub 免费使用 免费开源

对比整理于 2026年9月。puppeteer-extra-plugin-stealth 的许可方式:开源(MIT);细节可能会变化,请以其项目的最新信息为准。

团队为什么选择 Clearcote

原生实现,而非覆盖

stealth 插件的每个规避脚本都是检测方能抓到的 JavaScript 覆盖。Clearcote 在引擎中设置这些值,读起来就是原生值,也就没有覆盖可找。

跨 realm 一致

应用在页面上的 JavaScript 补丁,在 Web Worker 和跨域 iframe 中会出现不一致。引擎层面的值处处一致,从而消除了这一类破绽。

网络层

该插件无法触及 TLS 或 HTTP/2。Clearcote 的握手跟随所声明的 Chrome 版本,因此网络层的表现与 JavaScript 一致。

持续维护,经过验证

Clearcote 每次发布都会用公开测试进行检验。该插件的规避脚本停留在 2023 年初,而 Chrome 此后已经前进了几十个版本。

什么情况下 puppeteer-extra-plugin-stealth 可能更合适

  • 你已经在用 Puppeteer,想用一行代码为检测宽松的目标加上一整套规避脚本。
  • 你需要一个 MIT 许可的方案,直接接入现有的 Node 爬虫。
  • 对于公开测试页和较老的检测手段,它上手快,有时也够用。

常见问题

puppeteer-extra-plugin-stealth 还在维护吗?

已不再积极维护。最后一个 npm 版本 2.11.2 发布于 2023 年 3 月,仓库自 2024 年 7 月以来也没有更新。它仍然可以安装,使用量也很大,但其规避脚本已经跟不上 Chrome 的步伐。

为什么 JavaScript stealth 补丁会被检测到?

因为它们是对真实函数的覆盖。检测方可以把函数转成字符串(原生函数显示 [native code],覆盖函数则会暴露自己的源码),检查属性描述符,或者在补丁没有生效的新 iframe 或 Web Worker 中重新读取该值。引擎层面的修改让值在任何地方都是原生的,从而避免了这个问题。

Clearcote 和 stealth 插件有什么不同?

该插件向原版 Chrome 注入 JavaScript 规避脚本;Clearcote 是修改版 Chromium,这些值在引擎中就是原生的,在 worker 和 iframe 之间保持一致,还有该插件无法触及的 TLS/HTTP-2 身份画像。

有 Playwright 版本吗?

有:playwright-extra 可以在 Node 中加载同一个插件,playwright-stealth 则把它移植到了 Python。两者都沿用同样的 JavaScript 覆盖设计。

相关阅读

问答Why does Function.toString() reveal a hooked function?Calling toString() on a native function returns “[native code]”; an override returns its own source instead — so detectors stringify APIs to catch JavaScript spoofs.对比Clearcote 与 playwright-stealth 对比在 Python 中给 Playwright 加上 stealth 能力,playwright-stealth 是最快的办法:套一层包装,每个页面就会获得一组 JavaScript 规避脚本。但这些规避脚本只是原版浏览器上的覆盖,连它的维护者都称其为概念验证。Clearcote 则直接在引擎中原生地设置这些值,页面找不到任何覆盖。研究Coherence over camouflage: why a plausible identity beats a hidden oneMost stealth tooling tries to hide. The signals that survive scrutiny don't hide — they agree with each other.对比Clearcote 与 Camoufox 对比Camoufox 是一款做得很好的开源指纹浏览器,基于 Firefox。Clearcote 把同样的引擎层面思路用在 Chromium 上,让你的自动化呈现的是约 69% 的网民实际在用的浏览器,而不是只有约 3% 的人在用的那一款。对比Clearcote 与 CloakBrowser 对比CloakBrowser 是一款能力扎实的引擎层面 stealth Chromium,用户众多,但其打过补丁的二进制文件是闭源的。Clearcote 同样工作在引擎层面,运行更新的 Chromium,并提供开源版构建,其中每个补丁你都能阅读并重新构建。对比Clearcote 与 undetected-chromedriver 对比undetected-chromedriver 每月下载量仍有约 2M 次,但它的最后一个版本发布于 2024 年 2 月。它在原版 Chrome 上隐藏 Selenium/ChromeDriver 的痕迹,却完全不涉及指纹或网络层。Clearcote 在引擎中同时修改这两者。

试试这款开源 Chromium 替代方案

免费开源,可直接接入 Playwright 与 Puppeteer,一直到 TLS 握手都保持一致。

通过 GitHub 可免费使用一个浏览器。无需信用卡。