今天在 GitHub Trending 上看到一个非常有意思的项目:camofox-browser,一个专为 AI Agent 设计的反检测浏览器服务器,基于 Camoufox 引擎,在 C++ 层面实现指纹伪装,让 Agent 能稳定地浏览真实网页。
一、项目概述
camofox-browser 是由 Jo Inc 团队(askjo.ai 背后的团队)开源的项目,核心解决一个问题:AI Agent 需要浏览真实网页,但 Playwright 会被封锁、Headless Chrome 会被指纹识别、隐身插件反而成为识别特征。
项目基于 Camoufox——一个在 C++ 实现层面进行指纹伪装的 Firefox 分支。camofox-browser 将这个引擎封装为 REST API,专为 AI Agent 场景设计:
- C++ 级反检测:
navigator.hardwareConcurrency、WebGL 渲染器、AudioContext、屏幕几何、WebRTC 等全部在 JavaScript 执行前就被伪装 - 元素引用系统:稳定的
e1、e2、e3标识符,替代脆弱的 CSS 选择器 - Token 高效:无障碍快照比原始 HTML 小约 90%
- 轻量运行:空闲时内存仅约 40MB,适合树莓派、5 美元 VPS 等轻量设备
二、技术原理
架构设计
Browser Instance (Camoufox)
└── User Session (BrowserContext) - 隔离的 cookies/storage
├── Tab Group (sessionKey: "conv1")
│ ├── Tab (google.com)
│ └── Tab (github.com)
└── Tab Group (sessionKey: "conv2")
└── Tab (amazon.com)
整体架构分为三层:浏览器实例 → 用户会话(BrowserContext)→ 标签页分组。每个用户拥有独立的 cookies 和存储空间,会话间完全隔离。会话 30 分钟不活动自动过期,浏览器本身在 5 分钟无活动后自动关闭,下次请求时自动重启。
核心技术选型
| 技术选型 | 理由 |
|---|---|
| Camoufox (Firefox 分支) | C++ 层面修改指纹,比 JS 层 shim 更隐蔽 |
| Playwright (playwright-core) | 成熟的浏览器自动化协议,支持 Firefox |
| Express 5 | 轻量 REST API 框架 |
| better-sqlite3 | 会话持久化存储 |
| Node.js ≥22 | 原生 ESM 支持 |
反检测原理
传统的隐身方案通常通过 JavaScript shim 覆盖 navigator 属性,但这本身就是一个检测信号——网站可以通过对比 shim 行为与原生行为差异来识别。
Camoufox 的思路完全不同:直接在 Firefox 的 C++ 源码层面修改属性返回值,包括:
navigator.hardwareConcurrency— CPU 核心数- WebGL 渲染器信息 — GPU 厂商和型号
- AudioContext — 音频处理特征
- 屏幕几何参数 — 分辨率、色深
- WebRTC — IP 泄漏防护
这些修改在 JavaScript 引擎执行前就生效,网站无法通过对比 JS 层行为来检测伪装。
元素引用系统
camofox-browser 不返回 HTML,而是返回无障碍快照(accessibility snapshot),每个可交互元素分配稳定引用:
[button e1] Submit [link e2] Learn more [input e3] Search
Agent 通过 e1、e2 这样的引用来操作元素,比 CSS 选择器更稳定——页面 DOM 变化不影响引用,只要元素在无障碍树中的位置不变。
三、安装与快速开始
环境要求
- Node.js ≥ 22
- 首次运行会自动下载 Camoufox 引擎(约 300MB)
从 npm 安装
npx @askjo/camofox-browser
# 默认端口 9377
从源码运行
git clone https://github.com/jo-inc/camofox-browser && cd camofox-browser
npm install && npm start
# -> http://localhost:9377
Docker 部署
# 自动检测 CPU 架构(M1/M2 → aarch64,Intel → x86_64)
make up
# 停止
make down
# 强制重建
make reset
Docker 镜像内置 yt-dlp 和 Camoufox 引擎,开箱即用。
OpenClaw 插件安装
openclaw plugins install @askjo/camofox-browser
安装后可直接使用 camofox_create_tab、camofox_snapshot、camofox_click 等工具。
四、使用方法与实战
基础浏览流程
# 1. 创建标签页
curl -X POST http://localhost:9377/tabs \
-H 'Content-Type: application/json' \
-d '{"userId": "agent1", "sessionKey": "task1", "url": "https://example.com"}'
# 2. 获取无障碍快照(含元素引用)
curl "http://localhost:9377/tabs/TAB_ID/snapshot?userId=agent1"
# -> { "snapshot": "[button e1] Submit [link e2] Learn more", ... }
# 3. 点击元素
curl -X POST http://localhost:9377/tabs/TAB_ID/click \
-H 'Content-Type: application/json' \
-d '{"userId": "agent1", "ref": "e1"}'
# 4. 输入文字
curl -X POST http://localhost:9377/tabs/TAB_ID/type \
-H 'Content-Type: application/json' \
-d '{"userId": "agent1", "ref": "e2", "text": "hello", "pressEnter": true}'
搜索宏
内置 13 个搜索宏,覆盖常用网站:
# Google 搜索
curl -X POST http://localhost:9377/tabs/TAB_ID/navigate \
-H 'Content-Type: application/json' \
-d '{"userId": "agent1", "macro": "@google_search", "query": "best coffee beans"}'
支持的宏包括:@google_search、@youtube_search、@amazon_search、@reddit_search、@reddit_subreddit、@wikipedia_search、@twitter_search、@yelp_search、@spotify_search、@netflix_search、@linkedin_search、@instagram_search、@tiktok_search。
Cookie 导入
支持导入 Netscape 格式的 cookie 文件,实现已认证状态浏览:
# 1. 设置 API Key
export CAMOFOX_API_KEY="$(openssl rand -hex 32)"
# 2. 放置 cookie 文件
mkdir -p ~/.camofox/cookies
cp ~/Downloads/linkedin_cookies.txt ~/.camofox/cookies/linkedin.txt
# 3. 通过 API 导入
curl -X POST http://localhost:9377/sessions/agent1/cookies \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_KEY' \
-d '{"cookies": [...]}'
Cookie 导入默认禁用,必须设置 CAMOFOX_API_KEY 才能启用。最多 500 个 cookie,文件大小限制 5MB,路径遍历攻击会被阻止。
代理与 GeoIP
通过代理路由所有流量,Camoufox 自动根据代理出口 IP 设置对应的语言、时区和地理位置:
# 单一代理
export PROXY_HOST=166.88.179.132
export PROXY_PORT=46040
export PROXY_USERNAME=myuser
export PROXY_PASSWORD=mypass
npm start
# 轮换代理(backconnect 模式)
export PROXY_STRATEGY=backconnect
export PROXY_BACKCONNECT_HOST=gate.provider.com
export PROXY_BACKCONNECT_PORT=7000
npm start
每个浏览器上下文获得唯一的粘性会话,不同用户自动获得不同 IP。
YouTube 字幕提取
curl -X POST http://localhost:9377/youtube/transcript \
-H 'Content-Type: application/json' \
-d '{"url": "https://www.youtube.com/watch?v=VIDEO_ID", "languages": ["en"]}'
优先使用 yt-dlp(快速、无需浏览器),未安装时回退到浏览器拦截方式。
五、常见问题与解决方案
安装时 Camoufox 下载失败
Camoufox 引擎约 300MB,首次安装从 GitHub Releases 下载。如果网络不稳定:
# 方案 1:使用外部 Camoufox 可执行文件
export CAMOUFOX_EXECUTABLE=/path/to/camoufox-bin
npm install
# 方案 2:跳过 postinstall,手动下载
npm install --ignore-scripts
npx camoufox-js fetch
Docker 构建报错
不要直接运行 docker build。Dockerfile 使用 bind mount 引用 dist/ 目录中的预下载二进制文件。始终使用 make up(它会先下载二进制文件再构建)。
Windows 上 make 不可用
使用内置的 PowerShell 脚本:
.\build.ps1 up
.\build.ps1 down
.\build.ps1 reset
会话丢失
会话持久化默认开启,存储在 ~/.camofox/profiles/ 目录。如果需要重置:
# 清除特定用户的存储状态
curl -X DELETE http://localhost:9377/sessions/agent1/storage_state
Tab 达到上限
默认每个会话最多 10 个标签页。达到上限时,最旧/最少使用的标签页会被自动回收,不会报错——适合长时间运行的 Agent 会话。
Telemetry 隐私顾虑
所有遥测数据经过严格匿名化:私有域名 HMAC 哈希、路径截断、token/IP 邮箱全部脱敏。可通过以下方式关闭:
export CAMOFOX_CRASH_REPORT_ENABLED=false
或指向自己的端点:
export CAMOFOX_CRASH_REPORT_URL=https://your-endpoint.example.com/report
六、总结
camofox-browser 填补了 AI Agent 浏览真实网页时的关键空白。传统浏览器自动化工具在反检测面前束手无策,而 Camoufox 的 C++ 层伪装策略从根源上解决了这个问题。加上专为 Agent 设计的元素引用系统、无障碍快照、搜索宏等特性,使得整个浏览-交互链路的 token 消耗大幅降低,响应更可靠。
项目的设计哲学也很清晰:轻量(40MB 空闲内存)、可部署在任何地方(树莓派到云服务器)、安全优先(cookie 导入默认关闭、路径遍历防护、遥测可关闭)。对于正在构建 AI Agent 且需要网页浏览能力的开发者来说,这是一个值得关注的工具。
项目地址:https://github.com/jo-inc/camofox-browser
npm 包:@askjo/camofox-browser