
Collection de correctifs pour puppeteer et playwright afin d'éviter la détection d'automatisation et les fuites. Aide à éviter les pages CAPTCHA de Cloudflare et DataDome. Facile à patcher/dépatcher, peut être activé/désactivé à la demande.
Ce dépôt contient des correctifs pour améliorer les bibliothèques d'automatisation web populaires. Plus précisément, il cible les packages puppeteer et playwright.
Certains aspects des bibliothèques d'automatisation ou du comportement du navigateur ne peuvent pas être ajustés via les paramètres ou les options de ligne de commande. C'est pourquoi nous corrigeons ces problèmes en patchant le code source de la bibliothèque. Bien que cette approche soit fragile et puisse se casser au fil du temps lorsque le code source des bibliothèques évolue, l'objectif est de maintenir ce dépôt avec l'aide de la communauté pour garder les correctifs à jour.
Par défaut, Puppeteer et Playwright présentent des fuites importantes et faciles à détecter. Peu importe la qualité de vos proxys, de vos empreintes numériques et de vos scripts de comportement : si vous n'avez pas appliqué les correctifs, vous n'êtes qu'un énorme drapeau rouge pour tout site web majeur.
🕵️ Vous pouvez facilement tester votre configuration d'automatisation face aux principales détections modernes avec rebrowser-bot-detector (sources et détails)
| Avant les correctifs 👎 | Après les correctifs 👍 |
|---|---|
![]() | ![]() |
Si vous ne voulez pas vous embêter avec les correctifs et toutes les erreurs possibles, il existe une solution de remplacement direct pour vous. Ces packages appliquent simplement rebrowser-patches par-dessus le code d'origine, rien de plus.
Puppeteer : rebrowser-puppeteer (src) et rebrowser-puppeteer-core (src)
Playwright (Node.js) : rebrowser-playwright (src) et rebrowser-playwright-core (src)
Playwright (Python) : rebrowser-playwright (src)
Le moyen le plus simple de commencer est de modifier votre package.json pour utiliser les nouveaux packages tout en conservant l'ancien nom comme alias. Ainsi, vous n'avez pas besoin de modifier le code source de votre automatisation. Voici comment procéder :
package.json et remplacez "puppeteer": "^23.3.1" et "puppeteer-core": "^23.3.1" par "puppeteer": "npm:rebrowser-puppeteer@^23.3.1" et "puppeteer-core": "npm:rebrowser-puppeteer-core@^23.3.1". Remarque : 23.3.1 n'est qu'un exemple, vérifiez la dernière version sur npm.npm install (ou yarn install)Une autre façon est d'utiliser directement les nouveaux packages à la place de ceux d'origine. Voici les étapes à suivre :
package.json et remplacez les packages puppeteer et puppeteer-core par rebrowser-puppeteer et rebrowser-puppeteer-core. Ne changez pas les versions des packages, remplacez uniquement les noms.npm install (ou yarn install)puppeteer et puppeteer-core par rebrowser-puppeteer et rebrowser-puppeteer-core🚀 Et voilà ! Il ne vous reste plus qu'à visiter la page rebrowser-bot-detector et à tester votre navigateur patché.
Notre objectif est de maintenir et de prendre en charge ces packages de remplacement direct avec les dernières versions, mais nous nous concentrons principalement sur les versions récentes, donc si vous utilisez encore puppeteer 13.3.7 du début des années 90, il est peut-être temps de passer à une version supérieure. Il y a de fortes chances que cela ne casse rien, car l'API est assez stable dans le temps.
Runtime.EnableLes bibliothèques d'automatisation populaires s'appuient sur la commande CDP Runtime.Enable, qui permet de recevoir des événements du domaine Runtime.. C'est crucial pour gérer les contextes d'exécution utilisés afin d'évaluer du JavaScript sur les pages, une fonctionnalité clé pour tout processus d'automatisation.
Cependant, il existe une technique qui détecte l'utilisation de cette commande, révélant que le navigateur est contrôlé par un logiciel d'automatisation comme Puppeteer ou Playwright. Cette technique est utilisée par tous les principaux logiciels anti-bot tels que Cloudflare, DataDome, et d'autres.
Nous avons préparé un article complet sur notre enquête concernant cette fuite, que vous pouvez lire sur notre blog.
Pour plus de détails sur cette technique, lisez l'article de blog de DataDome : How New Headless Chrome & the CDP Signal Are Impacting Bot Detection.
En bref, il s'agit de quelques lignes de JavaScript sur la page qui sont automatiquement appelées si Runtime.Enable a été utilisé.
Notre correctif désactive la commande automatique Runtime.Enable sur chaque frame. À la place, nous créons manuellement des contextes avec des ID inconnus lorsqu'un frame est créé. Ensuite, lorsque du code doit être exécuté, il existe plusieurs façons d'obtenir l'ID du contexte.
🟢 Avantages : L'approche ultime qui conserve l'accès au monde principal et fonctionne avec les web workers et les iframes. Vous n'avez pas besoin de modifier votre code existant.
🔴 Inconvénients : Aucun découvert jusqu'à présent.
Page.createIsolatedWorld et enregistrer son ID.🟢 Avantages : Tout votre code sera exécuté dans un monde isolé séparé, empêchant les scripts de la page de détecter vos modifications via MutationObserver et d'autres techniques.
🔴 Inconvénients : Vous ne pourrez pas accéder aux variables et au code du contexte principal. Bien que cela soit nécessaire pour certains cas d'usage, le contexte isolé fonctionne généralement bien dans la plupart des scénarios. De plus, les web workers ne permettent pas de créer de nouveaux mondes, vous ne pouvez donc pas exécuter votre code dans un worker. C'est un cas d'usage de niche, mais cela peut avoir son importance dans certaines situations. Il existe une solution de contournement pour ce problème, veuillez lire How to Access Main Context Objects from Isolated Context in Puppeteer & Playwright.
Runtime.Enable puis immédiatement Runtime.Disable.Cela déclenche les événements Runtime.executionContextCreated, ce qui nous permet de capturer le bon ID de contexte.
🟢 Avantages : Vous aurez un accès complet au contexte principal.
🔴 Inconvénients : Il y a une légère chance que pendant ce court laps de temps, la page appelle du code qui entraîne la fuite. Le risque est faible, car le code de détection est généralement appelé lors d'actions spécifiques comme les pages CAPTCHA ou les formulaires de connexion/inscription, typiquement juste après le chargement de la page. Votre logique métier est généralement appelée un peu plus tard.
🎉 Nos tests montrent que toutes ces approches sont actuellement indétectables par Cloudflare ou DataDome.
Remarque : vous pouvez modifier les paramètres de ce correctif à la volée à l'aide d'une variable d'environnement. Cela vous permet de basculer facilement entre les versions patchées et non patchées en fonction de votre logique métier.
REBROWSER_PATCHES_RUNTIME_FIX_MODE=addBinding — technique addBinding (par défaut)REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated — exécuter toujours tous les scripts dans un contexte isoléREBROWSER_PATCHES_RUNTIME_FIX_MODE=enableDisable — utiliser la technique Enable/DisableREBROWSER_PATCHES_RUNTIME_FIX_MODE=0 — désactiver complètement le correctif pour cette fuiteREBROWSER_PATCHES_DEBUG=1 — activer quelques messages de débogageRappelez-vous que vous pouvez définir ces variables de différentes manières, par exemple dans le code :
process.env.REBROWSER_PATCHES_RUNTIME_FIX_MODE = "alwaysIsolated"
ou en ligne de commande :
REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated node app.js
Par défaut, Puppeteer ajoute //# sourceURL=pptr:... à chaque script dans page.evaluate(). Un site web distant peut détecter ce comportement et lever des drapeaux rouges.
Ce correctif le remplace par //# sourceURL=app.js. Vous pouvez également l'ajuster via une variable d'environnement :
# use any generic filename
REBROWSER_PATCHES_SOURCE_URL=jquery.min.js
# use 0 to completely disable this patch
REBROWSER_PATCHES_SOURCE_URL=0
Parfois, il peut être très utile d'accéder à une session CDP au niveau du navigateur. Par exemple, lorsque vous souhaitez implémenter une commande CDP personnalisée. Il existe une méthode page._client() qui renvoie la session CDP pour l'instance de page actuelle, mais il n'existe pas de méthode équivalente pour l'instance du navigateur.
Ce correctif ajoute une nouvelle méthode _connection() à la classe Browser, que vous pouvez utiliser ainsi :
browser._connection().on('Rebrowser.addRunEvent', (params) => { ... })
Remarque : ce n'est pas détectable par les scripts de sites web externes, c'est simplement pour votre confort.
Le nom du monde utilitaire par défaut est '__puppeteer_utility_world__' + packageVersion. Vous souhaiterez parfois le changer. Ce correctif le remplace par util et vous permet de le personnaliser via une variable d'environnement :
REBROWSER_PATCHES_UTILITY_WORLD_NAME=customUtilityWorld
# use 0 to completely disable this patch
REBROWSER_PATCHES_UTILITY_WORLD_NAME=0
Cette variable d'environnement ne peut pas être modifiée à la volée, vous devez la définir avant d'exécuter votre script car elle est utilisée au moment où le module est importé.
| Avant le correctif 👎 | Après le correctif 👍 |
|---|---|
![]() |
Remarque : ce n'est pas détectable par les scripts de sites web externes, mais Google pourrait utiliser cette information dans son Chrome propriétaire ; on ne sait jamais.
Ce package est conçu pour être exécuté sur une bibliothèque installée. Installez la bibliothèque, appelez ensuite le patcher, et c'est prêt.
Dans le dossier racine de votre projet, exécutez :
npx rebrowser-patches@latest patch --packageName puppeteer-core
Vous pouvez facilement annuler toutes les modifications avec cette commande :
npx rebrowser-patches@latest unpatch --packageName puppeteer-core
Vous pouvez également patcher un package en fournissant le chemin complet de son dossier, par exemple :
npx rebrowser-patches@latest patch --packagePath /web/app/node_modules/puppeteer-core-custom
Vous pouvez voir toutes les options de ligne de commande en exécutant npx rebrowser-patches@latest --help, mais actuellement, il n'y a qu'un seul correctif pour une seule bibliothèque, vous n'avez donc rien à configurer.
⚠️ Sachez qu'après avoir exécuté npm install ou yarn install dans votre dossier de projet, cela pourrait écraser toutes les modifications apportées par les correctifs. Vous devrez relancer le patcher pour conserver les correctifs en place.
Si votre package est déjà patché et que vous souhaitez passer à la dernière version de rebrowser-patches, le moyen le plus simple est de supprimer node_modules/puppeteer-core, puis d'exécuter npm install ou yarn install --check-files, puis npx rebrowser-patches@latest patch.
Toutes ces versions ne sont que des wrappers autour de la version Node.js de Playwright. Vous devez trouver le dossier driver dans votre package Playwright et exécuter ce correctif avec --packagePath=$yourDriverFolder/$yourPlatform/package.
✅ Dernière version entièrement testée : 24.8.1 (publiée le 2025-05-06)
Les correctifs Playwright incluent :
Runtime.enable : modes addBinding et alwaysIsolated.REBROWSER_PATCHES_UTILITY_WORLD_NAME.Important : la méthode page.pause() ne fonctionne pas avec le correctif activé, elle nécessite des investigations supplémentaires. Vous pouvez simplement désactiver complètement le correctif pendant le débogage en utilisant la variable d'environnement REBROWSER_PATCHES_RUNTIME_FIX_MODE=0.
Ces correctifs ne fonctionnent pour l'instant qu'avec Chrome. Si vous souhaitez vraiment l'utiliser avec WebKit ou Firefox, veuillez ouvrir une nouvelle issue.
✅ Dernière version entièrement testée : 1.52.0 (publiée le 2025-04-17)
rebrowser-puppeteer avec puppeteer-extra ?Utilisez la méthode addExtra, voici l'exemple :
// before
import puppeteer from 'puppeteer-extra'
// after
import { addExtra } from 'puppeteer-extra'
import rebrowserPuppeteer from 'rebrowser-puppeteer-core'
const puppeteer = addExtra(rebrowserPuppeteer)
Nous développons actuellement d'autres correctifs pour améliorer la transparence de l'automatisation web, qui seront bientôt publiés dans ce dépôt. Veuillez soutenir le projet en cliquant sur le bouton ⭐️ étoile ou watch.
💭 Si vous avez des idées, des réflexions ou des questions, n'hésitez pas à contacter notre équipe par email ou à utiliser la section issues.
⚠️ Il est important de savoir que ce correctif seul ne rendra pas votre navigateur incassable et indétectable. Vous devez traiter de nombreux autres aspects tels que les proxys, un user-agent approprié et les empreintes numériques (canvas, WebGL), et bien plus.
Gardez toujours à l'esprit : moins vous manipulez les composants internes du navigateur via des injections JS, mieux c'est. Il existe des moyens de détecter que des objets internes tels que console, navigator, et d'autres ont été modifiés par des objets Proxy ou Object.defineProperty. C'est délicat, mais c'est toujours un jeu du chat et de la souris.
Si vous avez tout essayé et que vous rencontrez toujours des problèmes, essayez de poser une question dans la section issues ou envisagez d'utiliser les solutions cloud de Rebrowser.
Ce package est sponsorisé et maintenu par Rebrowser. Nous vous permettons de faire évoluer votre automatisation de navigateur et votre scraping web dans le cloud avec des centaines d'empreintes numériques uniques.
Nos navigateurs cloud ont d'excellents taux de réussite et offrent de belles fonctionnalités, comme des notifications si votre bibliothèque utilise Runtime.Enable pendant l'exécution ou présente d'autres drapeaux rouges qui pourraient être améliorés. Créez un compte dès aujourd'hui pour être invité à tester notre plateforme de pointe et faire passer votre activité d'automatisation au niveau supérieur.
Lorsque vous essayez d'exécuter ce patcher sur une machine Windows, vous rencontrerez probablement une erreur car la commande patch est introuvable. Pour y remédier, vous devez installer Git, qui inclut patch.exe. Après l'avoir installé, vous devez l'ajouter à votre PATH :
set PATH=%PATH%;C:\Program Files\Git\usr\bin\
Vous pouvez vérifier que patch.exe est correctement installé en utilisant la commande suivante :
patch -v
zfcsoftware/puppeteer-real-browser - idées générales et contribution à la communauté de l'automatisation
Kaliiiiiiiiii-Vinyzu/patchright - ensemble de correctifs pour résoudre les fuites de Playwright
kaliiiiiiiiii/brotector - quelques tests modernes, algorithme pour distinguer CDP des devtools
prescience-data/harden-puppeteer - l'un des pionniers de l'exécution dans un monde isolé
puppeteer-extra-plugin-stealth - là où tout a commencé, un grand merci à tous les contributeurs et à la communauté 🙏 berstend et co sont les plus grands