mcpField
C
camoufox-2026

camoufox-2026

github.com/krishamaze開発051 回インストール29 週間前に更新
リポジトリ

camoufox-2026 について

Camoufoxは、改変版Firefoxを基盤とするPythonブラウザー自動化ツールで、Playwright APIとブラウザーフィンガープリントのローテーションを備えています。READMEでは2026年時点で実験的とされ、本番環境での更新前にテストするよう注意を促しています。

主な機能

  1. 01改変版Firefoxによる自動化
  2. 02非同期・同期Python API
  3. 03ブラウザーフィンガープリントのローテーション
  4. 04自然なマウス操作と入力の再現
  5. 05永続化ブラウザーコンテキスト
  6. 06プロキシ経由のGeoIP照合

活用シーン

  1. 01Playwright APIを使ったブラウザータスクの自動化
  2. 02再起動後もログインセッションを維持
  3. 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")

参考資料

警告

Camoufox はパッチ適用済み Firefox バイナリを配布しており、サードパーティのサプライチェーン依存関係にあたります。導入前に、 GitHub のリリースページでリリース署名とチェックサムを確認し、 パッケージのバージョンを固定して、アップグレード前に更新内容を監査してください。

コメント