camoufox-2026 について
Camoufoxは、改変版Firefoxを基盤とするPythonブラウザー自動化ツールで、Playwright APIとブラウザーフィンガープリントのローテーションを備えています。READMEでは2026年時点で実験的とされ、本番環境での更新前にテストするよう注意を促しています。
主な機能
- 01改変版Firefoxによる自動化
- 02非同期・同期Python API
- 03ブラウザーフィンガープリントのローテーション
- 04自然なマウス操作と入力の再現
- 05永続化ブラウザーコンテキスト
- 06プロキシ経由のGeoIP照合
活用シーン
- 01Playwright APIを使ったブラウザータスクの自動化
- 02再起動後もログインセッションを維持
- 03異なるフィンガープリントでブラウザー操作をテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ krishamaze/ skills --skill camoufox-2026インストール後、Claude Code で/camoufox-2026を入力して読み込まれたか確認します。
詳細
Camoufox 2026 — アンチ検出ブラウザー自動化
⚠️ 2026 年のステータスに関する警告
v146.0.1-beta.25(2026 年 1 月)時点で、Camoufox のソースは公開されていますが、非常に実験的な状態です。
- 最新リリースは本番環境で安定していません。破壊的変更が発生する可能性があります
- Firefox のベースバージョンの差や、新たなフィンガープリントの不整合により、以前のバージョンよりパフォーマンスが低下しています
- メンテナンスの空白期間を経て、2025 年末から 2026 年初めに開発が再開されました
- 本番環境で安定して使用するには、最後に正常動作が確認されたバージョンに固定し、アップグレード前にテストしてください
Camoufox の機能(Playwright そのままの場合との違い)
標準の Playwright では、次の方法で自動化の痕跡が漏れます。
navigator.webdriver = true- ページのスコープに挿入される
window.__playwright__binding__ - CDP(Chrome DevTools Protocol)のフィンガープリント信号
Camoufox は(Firefox 版 CDP に相当する Juggler プロトコルを介して)C++ レベルで Firefox にパッチを適用します。 Playwright の操作はページ外の分離されたスコープで実行されるため、ウェブサイトからは見えません。 さらに、BrowserForge によるフィンガープリントのローテーションで、実環境のデバイス分布を模倣します。
インストール(2026 年)
# Always use uv (not pip) for new projects in 2026
uv add camoufox[geoip]
uv add playwright
# Download Camoufox's patched Firefox binary (one-time, ~300MB)
# ⚠️ This fetches a pre-built binary from GitHub releases.
# Pin the camoufox version in pyproject.toml and verify the
# download hash before deploying to production.
python -m camoufox fetch
警告
camoufox fetchは、サードパーティ製のパッチ適用済み Firefox バイナリをダウンロードします。 本番環境や CI で使用する前に、必ずpyproject.toml/uv.lockでcamoufoxパッケージのバージョンを固定し、 GitHub のリリースチェックサム で配布元を確認してください。
API:2 つのモード
非同期(推奨 — FastAPI と組み合わせて使用)
import asyncio
from camoufox.async_api import AsyncCamoufox
async def main():
async with AsyncCamoufox(
headless=False, # False = uses virtual display (Xvfb)
humanize=True, # enables human-like mouse/timing
persistent_context="/sessions/my-app", # saves cookies/storage
geoip=True, # auto locale/timezone from IP
) as browser:
page = await browser.new_page()
await page.goto("https://www.example.com")
# actions...
asyncio.run(main())
同期(シンプルなスクリプトのみ)
from camoufox.sync_api import Camoufox
with Camoufox(
headless=False,
humanize=True,
persistent_context="/sessions/my-app",
) as browser:
page = browser.new_page()
page.goto("https://www.example.com")
永続コンテキスト(セッションの維持)
コンテナーの再起動後も維持する必要があるログインセッションで重要です。
# Path must be a directory — Camoufox stores cookies + localStorage + IndexedDB there
async with AsyncCamoufox(
persistent_context="/sessions/my-app", # mount as Docker volume
headless=False,
) as browser:
page = await browser.new_page()
await page.goto("https://www.example.com")
# First run: login manually via VNC
# Subsequent runs: session restored automatically
Docker ボリュームのマウント:
volumes:
- ./sessions:/sessions # restrict permissions: chown to container UID, chmod 700
重要
セッションディレクトリには、認証トークンと Cookie が含まれます。 ホスト側のアクセス権限を制限し(
chmod 700 ./sessions)、セッションデータをバージョン管理にコミットしないでください。
Humanize フラグの機能
humanize=True を指定すると、次の機能が有効になります。
- 距離を考慮した曲線軌道でのマウス移動(C++ の HumanCursor アルゴリズム)
- タイピング間隔のランダム化
- 自然なスクロールパターン
- 操作ごとの微小な遅延
⚠️ 完全ではありません。高度な行動分析では、依然として検出される可能性があります。次の方法も併用してください。
- 独自のコードで操作のタイミングをランダム化する
- 短時間に操作を連続させない(
await asyncio.sleep(random.uniform(0.5, 2.5))を追加する) - 同じ操作シーケンスを繰り返し実行しない
フィンガープリントのローテーション
BrowserForge は、統計的に実環境に即したデバイスプロファイルを生成します。
- Navigator のプロパティ(OS、ハードウェア、画面)
- WebGL のレンダラーとベンダー
- AudioContext のフィンガープリント
- フォントと言語ロケール
- 実環境の OS 市場シェア分布に準拠(Linux 約 5%、Windows 約 70% など)
新しいブラウザーインスタンスごとに、新しいフィンガープリントが自動的に割り当てられます。
GeoIP の照合
import os
async with AsyncCamoufox(
geoip=True, # auto-derive locale/timezone from proxy IP
proxy={
"server": os.environ["PROXY_URL"], # e.g. http://proxy-ip:port
"username": os.environ["PROXY_USER"],
"password": os.environ["PROXY_PASS"], # never hardcode credentials
}
) as browser:
...
注意
プロキシの認証情報をソースコードに直接記述しないでください。 環境変数またはシークレットマネージャー(Docker secrets、 バージョン管理から除外した
.envファイルなど)から読み込んでください。
VPS でのヘッドレス実行(Xvfb が必要)
Camoufox は、完全なステルス性を確保するため、「headless」モードでもディスプレイが必要です。
headless=False を設定し、Xvfb を外部から実行してください(当社の Docker セットアップでは entrypoint.sh が処理します)。
import os
os.environ["DISPLAY"] = ":99" # match your Xvfb display number
async with AsyncCamoufox(headless=False, ...) as browser:
...
Camoufox が対応しないこと
- Cloudflare のインタースティシャル WAF(SpiderMonkey エンジンの挙動をテストするため、完全な偽装は不可能です)
- 高度な ML による行動分析(マウスのパターンが検出される可能性があります)
- Python 以外の言語(Node/Go ではリモートサーバーモードを使用してください。公式ドキュメントを参照)
アンチパターン(絶対にしないこと)
# ❌ DO NOT use raw Playwright for stealth work
from playwright.async_api import async_playwright # will get detected
# ❌ DO NOT use sync in async FastAPI context
from camoufox.sync_api import Camoufox # blocks event loop
# ❌ DO NOT use time.sleep() — use asyncio.sleep()
import time; time.sleep(2) # breaks async event loop
# ❌ DO NOT install via pip in 2026 new projects
pip install camoufox # use uv instead
正しいパターン
# ✅ Async + proper delay
import asyncio, random
await asyncio.sleep(random.uniform(0.8, 3.0))
# ✅ Use locators (stable selectors, not fragile CSS/XPath strings)
await page.get_by_role("button", name="Post").click()
await page.get_by_placeholder("What's on your mind").fill("text")
# ✅ Wait for network idle after navigation
await page.goto(url, wait_until="networkidle")
# ✅ Screenshot for debugging (saves to /sessions/)
await page.screenshot(path="/sessions/debug.png")
参考資料
- 公式ドキュメント:https://camoufox.com
- GitHub:https://github.com/daijro/camoufox
- ステルス機能の内部仕様:https://camoufox.com/stealth/
警告
Camoufox はパッチ適用済み Firefox バイナリを配布しており、サードパーティのサプライチェーン依存関係にあたります。導入前に、 GitHub のリリースページでリリース署名とチェックサムを確認し、 パッケージのバージョンを固定して、アップグレード前に更新内容を監査してください。