一台反偵測的無頭瀏覽器伺服器。
camofox-browser 解決一個具體問題:AI 代理需要瀏覽真實網路,但 Playwright 會被擋、headless Chrome 會被指紋辨識、stealth 外掛本身又成了新的指紋。它的答案是換引擎——底層用 Camoufox,一個在 C++ 實作層偽裝指紋的 Firefox fork。navigator.hardwareConcurrency、WebGL renderer、AudioContext、螢幕幾何、WebRTC 都在 JavaScript 看到之前就被改掉,沒有 shim、沒有 wrapper、沒有破綻。
這個專案把那顆引擎包成一套為代理設計的 REST API。它不回傳整頁 HTML,而是回傳 accessibility snapshot——體積約比原始 HTML 小 90%,對 token 友善;頁面元素以穩定的 e1、e2、e3 ref 標記,代理據此點擊與輸入;並內建 @google_search 等搜尋巨集處理常見網站。定位是 Puppeteer/Playwright 的 drop-in 替代品。
它由 AI 代理產品「jo」團隊維護,以 MIT 授權釋出,目前約 6.4k stars、638 forks,主要語言 JavaScript。設計上強調輕量:lazy 啟動加上閒置自動關閉,閒置時記憶體約 40MB,可與其他服務共用一台 Raspberry Pi 或 5 美元 VPS。
開 tab
取 snapshot
用 ref 點擊/輸入
擷取結果
關 session
Playwright gets blocked. Headless Chrome gets fingerprinted. Stealth plugins become the fingerprint.
三條安裝路徑: npx、原始碼、或 Docker。
最快是直接用 npx 跑起來;要改原始碼就 clone。第一次啟動會下載 Camoufox 二進位檔(約 300MB),之後啟動就快。伺服器預設聽 9377 埠。
# 直接用 npx 啟動(不需 clone)
npx @askjo/camofox-browser
# 或從原始碼;npm start 首次會下載 Camoufox(約 300MB)
git clone https://github.com/jo-inc/camofox-browser
cd camofox-browser
npm install
npm start # -> http://localhost:9377當成 OpenClaw 外掛
若你的代理用 OpenClaw,直接裝外掛即可,它會註冊一組 camofox_* 工具(見第 04 節)。
openclaw plugins install @askjo/camofox-browserDocker
內附的 Makefile 會自動偵測 CPU 架構(M1/M2 為 aarch64、Intel 為 x86_64),並在 build 之外預先下載 Camoufox 與 yt-dlp 二進位檔,讓重建快很多(約 30 秒 vs 約 3 分鐘)。
make up # 自動偵測架構、build 並啟動
make down # 停止並移除容器
make reset # 升級版本後強制重建
make fetch # 只下載二進位檔API 提供的每一項能力。
以下依用途分組,整理 README 列出的核心能力。左區是讓代理「不被擋、看得懂、點得到」的瀏覽基礎;中區是登入與代理路由;右區是資料擷取與可觀測性。每一項都對應 README 中已記載的功能。
隱匿 · 01
C++ Anti-Detection
繞過偵測
在 C++ 實作層偽裝指紋,JavaScript 看到前就改好。README 稱可繞過 Google、Cloudflare 與多數機器人偵測。
互動 · 02
Element Refs
穩定指標
頁面元素以 e1、e2、e3 標記,代理據此點擊與輸入,比 CSS selector 更耐頁面變動。
互動 · 03
A11y Snapshot
精簡快照
回傳 accessibility snapshot 而非整頁 HTML,體積約小 90%。大頁面自動截斷,以 offset 分頁取後續內容。
隱匿 · 04
Search Macros
搜尋巨集
內建 @google_search、@youtube_search、@amazon_search、@reddit_subreddit 等共 14 個常見網站巨集。
登入 · 05
Session Isolation
隔離session
每位使用者的 cookies/storage 各自獨立,並持久化到 ~/.camofox/profiles,瀏覽器重啟後自動還原登入狀態。
登入 · 06
Cookie Import
注入cookie
匯入 Netscape 格式 cookie 檔做已驗證瀏覽,跳過 LinkedIn、Amazon 等網站的互動式登入。需設 API key。
登入 · 07
VNC Login
視覺登入
透過 noVNC 以肉眼登入網站,再匯出 storage state 供代理重用。處理需手動驗證的登入流程。
路由 · 08
Proxy + GeoIP
代理路由
經住宅代理出口,Camoufox GeoIP 自動依出口 IP 設定 locale、timezone 與座標。支援 backconnect 黏性 session。
擷取 · 09
Structured Extract
結構化擷取
POST /tabs/:tabId/extract 帶一份 JSON Schema,以 x-ref 把屬性對應到 snapshot 的 ref,直接抽成結構化資料。
擷取 · 10
YouTube Transcript
抽字幕
經 yt-dlp 抽取任意 YouTube 影片字幕,免 API key。Docker 映像已內含 yt-dlp;本機缺它則退回較慢的瀏覽器路徑。
擷取 · 11
Screenshot
擷圖
在 snapshot 之外一併回傳 base64 PNG 截圖。另可列出頁面 <img> 的 src/alt,並選擇回傳 inline data URL。
觀測 · 12
Session Tracing
追蹤除錯
每個 session 可選開 Playwright trace(截圖+DOM+網路+console),輸出單一 .zip,用 Trace Viewer 開啟。
代理會用到的工具與常見設定。
裝成 OpenClaw 外掛後,代理會拿到一組 camofox_* 工具;下面同時整理幾個 README 記載、上線前值得先設好的設定。每條都對應一段官方文件。
工具集 · 10 個 camofox_* 工具
外掛註冊:create_tab、snapshot、click、type、navigate、scroll、screenshot、close_tab、list_tabs、import_cookies。對應開分頁、取快照、點擊、輸入、導覽、捲動、截圖、關分頁、列分頁與匯入 cookie。
README · Quick Start · OpenClaw Plugin
要匯入 cookie,先設 API key
cookie 匯入預設關閉;沒設 CAMOFOX_API_KEY 時伺服器一律回 403。用 openssl rand -hex 32 產生金鑰,放進 shell profile 或環境變數,別寫進 plaintext 的 openclaw.json。
README · Usage · Cookie Import
已驗證瀏覽:放 cookie 檔再叫代理匯入
把 Netscape 格式 cookie 檔放到 ~/.camofox/cookies/,再對代理說「import my LinkedIn cookies from linkedin.txt」。每次請求上限 500 條 cookie、5MB,且阻擋目錄外的 path traversal。
README · Cookie Import · How it works
輪換 IP 用 backconnect 黏性 session
Decodo、Bright Data、Oxylabs 這類單一 gateway、session 黏性的供應商,設 PROXY_STRATEGY=backconnect。每個瀏覽器 context 拿到獨立黏性 session,不同使用者得到不同 IP,遇錯或被 Google 擋會自動輪換。
README · Proxy + GeoIP · Backconnect
air-gapped:用外部 Camoufox 執行檔
已有 Camoufox bundle 時,設 CAMOUFOX_EXECUTABLE=/path/to/camoufox-bin 跳過內建下載(適用 NixOS 路徑)。否則用 npm install --omit=optional 再手動 npx camoufox-js fetch 對你的 mirror 抓。
README · Standalone · External executable
session 預設持久化,登入一次即可
camofox 預設把每位使用者的 cookies 與 localStorage 存到 ~/.camofox/profiles/,重啟後自動還原。要換目錄設 CAMOFOX_PROFILE_DIR;要關閉就在 camofox.config.json 設 persistence.enabled=false。
README · Session Persistence
除錯:開 trace,用 Trace Viewer 看
開 tab 時帶 trace: true,session 關閉時寫出 .zip。用 npx playwright show-trace session.zip 開啟,可看截圖、DOM、網路與 console。trace 不能在既有 session 上切換,要先 DELETE /sessions/:userId。
README · Session Tracing
缺 yt-dlp 仍可抽字幕,只是較慢
/youtube/transcript 端點優先走 yt-dlp 快路徑(pip install yt-dlp 或 brew install yt-dlp)。Docker 映像已內含;本機沒裝則退回較慢的瀏覽器方法,功能仍在。
README · Optional Dependencies
開分頁、取快照、用 ref 點下去。
以下用 curl 直接打 REST API,走一輪最常見的流程:啟動伺服器 → 開一個帶 session 的分頁 → 取 snapshot 拿到 element ref → 用結構化 extract 抽資料。端點與參數取自 README;回應為示意。
$ npx @askjo/camofox-browser
ok: ✓ listening on http://localhost:9377
$ curl -X POST http://localhost:9377/tabs \
> -H 'Content-Type: application/json' \
> -d '{"userId":"agent1","sessionKey":"task1","url":"https://example.com"}'
{ "tabId": "t_8f2a", "title": "Example Domain",
"snapshot": [
{ "ref": "e1", "role": "heading", "name": "Example Domain" },
{ "ref": "e2", "role": "link", "name": "More information..." } ] }
$ curl -X POST http://localhost:9377/tabs/t_8f2a/click \
> -H 'Content-Type: application/json' -d '{"ref":"e2"}'
ok: ✓ navigated · 回傳新頁 snapshot
$ curl -X POST http://localhost:9377/tabs/t_8f2a/extract \
> -H 'Content-Type: application/json' \
> -d '{"schema":{"type":"object","properties":{
> "title":{"type":"string","x-ref":"e1"}}}}'
ok: ✓ { "title": "Example Domain" }
$ curl -X DELETE http://localhost:9377/sessions/agent1
ok: ✓ session closed
accessibility snapshots instead of bloated HTML, stable element refs for clicking, and search macros for common sites.
這段流程的重點
差別不在「能不能打開網頁」,而在回給代理的東西:精簡到適合放進 prompt 的 snapshot、用 e1/e2 取代易碎的 selector、以及用 JSON Schema 一次抽成結構化資料。要做已驗證瀏覽,先用第 04 節的 cookie 匯入或 VNC 登入,之後 create_tab 就是登入狀態。
上線前, 知道這些邊界。
從 demo 到正式接上代理。
curl 跑通之後,把它正式接進你的代理。以下依序推進。
建議路徑
**1. 讀 OpenAPI 規格。**所有端點與參數在 /openapi.json,互動式文件在 /docs。要接哪個動作,先在這裡核對欄位,而非照抄示意。
**2. 接成代理工具。**用 OpenClaw 就裝外掛拿 camofox_* 工具;其他框架則照 OpenAPI 把端點包成 tool/function call。
**3. 處理登入。**需要帳號的網站,先用 cookie 匯入或 VNC 登入建立 session,storage 會持久化,之後免再登入。
**4. 上代理路由。**規模化抓取時設住宅代理;會被 Google 擋的場景用 backconnect 黏性 session 自動輪換 IP。
**5. 部署。**選 Docker、Fly.io 或 Railway。記得設 CAMOFOX_API_KEY 等機密,並依需要關閉遙測。
延伸閱讀
① github.com/jo-inc/camofox-browser——原始碼、README 與 issue 追蹤。 ② camoufox.com——底層引擎 Camoufox(C++ 層級指紋偽裝的 Firefox fork)。 ③ http://localhost:9377/openapi.json 與 /docs——啟動後即可取得的完整 API 規格。
A REST API built for agents: accessibility snapshots, stable element refs, and search macros.