jo-inc/camofox-browser
エージェントに本物のブラウザを渡し、ページを番号付きの骨組みにして返す
どういうものか
看板のとおり、これは検知をかわすためのブラウザである。先に断っておくと、弾かれないことと、取得してよいことは別の話だ。相手サイトの利用規約や robots.txt、地域ごとの法令はこの道具では解決しないので、対象ごとに自分で確かめる必要がある。
そのうえで中身を見ると、エージェントに Web を見せようとするときの二つの壁に答えている。ひとつは弾かれること。Playwright や画面なしの Chrome は特徴が知られていて、見分けられて止められる。しかも「見分けられないようにする拡張」を入れると、その拡張自体が新しい目印になってしまう。camofox-browser が土台に使っている Camoufox は、この問題を Firefox のC++の実装そのものを書き換えることで解いている。CPU のコア数、WebGL の描画装置名、音声処理、画面の大きさ、WebRTC といった、正体がばれる値を JavaScript から見える前の段階で差し替えてしまう。上から被せる細工がないので、細工の跡が見えない。
もうひとつの壁はページが重すぎること。生の HTML をそのままモデルに読ませれば、装飾やスクリプトで場所を食い尽くす。このプロジェクトはそこに手を入れていて、返すのは HTML ではなく支援技術向けの構造(アクセシビリティ・スナップショット)。README によれば生の HTML より9割ほど小さい。そのうえで、押せる要素や入力欄に e1 e2 e3 という通し番号を振って返す。エージェントは座標や CSS の指定を組み立てる必要がなく、「e7 を押す」「e3 に打ち込む」と番号で指すだけで済む。大きいページはページ送りで分割して受け取れる。
全体は REST の API サーバーとして動く。タブを作る・進む・押す・打つ・巻物のように送る・画面写真を撮る、といった操作が HTTP で呼べて、OpenClaw 向けのプラグインも用意されている。実運用側の作り込みも厚く、ブラウザは必要になるまで立ち上げず、使わなくなれば落とす(待機中は 40MB 程度)ので、Raspberry Pi や小さな VPS に相乗りさせる前提で設計されている。利用者ごとに Cookie と保存領域を分ける、Cookie ファイルを流し込んでログイン済みの状態で見る、noVNC 経由で人間が手でログインしてその状態をエージェントに引き継ぐ、住宅用プロキシを通して地域と時刻帯を自動で合わせる、といった機能が並ぶ。Google 検索・YouTube 検索・Amazon 検索など、よく使う検索は @google_search のような短縮の呼び出しにまとめられている。
どんなときに使うか
エージェントに実際のサイトを見せたいのに、途中で止められるとき
Playwright で組んだ手順が、ある日から通らなくなった、というときの乗り換え先。ただし API の互換品ではなく、localhost:9377 に立つ REST サーバーなので、呼び出し側は HTTP に書き直すことになる。
ログインが要るページを、エージェントに続けて見せたいとき
人が noVNC の画面で手でログインし、その状態を書き出してエージェントに引き継ぐ道が用意されている。認証だけ人がやって、あとは任せるという分担ができる。
注意点
最初の導入は軽くない。 初回起動時に Camoufox の本体(約300MB)を取得する。README には、Playwright のダウンロード抑止を設定している環境で取得が黙って飛ばされ、実行時に落ちる件への対処や、外部に置いた実行ファイルを指定する方法まで書かれている。閉じた環境に入れるなら、この節を先に読んでおきたい。
動作情報が既定で外に出る。 クラッシュやハングの匿名の報告が自動で送られる設計で、既定で有効。ここは中身を分けて読む必要がある。パスや引数、トークン、IP、ページの中身は送らないと書かれている一方、Google や Amazon のようなよく知られたドメインはそのまま送られる(どのサイトで失敗したかを集めるのが目的のため)。伏せられるのは、それ以外のドメインをハッシュ化したものだけだ。CAMOFOX_CRASH_REPORT_ENABLED=false で止められ、送り先を自分の場所に変えることもできる。
個人サービスの副産物という出自。 作者は「jo」という個人向けAIエージェントのチームで、README の冒頭にその案内が入る。悪いことではないが、単体のプロジェクトとしての長期の維持がどうなるかは、別に見ておいたほうがいい。
ライセンスは MIT。