
Playwright用の無料アンチディテクトブラウザステルス:検出されないヘッドレスFirefoxフィンガープリント。Pythonスクレイピング、reCAPTCHAおよびボット検出バイパス。オープンソース

アンチボットは 2 つの質問を投げかけ、reCAPTCHA、hCaptcha、Cloudflare Turnstile がその回答を採点します。invisible_playwright は両方に「はい」と答えます。
1. これは本物のブラウザか? はい。C++ ソースレベルでパッチを当てた Firefox です。
2. 本物の人間が使っているか? はい。操作はドライバー内で人間らしくされます。
pip install invisible-playwright
python -m invisible_playwright fetch # one-time download, sha256-verified: 240 MB (Windows) / 262 MB (Linux x86_64) / 253 MB (Linux arm64), about 550 MB unpacked
Python 3.11 以降が必要です。
対応プラットフォーム: Windows x86_64、Linux x86_64 / arm64。
Playwright の API、同期と非同期、コード変更なし。 同じオブジェクト、同じ呼び出し、同じ戻り値。一部のサーフェスは対象外です - tracing、HAR、CDP、API リクエストコンテキスト - また go_back() と go_forward() は復元されたページの不具合により保留されています。いずれも静かに誤動作するのではなく、理由を述べた一文で拒否します。すでに Playwright を使っているなら、切り替えは 2 行です:
- from playwright.sync_api import sync_playwright
- with sync_playwright() as p:
- browser = p.firefox.launch()
+ from invisible_playwright import InvisiblePlaywright
+ with InvisiblePlaywright() as browser:
すべてのセッションが固有のフィンガープリント (GPU、オーディオ、フォント、画面、約 200 フィールド) とベジェ曲線のマウス動作を取得します。
同期
from invisible_playwright import InvisiblePlaywright
with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
page = browser.new_page()
page.goto("https://example.com")
page.click("#submit") # mouse arcs to the button on a Bezier curve
非同期
from invisible_playwright.async_api import InvisiblePlaywright
async with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
page = await browser.new_page()
await page.goto("https://example.com")
await page.click("#submit")
browser オブジェクトは playwright.sync_api.Browser / playwright.async_api.Browser であり、すべての Playwright メソッドがそのまま動作します。
シードをログに記録して実行を再現できます:
sf = InvisiblePlaywright()
with sf as browser:
print("seed =", sf.seed)
# ...
with InvisiblePlaywright(seed=42) as browser:
... # same GPU, same canvas hash, same audio context, every run
proxy = {
"server": "socks5://gate.example.com:1080",
"username": "user",
"password": "pass",
}
with InvisiblePlaywright(proxy=proxy) as browser:
...
対応スキーム: socks5、socks4、http、https。DNS はデフォルトでプロキシ経由でルーティングされ、ローカルリークはありません。
ブラウザのタイムゾーンは timezone= に従います:
# default: timezone is auto-derived from the egress IP (proxy egress if a
# proxy is set, otherwise the host's own public IP)
with InvisiblePlaywright(proxy=proxy) as browser:
...
# explicit IANA zone always wins, the only way to force a specific zone
with InvisiblePlaywright(proxy=proxy, timezone="America/New_York") as browser:
...
デフォルトではすべてが seed から取得されます。残りはシード由来のまま、特定の値を強制するには:
with InvisiblePlaywright(
seed=42,
pin={
"gpu.renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0, D3D11)",
"gpu.vendor": "Google Inc. (AMD)",
"screen.width": 2560,
"screen.height": 1440,
"hardware.concurrency": 16,
},
) as browser:
...
GPU の pin は自由な文字列を設定するのではなく、検証済みペルソナの 1 つを選択します。
なぜなら約 81 個の getParameter 値と拡張機能リストがレンダラー名とともに移動し、
検出器がそれらを相互照合するからです。プールに存在しない名前を指定すると例外が発生し、
エラーには存在する名前が列挙されます。
固定可能なキーの完全なリスト、pin がベイジアンサンプラーとどのように相互作用するか、 および一般的なパターンは docs/pinning.md にあります。
インストールされるコマンドは invisible-playwright で、ハイフン付きです。python -m invisible_playwright も同じように動作し、PATH に何も必要としません。
invisible-playwright fetch # download the engine if missing, check every cached
# one against the seal, print the path
invisible-playwright version # wrapper, core and engine versions, and where the
# engine is cached
スクリプトを書くよりプロンプトを出したいなら。 このページはエンジンであり、Python
ライブラリです。コードを書かずに使う方法が 2 つあり、どちらも 1 行です: すでにお持ちの
MCP クライアント (Claude Code、Claude Desktop、Cursor) からなら
claude mcp add stealth -- uvx aihawk、詳しくは
MCP サーバーページ を参照。または
インターフェースとモデルが含まれ、OpenRouter キーだけが必要な場合は
uvx aihawk ui --openrouter-key sk-or-...、詳しくは
AIHawk を参照。土台は同じエンジンで、2 つ目は
1 つ目のクライアントです。
これらすべては wiki でより読みやすく、 検索可能で、1 つの平坦なリストではなく 4 つのセクションに整理されています:
どこから始めればよいかわからない場合: Playwright を検出されなくする 3 つの方法 は他の多くのページがリンクする地図であり、Playwright が 1 つのサイトでボットとして検出される はトラブルシューティングの順序であり、navigator.webdriver はあなたが思うような手がかりではない はこの分野で最も有名なプロパティと、それだけにパッチを当ててもほとんど何も得られない理由を説明します。
検出器セクションは現在、商用アンチボット製品を名前を挙げて扱い、それぞれを 独自のドキュメントまたは確認されたリバースエンジニアリングから読み解いています: Cloudflare Bot Management と Turnstile、 DataDome、Kasada、 Akamai Bot Manager、 PerimeterX、hCaptcha、 Imperva、そして 残りのセット。
これの他の部品。 エンジンは 3 つのうち中央にあり、その周りの 2 つが ほとんどの人がたどり着く方法です:
uvx aihawk、独自のモデルを持ち込む任意のクライアント向け)、
そして同じパッケージ内で、モデルを含むインターフェースを 1 つのコマンドで。
インターフェースはサーバーのクライアントであり、ブラウザへのプライベートな経路は
ありません。オープンソースの隣人たち。 どれが合うかは、あなたの問題がどのレイヤーにあるか、 そして Firefox と Chromium のどちらが必要かによります: Playwright を検出されなくする 3 つの方法 は 各レイヤーが何に到達できるかを掘り下げ、AI ブラウザエージェントとステルス はあなたの代わりに Chromium を CDP より選ぶフレームワークを扱います。
Firefox 側
Chromium 側
undetected-chromedriver の後継で、CDP 経由で Chrome を操作します。比較。Runtime.enable の CDP リークを修正します。比較。playwright-python を指しています。その推奨が何についてなのか。以下のすべてに 2 つのルールが当てはまります。すべての値はページが問い合わせる前に、 ブラウザ内部で決定されるため、見つけられる JavaScript シムはありません。そしてすべての値は 1 つのプロファイルから来るため、2 つのサーフェスが矛盾することはなく、これが なりすましブラウザが通常捕まる方法です。ソース: feder-cr/firefox_antidetect_patch。
アイデンティティ
navigator、ユーザーエージェント、クライアントヒントは一緒に導出されるため、矛盾できません: Playwright は navigator.webdriver を設定するか、クライアントヒントと Sec-Fetch。navigator.languages と Accept-Language ヘッダーは同じ宣言であり、送信され、読み取られます: Accept-Language と navigator.languages。devicePixelRatio、それを露出するメディアクエリは、ホストから読み取られるのではなく宣言されます: devicePixelRatio と Firefox の pref、CSS メディアクエリフィンガープリンティング。レンダリング
measureText は 1 回の呼び出しで 10 個以上の数値を返し、権限プロンプトはありません: measureText と TextMetrics。オーディオとメディア
ネットワーク
自動化レイヤー
isTrusted は真であるから真になります: Playwright のクリックと isTrusted。null を読み取ります: クローズド shadow root。MIT - LICENSE を参照。パッチを当てた Firefox バイナリは MPL-2.0 (Firefox 上流ライセンス) の下で配布されます。そのバイナリを生成する mozilla-central に対する C++ パッチは feder-cr/firefox_antidetect_patch にあります。
このプロジェクトは教育目的のみです。現状のまま提供され、いかなる保証もありません。その使用方法について一切の責任を負いません。自己責任で、かつお住まいの法域の法律を遵守して使用してください。
Built by Federico Elia