GitHub Trending 榜上最近出现了一个定位很刁的项目:jo-inc/camofox-browser。它自己不造浏览器,而是把反检测引擎 Camoufox 包装成一个 REST API 服务器,专门卖给 AI Agent 用——确切说是送给 AI Agent 用,MIT 协议,一条 npx @askjo/camofox-browser 就能在本地起一个服务。仓库目前 1.07 万 star,日增约 800 到 900,按这个速度是本周自动化工具类目里最陡的曲线。

它解决什么问题:Agent 上网,三道门都过不去
AI Agent 要干活,绕不开真实网页:搜索、下单、看数据后台。目前三条主流路径各有死穴。
第一,Playwright/Puppeteer 直接驱动浏览器。网页能打开,但 headless 痕迹遍地——navigator.webdriver 标志、缺失的插件列表、异常的屏幕几何参数,Cloudflare 和 Google 的风控一眼识破,返回 403 或者无限挑战页。
第二,headless Chrome 加反检测补丁。社区有 puppeteer-extra-stealth 之类的插件库,在 JS 层面逐项伪装。问题是这些补丁本身成了新的指纹:检测方反过来统计「装了 stealth 插件的浏览器」的特征组合,插件越补越像自报家门。
第三,付费反检测浏览器(Multilogin、AdsPower 等)。能用,但按月订阅、按 profile 收费,让 Agent 大规模并发用的成本立刻失控。
camofox-browser 的路线是把三条路的短板各补一块:引擎用 Camoufox,通信层换成为 Agent 优化的 REST API,部署层做到一条命令。
引擎层:Camoufox 在 C++ 层改指纹

