背景

AI Agent 要想真正「上网」,浏览器自动化是绕不开的环节。但市面上的主流方案各有缺点:

  • Headless Chrome / CDP —— 早就被 bot 检测厂商标记殆尽。navigator.webdriver、JA3 指纹、CDP 泄漏等信号一碰就封,429 和 WAF 挑战页接踵而至。
  • Browserbase —— 注册必须绑手机号,且不接受中国大陆号码,第一道门槛就把人挡在外面。
  • Browser Use —— 月费 $40 到 $100 不等,只想试试水的开发者得先交一笔不小的学费。
  • Firecrawl —— 擅长抓取页面和结构化提取,但点击、输入、滚动这类交互操作不是它的主场。

于是问题来了:有没有一种本地即可运行、无需订阅、又能过得去现代反 bot 检测的方案?

核心内容

一、Headless Chrome 为何总吃 429

Chrome 的落败不是哪个单一漏洞,而是整套信号叠在一起被识别了:

  1. navigator.webdriver 强制暴露
    W3C WebDriver 规范要求自动化浏览器必须设置 navigator.webdriver = true,简直是主动亮身份。[1]

  2. JavaScript 环境不对劲
    Headless Chromium 在 pluginspermissions、屏幕与视口对齐等细节上和真实浏览器有微妙差异,可被模板攻击精准识别。[2][3]

  3. Stealth 插件的悖论
    puppeteer-extra-plugin-stealth 虽能补一些漏洞,但每次注入的补丁顺序和内容都一模一样,反 bot 系统已经把「这套补丁本身」当成了指纹。[4]

  4. TLS / JA3 指纹锁定
    Chromium 用的是 BoringSSL,其 JA3 哈希在数据中心 IP 的加持下很容易被标记为自动化流量。[5]

  5. CDP 运行时泄漏
    远程调试端口 9222 的存在、以及 chrome-extension:// 探针,都会让网页嗅出「这浏览器被远程控制了」。这些检测方法在实际项目中已被多个 bot 防御商业化应用。

一句话:没有修补的 Chromium 自动化,在现代 Web 面前几乎是透明的。

二、Camoufox 为何难被识别

Camofox 不是在 Chrome 外面套一层 JavaScript shim,而是直接对 Firefox Gecko 引擎做 C++ 级修补

  • navigator.webdriver 的移除发生在 Navigator.cpp 原生代码层,JavaScript 看不到任何重写痕迹。
  • hardwareConcurrency、WebGL vendor/renderer、AudioContext 采样率、屏幕几何信息、WebRTC 硬件枚举等,都从引擎内部直接 spoof。
  • 网络栈沿用 Mozilla NSS,TLS 指纹与成千上万普通 Firefox 用户没有区别。
  • Playwright 只负责「启动」这个被修补过的 Firefox 二进制文件,而不是调用它自带的 Chromium。

所以页面看到的,不是一个「被抹去自动化标记的浏览器」,而是一个指纹与真实用户难以区分的 Firefox 实体。[7]

三、本地免费,交互无阻

Camofox 以 REST API 形式跑在本地(默认 http://localhost:9377)。对于 Hermes Agent 用户来说,这是透明的:只要启用了 browser 工具集,browser_navigatebrowser_clickbrowser_type 等操作会自动走这个本地端点,无需手写任何 curl 封装。

除了底层的反检测能力,它还提供了 Agent 友好的功能:

  • Accessibility Snapshot —— 返回带稳定元素引用(e1, e2…)的页面结构,体积比原始 HTML 小约 90%。
  • 点击与输入 —— 通过元素引用直接操作,不用手写脆弱的 CSS selector。
  • 搜索宏 —— @google_search@youtube_search 等快捷导航。
  • 会话隔离 —— 按 userId / sessionKey 分离 Cookie 与 Storage,避免状态串扰。

最重要的是,它完全免费。一条 npm install && npm start 就能跑起来。

实践验证

近日对 Camofox 进行了三项实测,结果如下:

测试项 结果 说明
Hacker News 首页抓取 ✅ 通过 成功提取 Top 10 帖子标题、分数、评论数
Aeon 长文阅读 ✅ 通过 复杂 DOM 与订阅弹窗未造成阻塞,完整获取文章元数据
图片 CDN 批量下载(10 张) ✅ 通过 snapshot 直接暴露 CDN 链接,curl 秒级下载完成

对比之下,此前用 Headless Chrome 和远程 CDP 连接同一批站点时,几乎全是 429。Camofox 在零额外配置的情况下直接通过,差异很明显。

运维贴士:macOS 开机自启

对于 Hermes Agent 用户来说,最好让 Camofox 随系统启动而运行,省得每次手动开终端。macOS 下可通过 LaunchAgent 实现:

<!-- ~/Library/LaunchAgents/ai.hermes.camofox.plist -->
<!-- 请将 /Users/mac/camofox-browser 替换为你的实际路径 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ai.hermes.camofox</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/bin/node</string>
        <string>/Users/mac/camofox-browser/server.js</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/Users/mac/camofox-browser</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

加载命令:

launchctl load ~/Library/LaunchAgents/ai.hermes.camofox.plist

日常可配几个 Fish alias 以便查看状态:

alias camofox-status 'lsof -i tcp:9377 2>/dev/null && echo "running" || echo "stopped"'
alias camofox-logs   'tail -f ~/.hermes/logs/camofox.log'
alias camofox-restart 'launchctl unload ~/Library/LaunchAgents/ai.hermes.camofox.plist; sleep 1; launchctl load ~/Library/LaunchAgents/ai.hermes.camofox.plist'

总结

关键要点:

  • Headless Chrome 的检测面太广,WAF 与 bot 防御系统已能轻易识别其自动化信号。
  • Browserbase、Browser Use、Firecrawl 等云方案虽强,但或受注册限制、或价格不菲、或场景不符。
  • Camoufox 以 C++ 级 Firefox 补丁实现了低检测率的自动化浏览,本地零成本即可运行。
  • 配合 LaunchAgent 可实现 macOS 开机自启,让 Hermes Agent 随时拥有可靠的浏览器能力。

适用场景:

  • 需要频繁进行交互式网页操作的本地 Agent 工作流
  • 对订阅成本敏感、或无法注册海外云服务的开发者
  • 需要绕过中等强度反 bot 检测(Cloudflare、Fortuna 等)的自动化任务

不适用场景:

  • 需要大规模分布式并发、或企业级 SLA 保障的生产环境(仍需评估云浏览器)
  • 目标站点采用高级行为生物识别(鼠标轨迹、按键动力学分析)的场景

参考

  1. W3C WebDriver Specification — Navigator WebDriver Attribute. https://w3c.github.io/webdriver/#navigator-webdriver-attribute
  2. Vastel, A. "Detecting Chrome Headless / new techniques." 2018. https://antoinevastel.com/bot%20detection/2018/01/17/detect-chrome-headless-v2.html
  3. Schwarz et al. "JavaScript Template Attacks." USENIX Security 2019. https://www.usenix.org/conference/usenixsecurity19/presentation/schwarz
  4. camofox-browser README — "Stealth plugins become the fingerprint." https://github.com/jo-inc/camofox-browser
  5. Althouse et al. "TLS Fingerprinting with JA3 and JARM." Salesforce Engineering. https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-jarm/
  6. 实际项目中的 CDP 探针与远程调试端口检测实践。
  7. Camoufox Official Documentation. https://camoufox.com