今天在 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。

支持导入 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