
puppeteer と playwright 向けパッチ集。自動化検出や情報漏えいを回避し、Cloudflare や DataDome の CAPTCHA ページを回避するのに役立ちます。パッチの適用/解除が簡単で、必要に応じて有効/無効化できます。
このリポジトリには、人気のあるWeb自動化ライブラリを強化するパッチが含まれています。具体的には、puppeteer と playwright パッケージを対象としています。
自動化ライブラリやブラウザの動作の中には、設定やコマンドラインスイッチでは調整できないものがあります。そこで、ライブラリのソースコードにパッチを当てることでこれらの問題を修正します。このアプローチは脆弱で、ライブラリのソースコードが時間とともに変化すると壊れる可能性がありますが、コミュニティの助けを借りてパッチを最新に保つことがこのリポジトリの目標です。
初期状態のPuppeteerとPlaywrightには、簡単に検出できる重大なリークがいくつかあります。プロキシ、フィンガープリント、行動スクリプトがどれほど優れていても、パッチを当てていなければ、主要なWebサイトにとってはただの大きな危険信号です。
🕵️ rebrowser-bot-detector を使用すると、主要な最新の検出に対する自動化設定を簡単にテストできます(ソースと詳細)
| パッチ適用前 👎 | パッチ適用後 👍 |
|---|---|
![]() | ![]() |
パッチや起こりうるエラーに対処したくない場合は、ドロップインソリューションがあります。これらのパッケージは、元のコードの上にrebrowser-patchesを適用しただけで、それ以上のものではありません。
Puppeteer: rebrowser-puppeteer(ソース)および rebrowser-puppeteer-core(ソース)
Playwright (Node.js): rebrowser-playwright(ソース)および rebrowser-playwright-core(ソース)
Playwright (Python): rebrowser-playwright(ソース)
使い始める最も簡単な方法は、package.json を修正して新しいパッケージを使用しつつ、古い名前をエイリアスとして維持することです。これにより、自動化のソースコードを変更する必要はありません。手順は次のとおりです:
package.json を開き、"puppeteer": "^23.3.1" と "puppeteer-core": "^23.3.1" を "puppeteer": "npm:rebrowser-puppeteer@^23.3.1" と "puppeteer-core": "npm:rebrowser-puppeteer-core@^23.3.1" に置き換えます。注:23.3.1は単なる例です。npm で最新バージョンを確認してください。npm install(または yarn install)を実行しますもう1つの方法は、元のパッケージの代わりに新しいパッケージを実際に使用することです。従うべき手順は次のとおりです:
package.json を開き、puppeteer と puppeteer-core パッケージを rebrowser-puppeteer と rebrowser-puppeteer-core に置き換えます。パッケージのバージョンは変更せず、名前だけを置き換えてください。npm install(または yarn install)を実行しますpuppeteer と puppeteer-core への言及をすべて rebrowser-puppeteer と rebrowser-puppeteer-core に検索・置換します🚀 これで完了です!rebrowser-bot-detector ページにアクセスして、パッチ済みブラウザをテストしてください。
私たちの目標は、これらのドロップイン代替パッケージを最新バージョンで維持・サポートすることですが、主に新しいバージョンに焦点を当てています。90年代初頭のpuppeteer 13.3.7をまだ使っているなら、アップグレードする良い機会かもしれません。APIは長期間にわたってかなり安定しているため、実際に何かが壊れる可能性は低いです。
Runtime.Enable リークの修正人気のある自動化ライブラリは、Runtime. ドメインからイベントを受信できるようにするCDPコマンド Runtime.Enable に依存しています。これは、ページ上でJavaScriptを評価するために使用される実行コンテキストを管理するために重要であり、あらゆる自動化プロセスにとって重要な機能です。
しかし、このコマンドの使用を検出し、ブラウザがPuppeteerやPlaywrightなどの自動化ソフトウェアによって制御されていることを明らかにする手法があります。この手法は、Cloudflare、DataDomeなどの主要なアンチボットソフトウェアすべてで使用されています。
このリークに関する調査の完全な記事を用意しました。私たちのブログ で読むことができます。
この手法の詳細については、DataDomeのブログ記事をお読みください:新しいヘッドレスChromeとCDPシグナルがボット検出に与える影響。
簡単に言うと、Runtime.Enable が使用された場合に自動的に呼び出されるページ上の数行のJavaScriptです。
私たちの修正では、すべてのフレームで自動的な Runtime.Enable コマンドを無効にします。代わりに、フレームが作成されたときに不明なIDを持つコンテキストを手動で作成します。そして、コードを実行する必要がある場合、コンテキストIDを取得する方法は複数あります。
🟢 利点:メインワールドへのアクセスを維持し、Webワーカーやiframeでも動作する究極のアプローチです。既存のコードベースを変更する必要はありません。
🔴 欠点:これまでのところ発見されていません。
Page.createIsolatedWorld を使用して新しい分離コンテキストを作成し、そのIDを保存します。🟢 利点:すべてのコードが別の分離ワールドで実行されるため、ページスクリプトがMutationObserverやその他の手法で変更を検出するのを防ぎます。
🔴 欠点:メインコンテキストの変数やコードにアクセスできなくなります。一部のユースケースではこれが必要ですが、分離コンテキストはほとんどのシナリオで問題なく機能します。また、Webワーカーは新しいワールドの作成を許可しないため、ワーカー内でコードを実行することはできません。これはニッチなユースケースですが、状況によっては重要になる場合があります。この問題には回避策があります。Puppeteer & Playwrightで分離コンテキストからメインコンテキストのオブジェクトにアクセスする方法 をお読みください。
Runtime.Enable を呼び出し、その後すぐに Runtime.Disable を呼び出します。これにより Runtime.executionContextCreated イベントがトリガーされ、適切なコンテキストIDを取得できます。
🟢 利点:メインコンテキストへの完全なアクセスが得られます。
🔴 欠点:この短い時間枠の間に、ページがリークにつながるコードを呼び出すわずかな可能性があります。検出コードは通常、CAPTCHAページやログイン/登録フォームなどの特定のアクション中に呼び出され、典型的にはページの読み込み直後であるため、リスクは低いです。ビジネスロジックは通常、少し後に呼び出されます。
🎉 私たちのテストによると、これらのアプローチはすべて現在CloudflareやDataDomeでは検出できません。
注:このパッチの設定は、環境変数を使用してオンザフライで変更できます。これにより、ビジネスロジックに基づいてパッチ適用版と非適用版を簡単に切り替えることができます。
REBROWSER_PATCHES_RUNTIME_FIX_MODE=addBinding — addBindingテクニック(デフォルト)REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated — すべてのスクリプトを常に分離コンテキストで実行REBROWSER_PATCHES_RUNTIME_FIX_MODE=enableDisable — Enable/Disableテクニックを使用REBROWSER_PATCHES_RUNTIME_FIX_MODE=0 — このリークの修正を完全に無効化REBROWSER_PATCHES_DEBUG=1 — デバッグメッセージを有効化これらの変数はさまざまな方法で設定できることを覚えておいてください。たとえば、コード内では:
process.env.REBROWSER_PATCHES_RUNTIME_FIX_MODE = "alwaysIsolated"
またはコマンドラインで:
REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated node app.js
デフォルトでは、Puppeteerは page.evaluate() 内のすべてのスクリプトに //# sourceURL=pptr:... を追加します。リモートWebサイトはこの動作を検出して危険信号を発することができます。
このパッチはそれを //# sourceURL=app.js に変更します。環境変数で調整することもできます:
# use any generic filename
REBROWSER_PATCHES_SOURCE_URL=jquery.min.js
# use 0 to completely disable this patch
REBROWSER_PATCHES_SOURCE_URL=0
ブラウザレベルでCDPセッションにアクセスできると非常に便利な場合があります。たとえば、カスタムCDPコマンドを実装したい場合などです。現在のページインスタンスのCDPセッションを返す page._client() メソッドはありますが、ブラウザインスタンス用のそのようなメソッドはありません。
このパッチは、Browserクラスに新しいメソッド _connection() を追加します。次のように使用できます:
browser._connection().on('Rebrowser.addRunEvent', (params) => { ... })
注:外部Webサイトのスクリプトでは検出できません。単に開発者の利便性のためのものです。
デフォルトのユーティリティワールド名は '__puppeteer_utility_world__' + packageVersion です。これを別の名前に変更したい場合があるかもしれません。このパッチはそれを util に変更し、環境変数でカスタマイズできるようにします:
REBROWSER_PATCHES_UTILITY_WORLD_NAME=customUtilityWorld
# use 0 to completely disable this patch
REBROWSER_PATCHES_UTILITY_WORLD_NAME=0
この環境変数はオンザフライでは変更できません。モジュールがインポートされる時点で使用されるため、スクリプトを実行する前に設定する必要があります。
| パッチ適用前 👎 | パッチ適用後 👍 |
|---|---|
![]() | ![]() |
注:外部Webサイトのスクリプトでは検出できませんが、Googleが独自のChromeでこの情報を使用する可能性があります。それは誰にもわかりません。
このパッケージは、インストール済みのライブラリに対して実行されるように設計されています。ライブラリをインストールし、パッチャーを呼び出すだけで準備完了です。
プロジェクトのルートフォルダで次を実行します:
npx rebrowser-patches@latest patch --packageName puppeteer-core