
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
次のコマンドで全ての変更を簡単に元に戻せます:
npx rebrowser-patches@latest unpatch --packageName puppeteer-core
パッケージのフォルダへのフルパスを指定してパッチを適用することもできます。次に例を示します:
npx rebrowser-patches@latest patch --packagePath /web/app/node_modules/puppeteer-core-custom
npx rebrowser-patches@latest --help を実行すると、すべてのコマンドラインオプションを確認できます。ただし、現在は1つのライブラリに対して1つのパッチしかないため、何も設定する必要はありません。
⚠️ プロジェクトフォルダで npm install または yarn install を実行すると、パッチによるすべての変更が上書きされる可能性があることに注意してください。パッチを維持するには、パッチャーを再度実行する必要があります。
すでにパッケージにパッチを適用していて、rebrowser-patchesの最新バージョンに更新したい場合、最も簡単な方法は node_modules/puppeteer-core を削除し、npm install または yarn install --check-files を実行してから、npx rebrowser-patches@latest patch を実行することです。
これらのバージョンはすべて、Node.js版Playwrightの単なるラッパーです。Playwrightパッケージ内の driver フォルダを見つけ、--packagePath=$yourDriverFolder/$yourPlatform/package を指定してこのパッチを実行する必要があります。
✅ 最新の完全テスト済みバージョン:24.8.1(2025-05-06リリース)
Playwrightパッチには以下が含まれます:
Runtime.enable リーク:addBinding および alwaysIsolatedモード。REBROWSER_PATCHES_UTILITY_WORLD_NAME 環境変数によるユーティリティワールド名の変更機能。重要:page.pause() メソッドは有効化された修正では機能しません。さらなる調査が必要です。デバッグ中は REBROWSER_PATCHES_RUNTIME_FIX_MODE=0 環境変数を使用して修正を完全に無効にできます。
これらのパッチは現在のところChromeでのみ動作します。どうしてもWebKitやFirefoxで使用したい場合は、新しいイシューを開いてください。
✅ 最新の完全テスト済みバージョン:1.52.0(2025-04-17リリース)
puppeteer-extra と一緒に rebrowser-puppeteer を使用するには?addExtra メソッドを使用します。次に例を示します:
// before
import puppeteer from 'puppeteer-extra'
// after
import { addExtra } from 'puppeteer-extra'
import rebrowserPuppeteer from 'rebrowser-puppeteer-core'
const puppeteer = addExtra(rebrowserPuppeteer)
現在、Web自動化の透明性を向上させるためのさらなるパッチを開発中で、まもなくこのリポジトリで公開される予定です。⭐️ スターまたはウォッチボタンをクリックしてプロジェクトをサポートしてください。
💭 アイデア、考え、質問があれば、メール または イシューセクション でお気軽にチームにご連絡ください。
⚠️ この修正だけではブラウザが完全に堅牢で検出不可能になるわけではないことを理解することが重要です。プロキシ、適切なユーザーエージェントとフィンガープリント(canvas、WebGL)など、他の多くの側面に対処する必要があります。
常に心に留めておいてください:JSインジェクションによるブラウザ内部の操作が少ないほど、良い結果が得られます。console、navigatorなどの内部オブジェクトがProxyオブジェクトやObject.definePropertyの影響を受けたことを検出する方法があります。これは厄介ですが、常にいたちごっこです。
すべてを試してもまだ問題が発生する場合は、イシューセクションで質問するか、Rebrowserのクラウドソリューションの利用を検討してください。
このパッケージは Rebrowser によってスポンサーされ、メンテナンスされています。当社は、数百のユニークなフィンガープリントを使用したクラウドでのブラウザ自動化とWebスクレイピングのスケーリングを可能にします。
当社のクラウドブラウザは優れた成功率を誇り、実行中にライブラリが Runtime.Enable を使用している場合や改善できる他の危険信号がある場合の通知などの便利な機能が付属しています。アカウントを作成 して、最先端のプラットフォームをテストするための招待を受け、自動化ビジネスを次のレベルに引き上げましょう。
Windowsマシンでこのパッチャーを実行しようとすると、patchコマンドが見つからないためエラーが発生する可能性があります。これを修正するには、patch.exeを含む Git をインストールする必要があります。インストール後、PATHに追加する必要があります:
set PATH=%PATH%;C:\Program Files\Git\usr\bin\
patch.exeが正しくインストールされているかどうかは、次のコマンドで確認できます:
patch -v
zfcsoftware/puppeteer-real-browser - 自動化コミュニティへの一般的なアイデアと貢献
Kaliiiiiiiiii-Vinyzu/patchright - Playwrightのリークを修正するパッチ群
kaliiiiiiiiii/brotector - モダンなテスト群、CDPとdevtoolsを区別するアルゴリズム
prescience-data/harden-puppeteer - 分離ワールドでの実行の先駆者の1つ
puppeteer-extra-plugin-stealth - すべてが始まった場所。すべてのコントリビューターとコミュニティに多大な敬意を表します 🙏 berstendとその仲間たちは最高です