
Colección de parches para puppeteer y playwright para evitar la detección de automatización y las fugas de información. Ayuda a evitar las páginas CAPTCHA de Cloudflare y DataDome. Fácil de parchear/desparchear, se puede habilitar/deshabilitar bajo demanda.
Este repositorio contiene parches para mejorar las bibliotecas populares de automatización web. Específicamente, se dirige a los paquetes puppeteer y playwright.
Algunos aspectos de las bibliotecas de automatización o del comportamiento del navegador no se pueden ajustar mediante configuraciones o parámetros de línea de comandos. Por lo tanto, solucionamos estos problemas parcheando el código fuente de la biblioteca. Si bien este enfoque es frágil y puede romperse a medida que el código fuente de las bibliotecas cambia con el tiempo, el objetivo es mantener este repositorio con ayuda de la comunidad para mantener los parches actualizados.
De fábrica, Puppeteer y Playwright vienen con algunas fugas significativas que son fáciles de detectar. No importa lo buenos que sean tus proxies, huellas digitales y scripts de comportamiento: si no lo tienes parcheado, eres una gran bandera roja para cualquier sitio web importante.
🕵️ Puedes probar fácilmente tu configuración de automatización frente a las principales detecciones modernas con rebrowser-bot-detector (fuentes y detalles)
| Antes de los parches 👎 | Después de los parches 👍 |
|---|---|
![]() | ![]() |
Si no quieres lidiar con los parches y todos los posibles errores, existe una solución de reemplazo directo para ti. Estos paquetes simplemente han aplicado rebrowser-patches sobre el código original, nada más.
Puppeteer: rebrowser-puppeteer (código fuente) y rebrowser-puppeteer-core (código fuente)
Playwright (Node.js): rebrowser-playwright (código fuente) y rebrowser-playwright-core (código fuente)
Playwright (Python): rebrowser-playwright (código fuente)
La forma más fácil de empezar a usarlo es modificar tu package.json para usar los nuevos paquetes pero mantener el nombre antiguo como alias. De esta manera, no necesitas cambiar ningún código fuente de tu automatización. Así es como se hace:
package.json y reemplaza "puppeteer": "^23.3.1" y "puppeteer-core": "^23.3.1" por "puppeteer": "npm:rebrowser-puppeteer@^23.3.1" y "puppeteer-core": "npm:rebrowser-puppeteer-core@^23.3.1". Nota: 23.3.1 es solo un ejemplo; consulta la última versión en npm.npm install (o yarn install)Otra forma es usar directamente los nuevos paquetes en lugar de los originales. Estos son los pasos que debes seguir:
package.json y reemplaza los paquetes puppeteer y puppeteer-core por rebrowser-puppeteer y rebrowser-puppeteer-core. No cambies las versiones de los paquetes, solo reemplaza los nombres.npm install (o yarn install)puppeteer y puppeteer-core por rebrowser-puppeteer y rebrowser-puppeteer-core🚀 ¡Eso es todo! Solo visita la página de rebrowser-bot-detector y prueba tu navegador parcheado.
Nuestro objetivo es mantener y dar soporte a estos paquetes de reemplazo directo con las últimas versiones, pero nos centramos principalmente en versiones recientes, así que si todavía estás usando puppeteer 13.3.7 de principios de los 90, puede ser un buen momento para actualizar. Hay una alta probabilidad de que realmente no rompa nada, ya que la API es bastante estable con el tiempo.
Runtime.EnableLas bibliotecas de automatización populares dependen del comando CDP Runtime.Enable, que permite recibir eventos del dominio Runtime.. Esto es crucial para gestionar los contextos de ejecución utilizados para evaluar JavaScript en las páginas, una característica clave para cualquier proceso de automatización.
Sin embargo, existe una técnica que detecta el uso de este comando, revelando que el navegador está controlado por software de automatización como Puppeteer o Playwright. Esta técnica es utilizada por todo el software anti-bot importante, como Cloudflare, DataDome y otros.
Hemos preparado un artículo completo sobre nuestra investigación de esta fuga, que puedes leer en nuestro blog.
Para más detalles sobre esta técnica, lee la publicación del blog de DataDome: Cómo el nuevo Headless Chrome y la señal CDP están impactando la detección de bots.
En resumen, son unas pocas líneas de JavaScript en la página que se llaman automáticamente si se usó Runtime.Enable.
Nuestra corrección desactiva el comando automático Runtime.Enable en cada frame. En su lugar, creamos manualmente contextos con IDs desconocidos cuando se crea un frame. Luego, cuando se necesita ejecutar código, hay múltiples maneras de obtener el ID de contexto.
🟢 Pros: El enfoque definitivo que mantiene el acceso al mundo principal y funciona con web workers e iframes. No necesitas cambiar nada de tu código existente.
🔴 Contras: Hasta ahora no se ha descubierto ninguno.
Page.createIsolatedWorld y guardar su ID.🟢 Pros: Todo tu código se ejecutará en un mundo aislado separado, evitando que los scripts de la página detecten tus cambios mediante MutationObserver y otras técnicas.
🔴 Contras: No podrás acceder a las variables y al código del contexto principal. Si bien esto es necesario para algunos casos de uso, el contexto aislado generalmente funciona bien para la mayoría de los escenarios. Además, los web workers no permiten crear nuevos mundos, por lo que no puedes ejecutar tu código dentro de un worker. Es un caso de uso de nicho, pero puede ser importante en algunas situaciones. Existe una solución alternativa para este problema; lee Cómo acceder a objetos del contexto principal desde un contexto aislado en Puppeteer y Playwright.
Runtime.Enable y luego inmediatamente a Runtime.Disable.Esto activa los eventos Runtime.executionContextCreated, lo que nos permite capturar el ID de contexto adecuado.
🟢 Pros: Tendrás acceso completo al contexto principal.