
Коллекция патчей для puppeteer и playwright, позволяющая избежать обнаружения автоматизации и утечек. Помогает обходить CAPTCHA-страницы Cloudflare и DataDome. Патчи легко применять и отменять; их можно включать и отключать по требованию.
Этот репозиторий содержит патчи для улучшения популярных библиотек веб-автоматизации. В частности, он нацелен на пакеты puppeteer и playwright.
Некоторые аспекты библиотек автоматизации и поведения браузера невозможно настроить через параметры или флаги командной строки. Поэтому мы решаем эти проблемы, пропатчив исходный код библиотеки. Хотя такой подход хрупок и может сломаться по мере изменения исходного кода библиотек со временем, цель — поддерживать этот репозиторий с помощью сообщества, чтобы патчи оставались актуальными.
Из коробки Puppeteer и Playwright содержат несколько значительных утечек, которые легко обнаружить. Неважно, насколько хороши ваши прокси, отпечатки и поведенческие скрипты: без патчей вы — просто большой красный флаг для любого крупного сайта.
🕵️ Вы можете легко проверить свою конфигурацию автоматизации на современные методы обнаружения с помощью 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)Другой способ — использовать новые пакеты вместо оригинальных. Вот шаги, которым нужно следовать:
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 и протестируйте свой пропатченный браузер.
Наша цель — поддерживать эти готовые пакеты-замены с актуальными версиями, но в основном мы сосредоточены на свежих версиях, так что если вы всё ещё используете puppeteer 13.3.7 из начала 90-х, возможно, пора обновиться. С большой вероятностью ничего не сломается, так как API довольно стабилен со временем.
Runtime.EnableПопулярные библиотеки автоматизации полагаются на CDP-команду Runtime.Enable, которая позволяет получать события из домена Runtime.. Это критически важно для управления контекстами выполнения, используемыми для выполнения JavaScript на страницах, — ключевая функция любого процесса автоматизации.
Однако существует техника, которая обнаруживает использование этой команды и показывает, что браузер управляется ПО для автоматизации, таким как Puppeteer или Playwright. Эта техника используется всем крупным антибот-ПО, таким как Cloudflare, DataDome и другие.
Мы подготовили полную статью о нашем исследовании этой утечки, которую можно прочитать в нашем блоге.
Более подробно об этой технике читайте в блоге DataDome: Как новый Headless Chrome и сигнал CDP влияют на обнаружение ботов.
Если кратко, это несколько строк JavaScript на странице, которые вызываются автоматически, если была использована команда Runtime.Enable.
Наше исправление отключает автоматическую команду Runtime.Enable на каждом фрейме. Вместо этого мы вручную создаём контексты с неизвестными ID при создании фрейма. Затем, когда нужно выполнить код, есть несколько способов получить ID контекста.
🟢 Плюсы: наилучший подход — сохраняет доступ к основному миру и работает с веб-воркерами и iframe. Вам не нужно менять ни строчки существующего кода.
🔴 Минусы: на данный момент не обнаружены.
Page.createIsolatedWorld и сохраните его ID.🟢 Плюсы: весь ваш код будет выполняться в отдельном изолированном мире, что не позволит скриптам страницы обнаружить ваши изменения через MutationObserver и другие техники.
🔴 Минусы: вы не сможете получить доступ к переменным и коду основного контекста. Хотя это необходимо для некоторых сценариев использования, изолированный контекст в целом отлично работает в большинстве случаев. Кроме того, веб-воркеры не позволяют создавать новые миры, поэтому вы не сможете выполнять свой код внутри воркера. Это нишевый сценарий использования, но в некоторых ситуациях может иметь значение. Для этой проблемы есть обходное решение — прочитайте Как получить доступ к объектам основного контекста из изолированного контекста в Puppeteer и Playwright.
Runtime.Enable, а затем сразу же Runtime.Disable.Это вызывает события Runtime.executionContextCreated, что позволяет нам перехватить правильный ID контекста.
🟢 Плюсы: у вас будет полный доступ к основному контексту.
🔴 Минусы: есть небольшая вероятность, что за этот короткий промежуток времени страница вызовет код, который приведёт к утечке. Риск низок, поскольку код обнаружения обычно вызывается во время определённых действий, таких как CAPTCHA-страницы или формы входа/регистрации, как правило, сразу после загрузки страницы. Ваша бизнес-логика обычно вызывается чуть позже.