camofox-browser :不会被屏蔽的OpenClaw浏览器插件


这是一个能让你的自动代理访问那些通常屏蔽自动化程序的网站(比如 X、Product Hunt、亚马逊等等)的插件。它是从 OpenClaw 项目中提取出来的,OpenClaw 用它来进行服务器端的网页浏览。

它是什么?
它是一个基于 Camoufox 的无头浏览器服务器。Camoufox 是一个 Firefox 的分支版本,它的特别之处在于:它在 C++ 底层代码层面伪造浏览器指纹,而不是在 JavaScript 层面。这让它比标准的无头浏览器有更高的几率通过检测系统的检查。

为什么需要它?
如果你的 OpenClaw 运行在 Mac Mini 上,内置的浏览器工具可以驱动一个真实的浏览器窗口,网站会正常对待它。
但在 VPS 或远程服务器上,你只能用无头 Chrome 或纯 HTTP 请求——这两者都经常被屏蔽,因为被识别为机器人或攻击而被屏蔽。

Camofox 为远程服务器解决了这个问题,并且对于自动代理的工作流来说,它也比桌面浏览更快。

核心理念
这个项目不是独立浏览器,而是:
以 Camoufox(一个能够规避反爬虫 / 反自动化检测的 Firefox 分支)作为引擎
包装成一个 REST API 服务
让外部程序/AI 智能体可以通过简单的 HTTP 接口发起浏览器动作
包括打开标签页、抓取内容、点击、输入文字、截图等操作

因此它适用于需要自动浏览真实网站、又要避免被常见 bot 检测系统(如 Cloudflare / Akamai / Google Bot 管理)识别的操作场景。


主要特性

️‍♂️ C++ 级别的杀 bot 引擎

项目底层用的是 Camoufox 浏览器,该浏览器:

  • 深度改写 Firefox 引擎中的指纹相关信息(如 userAgent、WebGL、WebRTC、屏幕尺寸等)
  • 在 C++ 层面 spoof,而不只是简单的 JavaScript 注入
  • 避免常见浏览器自动化检测(多数检测依赖 JS 可探测的特征)


典型使用场景
AI 浏览任务
当 AI 需要访问搜索引擎、视频平台、商品页面等时,它可以通过这个服务模拟真实浏览器行为。

自动化抓取、表单填充
代替 Playwright/Headless Chrome,在需要规避识别保护逻辑的场景下表现更强。

浏览器自动化机器人
通过 REST API 外部控制,可嵌入各种语言与任务调度系统。


这篇文章会解释为什么这很重要以及它是如何工作的。



怎么安装?
openclaw plugins install @askjo/camofox-browser

它提供了这些工具:camofox_create_tab, camofox_snapshot, camofox_click, camofox_type, camofox_navigate, camofox_scroll, camofox_screenshot



问题:为什么标准方法会被屏蔽?
Playwright 和 Puppeteer 在合作的网站上运行良好。但如果你把它们指向 Google、亚马逊或任何受 Cloudflare 保护的网站,请求不是被限速——而是被直接拒绝。

检测系统会通过数百个维度来识别浏览器指纹:WebGL 渲染器字符串、音频上下文采样率、硬件并发数、屏幕几何尺寸、WebRTC IP 泄漏、电池 API 的怪异之处、语音合成声音列表等等。

标准解决方法是使用“隐身”插件:修补 navigator.webdriver,覆盖一些属性。这在你的修补手法本身也成为指纹信号之前是有效的——而面对一个认真的检测系统,这迟早会发生。

根本问题在于:任何你在 JavaScript 中覆盖的属性,都能在 JavaScript 中被检测出来。 属性描述符、原型链和函数的 toString() 都会暴露你覆盖的痕迹。



解决方案:在 C++ 底层伪造
当 JavaScript 调用 navigator.hardwareConcurrency 时,它背后是 Firefox 中的一个 C++ 实现。如果你在 JS 中覆盖它,网页可以检测到这种不一致——属性描述符看起来不对、原型不匹配、函数不是原生代码。但如果你改变 C++ 的返回路径,JavaScript 看到的就是伪造的值,就像它是真实的一样。

