CDP-утечки Puppeteer: как антифрод видит автоматизацию

Puppeteer удобен, потому что напрямую говорит с Chromium через Chrome DevTools Protocol. Но за это удобство приходится платить. CDP дает почти полный контроль над браузером и одновременно оставляет технические следы: стек вызовов, порты отладки, странные тайминги, ранние JavaScript-инъекции.
Если вы парсите данные, тестируете защищенные сайты или работаете с аккаунтами, одного stealth-плагина часто уже недостаточно. Антифрод проверяет отпечаток браузера вместе со способом управления им. Здесь начинается зона WebDriver detection и web scraping fingerprinting.
Что такое CDP и почему он светится
Chrome DevTools Protocol создавали для отладки, профилирования и управления браузером. Puppeteer использует его как командный канал: открыть страницу, выполнить скрипт, кликнуть, прочитать DOM, сделать screenshot.
Разработчику это удобно. Антифроду тоже, только с другой стороны. Протокол создает маркеры, которых часто нет в обычной человеческой сессии: локальный канал управления, специфические execution context, следы Runtime.evaluate, нетипичный жизненный цикл страницы.
| Маркер | Где проявляется | Почему подозрителен |
|---|---|---|
pptr:evaluate | Error stack trace | Прямо указывает на Puppeteer |
| DevTools port | Localhost и WebSocket | Показывает удаленное управление |
| Ранний JS-патч | document_start | Меняет естественные тайминги страницы |
| Headless-сигналы | ClientRects, fonts, GPU | Выдают искусственный рендеринг |
| User-Agent mismatch | Headers vs navigator | Показывает рассинхрон среды |
Классический Canvas fingerprinting или WebGL fingerprint помогает понять, что это за устройство. CDP-утечки показывают другое: не дергает ли этот браузер скрипт. Для антифрода это часто более сильный сигнал.
Где Puppeteer оставляет самые явные следы
Первый заметный слой — execution context. Когда вы вызываете page.evaluate(), Puppeteer отправляет код в браузер через CDP. Если антифрод спровоцирует ошибку и прочитает Error.stack, в стеке может всплыть не логика сайта, а технический след автоматизации.
Дальше идут инъекции через evaluateOnNewDocument. Многие stealth-плагины очень рано переписывают navigator.webdriver, WebGL, Canvas, plugins и languages. Но тяжелый патч до нормального старта страницы тоже выглядит странно. Обычный пользователь не приходит на сайт с набором JavaScript-перехватчиков в главном контексте.
Еще один след — локальные порты. Если Chromium запущен с DevTools endpoint, защитный скрипт может простукивать локальные адреса или ловить косвенные тайминги. Здесь нужна защита от сканирования портов, а не очередная подмена User-Agent.
Почему смена User-Agent не спасает
Смена User-Agent через CDP правит только маленький кусок картины. Сервер видит один заголовок, JavaScript читает свойства браузера, Client Hints добавляют еще один слой, а GPU и сенсоры могут показать совсем другую историю.
Если HTTP говорит "mobile browser", а поведенческие API показывают desktop-курсор, отсутствие touch-паттернов и странные Client Hints, антифрод не поверит заголовку. Он увидит рассинхрон. Device spoofing должен быть согласованным. Косметика быстро рассыпается.
| Слабый подход | Более надежный подход |
|---|---|
| Менять только User-Agent | Согласовывать UA, Client Hints, viewport, timezone, touch |
| Грузить тяжелый stealth на старте | Разделять ранние и поздние патчи |
| Верить одному плагину | Проверять stack, ports, timing, fingerprint |
| Запускать все в headless | Тестировать headful или специализированную среду |
Антифрод редко ловит одну-единственную ошибку. Обычно он собирает несколько мелких несоответствий.
Как снизить риск CDP-детекта
Полной невидимости нет. Зато можно убрать грубые следы: не открывать TCP-порт отладки без необходимости, не оставлять pptr:evaluate в стеке, не заливать тяжелые stealth-патчи в первую миллисекунду и не ломать согласованность между fingerprint-слоями.
Для простых задач этого иногда хватает. Для серьезного data scraping, аккаунтных операций или сайтов с сильным антифродом нужна другая архитектура: не JavaScript-макияж поверх Chromium, а среда, где fingerprint и автоматизация продуманы ниже уровня страницы.
Здесь уместен антидетект-браузер. Afina дает изолированные браузерные профили, proxy per account, управление прокси, автоматизацию действий, local API и RPA-сценарии. Команде проще управлять такой базой, чем после каждого обновления латать node_modules.
Когда Puppeteer все еще уместен
Puppeteer не нужно списывать. Он хорошо подходит для внутреннего QA, тестирования собственных сайтов, простого сбора открытых данных и проверки рендеринга. Проблемы начинаются там, где сайт сам активно ищет автоматизацию.
Один тест на своем домене вряд ли упрется в CDP-утечки. А вот десятки профилей, повторяющиеся действия, ротация прокси и защищенные формы уже требуют более широкой картины: headless browsing, TLS fingerprinting, поведение, сессии, командный контроль. Puppeteer здесь только часть задачи.
Afina полезна именно во втором случае. Она не заменяет инженерное решение, зато дает устойчивую базу: профили, proxy per account, сценарии, tasks, модули, синхронизацию и контроль запусков. Начать можно с web scraping and data или сразу открыть загрузку.
FAQ — Часто задаваемые вопросы
Что такое CDP-утечки в Puppeteer?
Это технические следы Chrome DevTools Protocol, которые могут показать сайту, что браузером управляет скрипт. Среди них стек вызовов, локальные порты, execution context и подозрительные тайминги инъекций.
Достаточно ли puppeteer-extra-plugin-stealth?
Иногда для простых сайтов. Для сильного антифрода нет, потому что stealth-плагины часто прячут очевидные флаги, но не убирают все CDP-маркеры.
Почему navigator.webdriver не единственная проблема?
Антифрод проверяет много слоев сразу: stack trace, порты, Client Hints, WebGL, Canvas, тайминги, поведение и сетевые признаки. Один флаг давно не решает задачу.
Можно ли сделать Puppeteer полностью невидимым?
Практически нет. Можно снизить количество грубых следов, но любой слой автоматизации создает отклонения. Вопрос в том, важны ли они для конкретного сайта.
Как Afina помогает с автоматизацией?
Afina дает изолированные профили, прокси на аккаунт, fingerprint-логику, local API и сценарии автоматизации. Это база для команд, которым нужно управлять процессом, а не просто запускать Puppeteer в очередной вкладке.
