
Raccolta di patch per puppeteer e playwright per evitare il rilevamento dell'automazione e le perdite. Aiuta a evitare le pagine CAPTCHA di Cloudflare e DataDome. Facile da applicare/rimuovere, attivabile/disattivabile al bisogno.
Questa repository contiene patch per migliorare le librerie di automazione web più popolari. Nello specifico, si rivolge ai pacchetti puppeteer e playwright.
Alcuni aspetti delle librerie di automazione o del comportamento del browser non possono essere modificati tramite impostazioni o opzioni da riga di comando. Per questo motivo risolviamo questi problemi applicando patch al codice sorgente della libreria. Sebbene questo approccio sia fragile e possa rompersi quando il codice sorgente delle librerie cambia nel tempo, l'obiettivo è mantenere questa repository con l'aiuto della community per tenere le patch aggiornate.
Nella configurazione predefinita, Puppeteer e Playwright presentano alcune significative falle facili da rilevare. Non importa quanto siano buoni i tuoi proxy, le impronte digitali e gli script comportamentali: se non hai applicato le patch, sei solo una grande bandiera rossa per qualsiasi sito importante.
🕵️ Puoi testare facilmente la tua configurazione di automazione per le principali rilevazioni moderne con rebrowser-bot-detector (fonti e dettagli)
| Prima delle patch 👎 | Dopo le patch 👍 |
|---|---|
![]() | ![]() |
Se non vuoi sporcarti le mani con le patch e tutti i possibili errori, per te esiste una soluzione drop-in. Questi pacchetti hanno semplicemente applicato rebrowser-patches sopra il codice originale, nient'altro.
Puppeteer: rebrowser-puppeteer (src) e rebrowser-puppeteer-core (src)
Playwright (Node.js): rebrowser-playwright (src) e rebrowser-playwright-core (src)
Playwright (Python): rebrowser-playwright (src)
Il modo più semplice per iniziare a usarlo è modificare il tuo package.json per usare i nuovi pacchetti mantenendo il vecchio nome come alias. In questo modo non devi cambiare nessun codice sorgente della tua automazione. Ecco come fare:
package.json e sostituisci "puppeteer": "^23.3.1" e "puppeteer-core": "^23.3.1" con "puppeteer": "npm:rebrowser-puppeteer@^23.3.1" e "puppeteer-core": "npm:rebrowser-puppeteer-core@^23.3.1". Nota: 23.3.1 è solo un esempio, controlla l'ultima versione su npm.npm install (oppure yarn install)Un altro modo è usare direttamente i nuovi pacchetti al posto di quelli originali. Ecco i passaggi da seguire:
package.json e sostituisci i pacchetti puppeteer e puppeteer-core con rebrowser-puppeteer e rebrowser-puppeteer-core. Non cambiare le versioni dei pacchetti, sostituisci solo i nomi.npm install (o yarn install)puppeteer e puppeteer-core con rebrowser-puppeteer e rebrowser-puppeteer-core🚀 Tutto qui! Visita semplicemente la pagina rebrowser-bot-detector e testa il tuo browser con le patch applicate.
Il nostro obiettivo è mantenere e supportare questi pacchetti sostitutivi drop-in con le ultime versioni, ma ci concentriamo soprattutto sulle versioni recenti; quindi, se stai ancora usando puppeteer 13.3.7 dei primi anni '90, potrebbe essere il momento giusto per aggiornare. C'è un'alta probabilità che non rompa nulla, dato che l'API è abbastanza stabile nel tempo.
Runtime.EnableLe librerie di automazione più diffuse si affidano al comando CDP Runtime.Enable, che consente di ricevere eventi dal dominio Runtime.. Questo è fondamentale per gestire i contesti di esecuzione usati per valutare JavaScript nelle pagine, una funzionalità chiave per qualsiasi processo di automazione.
Tuttavia, esiste una tecnica che rileva l'utilizzo di questo comando, rivelando che il browser è controllato da software di automazione come Puppeteer o Playwright. Questa tecnica è usata da tutti i principali software anti-bot, come Cloudflare, DataDome e altri.
Abbiamo preparato un articolo completo sulla nostra indagine su questa falla, che puoi leggere nel nostro blog.
Per maggiori dettagli su questa tecnica, leggi il post del blog di DataDome: Come il nuovo Headless Chrome e il segnale CDP influenzano il rilevamento dei bot.
In breve, si tratta di poche righe di JavaScript nella pagina che vengono chiamate automaticamente se Runtime.Enable è stato utilizzato.
La nostra correzione disabilita il comando automatico Runtime.Enable su ogni frame. Al suo posto, creiamo manualmente contesti con ID sconosciuti quando viene creato un frame. Poi, quando il codice deve essere eseguito, ci sono diversi modi per ottenere l'ID del contesto.
🟢 Pro: L'approccio definitivo che mantiene l'accesso al main world e funziona con i web worker e gli iframe. Non devi modificare nessuna parte del tuo codebase esistente.
🔴 Contro: Nessuno scoperto finora.
Page.createIsolatedWorld e salva il suo ID.🟢 Pro: Tutto il tuo codice verrà eseguito in un mondo isolato separato, impedendo agli script della pagina di rilevare le tue modifiche tramite MutationObserver e altre tecniche.
🔴 Contro: Non potrai accedere alle variabili e al codice del contesto principale. Sebbene questo sia necessario per alcuni casi d'uso, il contesto isolato funziona generalmente bene nella maggior parte degli scenari. Inoltre, i web worker non consentono di creare nuovi mondi, quindi non puoi eseguire il tuo codice all'interno di un worker. È un caso d'uso di nicchia, ma potrebbe essere rilevante in alcune situazioni. Esiste un workaround per questo problema: leggi Come accedere agli oggetti del contesto principale da un contesto isolato in Puppeteer & Playwright.
Runtime.Enable e poi immediatamente Runtime.Disable.Questo attiva gli eventi Runtime.executionContextCreated, permettendoci di catturare l'ID del contesto corretto.
🟢 Pro: Avrai accesso completo al contesto principale.
🔴 Contro: C'è una piccola possibilità che durante questa breve finestra temporale la pagina chiami del codice che porta alla perdita. Il rischio è basso, poiché il codice di rilevamento viene solitamente chiamato durante azioni specifiche come pagine CAPTCHA o moduli di login/registrazione, in genere subito dopo il caricamento della pagina. La tua logica di business viene di solito chiamata un po' più tardi.
🎉 I nostri test mostrano che tutti questi approcci sono attualmente non rilevabili da Cloudflare o DataDome.
Nota: puoi modificare le impostazioni di questa patch al volo usando una variabile d'ambiente. Questo ti consente di passare facilmente tra versioni con patch e senza patch in base alla tua logica di business.
REBROWSER_PATCHES_RUNTIME_FIX_MODE=addBinding — tecnica addBinding (predefinita)REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated — esegui sempre tutti gli script in un contesto isolatoREBROWSER_PATCHES_RUNTIME_FIX_MODE=enableDisable — usa la tecnica Enable/DisableREBROWSER_PATCHES_RUNTIME_FIX_MODE=0 — disabilita completamente la correzione per questa fallaREBROWSER_PATCHES_DEBUG=1 — abilita alcuni messaggi di debugRicorda che puoi impostare queste variabili in modi diversi, ad esempio nel codice:
process.env.REBROWSER_PATCHES_RUNTIME_FIX_MODE = "alwaysIsolated"
oppure da riga di comando:
REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated node app.js
Di default, Puppeteer aggiunge //# sourceURL=pptr:... a ogni script in page.evaluate(). Un sito web remoto può rilevare questo comportamento e alzare bandiere rosse. Questa patch lo cambia in //# sourceURL=app.js. Puoi anche modificarlo tramite variabile d'ambiente:
# usa un qualsiasi nome di file generico
REBROWSER_PATCHES_SOURCE_URL=jquery.min.js
# usa 0 per disabilitare completamente questa patch
REBROWSER_PATCHES_SOURCE_URL=0
A volte può essere molto utile accedere a una sessione CDP a livello di browser. Ad esempio, quando vuoi implementare un comando CDP personalizzato. Esiste un metodo page._client() che restituisce la sessione CDP per l'istanza della pagina corrente, ma non esiste un metodo analogo per l'istanza del browser. Questa patch aggiunge un nuovo metodo _connection() alla classe Browser, così puoi usarlo in questo modo:
browser._connection().on('Rebrowser.addRunEvent', (params) => { ... })
Nota: non è rilevabile dagli script esterni del sito, è solo per tua comodità.
Il nome predefinito del utility world è '__puppeteer_utility_world__' + packageVersion. A volte potresti volerlo cambiare in qualcos'altro. Questa patch lo cambia in util e ti permette di personalizzarlo tramite variabile d'ambiente:
REBROWSER_PATCHES_UTILITY_WORLD_NAME=customUtilityWorld
# usa 0 per disabilitare completamente questa patch
REBROWSER_PATCHES_UTILITY_WORLD_NAME=0
Questa variabile d'ambiente non può essere cambiata al volo: devi impostarla prima di eseguire lo script perché viene utilizzata nel momento in cui il modulo viene importato.
| Prima della patch 👎 | Dopo la patch 👍 |
|---|---|
![]() | ![]() |
Nota: non è rilevabile dagli script esterni del sito, ma Google potrebbe usare queste informazioni nel suo Chrome proprietario; non lo sappiamo mai.
Questo pacchetto è progettato per essere eseguito su una libreria già installata. Installa la libreria, poi avvia il patcher, ed è tutto pronto.
Nella cartella root del tuo progetto, esegui:
npx rebrowser-patches@latest patch --packageName puppeteer-core
Puoi facilmente annullare tutte le modifiche con questo comando:
npx rebrowser-patches@latest unpatch --packageName puppeteer-core
Puoi anche applicare la patch a un pacchetto fornendo il percorso completo della sua cartella, ad esempio:
npx rebrowser-patches@latest patch --packagePath /web/app/node_modules/puppeteer-core-custom
Puoi vedere tutte le opzioni da riga di comando eseguendo npx rebrowser-patches@latest --help, ma al momento c'è una sola patch per una sola libreria, quindi non devi configurare nulla.
⚠️ Tieni presente che dopo aver eseguito npm install o yarn install nella cartella del tuo progetto, potrebbe sovrascrivere tutte le modifiche delle patch. Dovrai eseguire di nuovo il patcher per mantenere le patch applicate.
Se hai già applicato le patch al tuo pacchetto e vuoi aggiornare all'ultima versione di rebrowser-patches, il modo più semplice è eliminare node_modules/puppeteer-core, poi eseguire npm install o yarn install --check-files, e infine eseguire npx rebrowser-patches@latest patch.
Tutte queste versioni sono solo wrapper attorno alla versione Node.js di Playwright. Devi trovare la cartella driver all'interno del tuo pacchetto Playwright ed eseguire questa patch con --packagePath=$yourDriverFolder/$yourPlatform/package.
✅ Ultima versione testata completamente: 24.8.1 (rilasciata il 2025-05-06)
Le patch per Playwright includono:
Runtime.enable: modalità addBinding e alwaysIsolated.REBROWSER_PATCHES_UTILITY_WORLD_NAME.Importante: il metodo page.pause() non funziona con la correzione attivata, richiede ulteriori indagini. Puoi semplicemente disabilitare completamente la correzione durante il debug usando la variabile d'ambiente REBROWSER_PATCHES_RUNTIME_FIX_MODE=0.
Queste patch funzionano per ora solo con Chrome. Se vuoi davvero usarle con WebKit o Firefox, apri una nuova issue.
✅ Ultima versione testata completamente: 1.52.0 (rilasciata il 2025-04-17)
rebrowser-puppeteer con puppeteer-extra?Usa il metodo addExtra, ecco l'esempio:
// before
import puppeteer from 'puppeteer-extra'
// after
import { addExtra } from 'puppeteer-extra'
import rebrowserPuppeteer from 'rebrowser-puppeteer-core'
const puppeteer = addExtra(rebrowserPuppeteer)
Stiamo attualmente sviluppando altre patch per migliorare la trasparenza dell'automazione web, che saranno rilasciate presto in questa repository. Ti chiediamo di sostenere il progetto cliccando su ⭐️ stella o sul pulsante watch.
💭 Se hai idee, pensieri o domande, non esitare a contattare il nostro team via email o usa la sezione issues.
⚠️ È importante sapere che questa correzione da sola non renderà il tuo browser a prova di proiettile e non rilevabile. Devi considerare molti altri aspetti come proxy, un user-agent corretto e impronte digitali (canvas, WebGL) e altro ancora.
Tieni sempre presente: meno manipoli gli internals del browser tramite iniezioni JS, meglio è. Esistono modi per rilevare che oggetti interni come console, navigator e altri sono stati alterati da oggetti Proxy o da Object.defineProperty. È complicato, ma è sempre un gioco del gatto col topo.
Se hai provato di tutto e hai ancora problemi, prova a fare una domanda nella sezione issues o prendi in considerazione l'uso delle soluzioni cloud di Rebrowser.
Questo pacchetto è sponsorizzato e mantenuto da Rebrowser. Ti permettiamo di scalare la tua automazione del browser e il web scraping nel cloud con centinaia di impronte digitali uniche.
I nostri browser cloud hanno ottimi tassi di successo e offrono funzionalità interessanti come notifiche se la tua libreria usa Runtime.Enable durante l'esecuzione o ha altre bandiere rosse che potrebbero essere migliorate. Crea un account oggi per essere invitato a testare la nostra piattaforma all'avanguardia e portare la tua attività di automazione al livello successivo.
Quando provi a eseguire questo patcher su una macchina Windows, probabilmente incontrerai un errore perché il comando patch non viene trovato. Per risolvere, devi installare Git, che include patch.exe. Dopo averlo installato, devi aggiungerlo al tuo PATH:
set PATH=%PATH%;C:\Program Files\Git\usr\bin\
Puoi verificare che patch.exe sia installato correttamente usando il seguente comando:
patch -v
zfcsoftware/puppeteer-real-browser - idee generali e contributo alla community dell'automazione
Kaliiiiiiiiii-Vinyzu/patchright - set di patch per correggere le perdite di Playwright
kaliiiiiiiiii/brotector - alcuni test moderni, algoritmo per distinguere CDP dai devtools
prescience-data/harden-puppeteer - uno dei pionieri dell'esecuzione in un mondo isolato
puppeteer-extra-plugin-stealth - dove tutto è iniziato, un grande plauso a tutti i contributori e alla community 🙏 berstend e soci sono i GOAT