来自 Camoufox 文档
> 在 Camoufox 中,数据在 C++ 实现层被拦截,使得这些更改无法通过 JavaScript 检查来检测。

camofox-browser 将这个引擎包装在一个为程序化使用设计的 REST API 中。

补丁遵循一个简单的模式:检查配置,如果设置了伪造值就返回它,否则就执行正常的实现。来自 源码示例

cpp
double nsGlobalWindowInner::GetInnerWidth(ErrorResult& aError) {
  if (auto value = MaskConfig::GetDouble("window.innerWidth"))
    return value.value();
  FORWARD_TO_OUTER_OR_THROW(GetInnerWidthOuter, (aError), aError, 0);
}

这个模式覆盖了:窗口几何尺寸、navigator 字段、屏幕详细信息、WebGL 参数(通过 gl_mask.h 进行 GPU 指纹伪造)、WebRTC IP 屏蔽(rtc_mask.h)、音频指纹、自动批准的地理定位、电池 API 和语音合成声音。

Camoufox 还在 mouse_trajectory.h 中包含了基于贝塞尔曲线的鼠标移动轨迹模拟——因为检测系统越来越关注你如何交互,而不仅仅是你发送了什么数据。

所有这一切都在 JavaScript 看到之前,在 C++ 层就被拦截处理了。



对于 AI 代理的优化:可访问性快照
一个谷歌搜索结果页面的 HTML 大约有 500KB。同一页面的可访问性树大约只有 5KB。当消费者是一个有上下文窗口限制的大语言模型时,这 100 倍的缩减非常重要。

因此,camofox-browser 提供:
*   可访问性快照,而不是 HTML。
*   使用元素引用(如 e1, e2, e3),而不是脆弱的 CSS 选择器。
*   为常用网站(google.h, amazon.h, x.h)提供预设宏。

基本使用示例

bash
# 创建标签页,获取快照,通过引用点击
curl -X POST http://localhost:9377/tabs \
  -d '{"userId": "agent1", "sessionKey": "task1", "url": "https://google.com"}'

curl "http://localhost:9377/tabs/TAB_ID/snapshot?userId=agent1"

curl -X POST http://localhost:9377/tabs/TAB_ID/click \
  -d '{"userId": "agent1", "ref": "e3"}'



警告与最佳实践:IP 地址问题
这仍然是拼图中最难的一块。大多数反机器人系统会检查你的 IP 是住宅IP还是数据中心IP,而数据中心IP段是众所周知的。你可以用ISP代理或住宅代理来解决,但这涉及到不稳定的基础设施工作。Camofox 在这方面并不总是成功,但你的成功率比直接用 Playwright 要高。

我们在 OpenClaw 中通过 macOS 应用程序构建了一个基于本地 Safari 的堆栈来绕过这个问题——使用你的真实浏览器、真实 IP 和真实 Cookie。效果很好,但代价是可能会受到 WebView 特有方式的屏蔽。没有完美的解决方案。

要点:C++ 伪造处理的是浏览器身份,而不是 IP 身份。大多数反机器人系统会同时关联两者:同一个指纹从 100 个不同 IP 访问看起来可疑;100 个不同指纹从同一个 IP 访问看起来也可疑。最佳实践是让指纹与 IP 一起轮换,但在一个会话内保持指纹稳定。 Camoufox 通过环境变量为每个会话配置指纹,这很适合隔离的代理会话。



如何开始?
bash
npm install @askjo/camofox-browser
# 或者从源码安装
git clone https://github.com/askjo/camofox-browser
cd camofox-browser && npm install && npm start

# 检查健康状态
curl http://localhost:9377/health

# 然后就可以像上面那样使用了

该仓库是 MIT 许可证,目前还处于早期阶段——可能会有 bug。欢迎贡献代码,如果你遇到任何问题,请在 GitHub 上提交问题。我们希望 OpenClaw 社区觉得它有用。