
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.