理解 camofox-browser 要先看它脚下的 Camoufox(daijro/camoufox,1.2 万 star)。这是 Firefox 的一个 fork,做法不是在网页里注入 JS 脚本去覆盖 navigator 属性,而是直接改浏览器的 C++ 实现:navigator.hardwareConcurrency、WebGL 渲染器信息、AudioContext 音频指纹、屏幕几何、WebRTC 泄露,全部在浏览器引擎内部就被替换成伪造值,JavaScript 从源头上就只能读到假数据。
这就是「C++ 层伪装」和「JS 层伪装」的区别:前者没有 shim、没有 wrapper、没有可以被检测的时间差和调用栈特征。指纹伪装领域的检测与反检测一直在军备竞赛,从实现层面出手等于把战场从「脚本对抗」拉回到「引擎对抗」,伪造值的自洽性由引擎保证。
Camoufox 还支持指纹注入与轮换(自定义屏幕尺寸、分辨率、视口属性等),这些能力在 camofox-browser 里通过配置透出。
服务层:为 token 效率重新设计的浏览器 API
camofox-browser 自己的增量在通信层。传统浏览器自动化把整个 HTML 扔给调用方,一个现代网页动辄几 MB 的 DOM,塞进 Agent 上下文既慢又贵。这个项目的核心取舍是:Agent 看到的不是网页,是网页的无障碍快照。
实际交互长这样:
# 建一个标签页
curl -X POST http://localhost:9377/tabs \
-H 'Content-Type: application/json' \
-d '{"userId": "agent1", "sessionKey": "task1", "url": "https://example.com"}'
# 拿无障碍快照,元素带稳定引用号
curl "http://localhost:9377/tabs/TAB_ID/snapshot?userId=agent1"
# -> { "snapshot": "[button e1] Submit [link e2] Learn more", ... }
# 按引用号点击
curl -X POST http://localhost:9377/tabs/TAB_ID/click \
-H 'Content-Type: application/json' \
-d '{"userId": "agent1", "ref": "e1"}'无障碍快照把页面压缩成 [button e1] Submit 这样的结构化文本,官方给的数据是比原始 HTML 小约 90%。元素引用号 e1、e2 跨快照稳定存在,Agent 点按钮不需要写 CSS 选择器,消除了选择器失效这个自动化脚本最高频的崩溃原因。快照过大时自动截断,用 offset 参数翻页。
围绕这个核心还有一整层 Agent 生态的配套:
- 搜索宏:
@google_search、@youtube_search、@amazon_search、@reddit_subreddit等十几个预设导航指令,一个 navigate 调用直达搜索结果页。 - YouTube 字幕提取:
POST /youtube/transcript,底层走 yt-dlp,不需要 API key。拿视频字幕喂给 Agent 是 RAG 和视频摘要场景的高频需求。 - Cookie 导入:把本地浏览器的登录态以 Netscape 格式导入,跳过交互式登录。这个端点默认关闭,必须设置
CAMOFOX_API_KEY才启用,未配置时一律 403。 - 会话隔离与持久化:按 userId 隔离 cookie 和 storage,登录态落在
~/.camofox/profiles/<哈希>,浏览器重启后仍可恢复。 - 代理与 GeoIP:走住宅代理时自动匹配当地时区和语言。
- VNC 交互式登录:遇到必须人肉过验证码的场景,通过 noVNC 打开真实窗口人工登录一次,导出 storage state 给 Agent 复用。
- 结构化提取:
POST /tabs/:tabId/extract接受 JSON Schema,字段通过x-ref直接映射到快照元素引用。
部署层:给 Agent 配套的运维细节
这个项目把「Agent 基础设施」的运维参数直接做进了默认值:
- 懒启动 + 空闲关停:无会话 5 分钟自动关闭浏览器引擎,空闲内存约 40MB,官方明确说目标是能和其余 Agent 技术栈共享一台树莓派或者 5 美元 VPS。
- 会话 30 分钟不活跃自动过期;标签页超限时回收最旧的,而不是报错——长跑的 Agent 会话不会撞墙。
- Docker 镜像预下载 Camoufox(约 300MB)和 yt-dlp,
make up按架构自动适配;Fly.io、Railway 都有一键模板。 - 结构化 JSON 日志带 request id,接生产观测不用改代码。
安全模型也写得比多数同类项目认真:进程.env 读取集中在 lib/config.js,子进程调用隔离在 launcher 和 youtube 插件两个文件里,主路由文件零环境变量读取;全局 Bearer token(CAMOFOX_ACCESS_KEY)可保护所有路由;崩溃遥测默认开启但匿名化(私有域名 HMAC 哈希、路径剥离),可以一行环境变量关掉。包里零内嵌凭据。唯一提醒用户警惕的,是市面上已经出现了蹭名字的「Camofox」加密代币——README 里专门写了一节声明这永远不是加密货币项目。
怎么用:三条部署路径
最轻的路径是 npx 直接跑:
npx @askjo/camofox-browser
# -> http://localhost:9377,OpenAPI 文档在 /docs从源码跑:git clone 后 npm install && npm start,首次运行下载 Camoufox 引擎约 300MB。一个已知的坑:如果你的环境导出了 PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1(用系统 Chrome 的 Playwright 配置很常见),postinstall 脚本会自己清掉这个变量去下载 Camoufox;想彻底跳过下载用 --ignore-scripts,或者用 CAMOUFOX_EXECUTABLE 指向已有的 Camoufox 二进制(NixOS 用户的标准姿势)。
Docker 路径:make up,Makefile 会先在构建外预下载二进制,重建镜像 30 秒左右。README 特别警告不要直接 docker build,因为 Dockerfile 用 bind mount 挂载预下载的二进制。
冷静看:它没解决的部分
反检测浏览器的天花板不在这个项目手里。Camoufox 的 C++ 伪装能过 Cloudflare 和 Google 的「当前版本」,但检测方拿到的信号维度一直在增加(TLS 指纹在 HTTP 层、行为分析在会话层),单点伪装没有终局。另外 Firefox 引擎的市场份额小,这反倒是优势(主流检测规则针对 Chrome 优化)和劣势(个别站点对 Firefox 的兼容策略不同)并存。
合规边界也值得自己划:用反检测技术过 Cloudflare 在多数站点的服务条款里属于灰色地带,这个项目的正当用途是 Agent 访问「不封自动化但封低质量爬虫」的场景以及自有资产运维,怎么用是部署者的责任。
从更大的图景看,这个项目的走红是 Agent 基础设施分层的一个信号:模型层之外,浏览器正在被重新包装成「Agent 的眼睛」这一独立中间件——快照代替 HTML、引用号代替选择器、会话代替浏览器 profile。谁在做 Agent 自动化,这套 API 形态值得直接抄。
参考来源: