«Стелс-режим» в Puppeteer: как стать невидимым для сайтов

«Стелс-режим» в Puppeteer: как стать невидимым для сайтов
«Стелс-режим» в Puppeteer: как стать невидимым для сайтов

1. Зачем нужен «стелс-режим»?

1.1. Обход защиты от автоматизации

Переход к использованию Puppeteer в режиме, имитирующем обычный пользовательский браузер, требует обхода механизмов, предназначенных для выявления автоматических запросов. Основные точки обнаружения включают:

  1. Параметр navigator.webdriver, автоматически устанавливаемый в headless‑режиме.
  2. Отсутствие типичных плагинов и шрифтов, характерных для реального клиента.
  3. Статические значения User-Agent, Accept-Language, Screen и Viewport.
  4. Поведение таймингов: фиксированные интервалы между действиями, отсутствие случайных задержек.
  5. Метаданные Chrome DevTools Protocol, открывающие наличие отладочного интерфейса.

Для нейтрализации этих признаков применяются следующие практики:

  • Установка пакета puppeteer-extra-plugin-stealth, который автоматически подменяет свойства navigator, добавляет имитацию плагинов, корректирует WebGL‑параметры и скрывает отладочный порт.
  • Явное переопределение Object.defineProperty(window, 'navigator', { get: () => ({ ...original, webdriver: undefined }) }) через page.evaluateOnNewDocument.
  • Подмена User-Agent и Accept-Language на значения, соответствующие реальному браузеру, с учётом региональных особенностей.
  • Инъекция случайных задержек перед кликами, вводом текста и навигацией, используя await page.waitForTimeout(Math.random() * 200 + 100).
  • Эмуляция наличия шрифтов и плагинов через page.evaluate и добавление виртуальных MediaDevices.
  • Отключение режима headless, запуск Chrome в обычном режиме с параметром --no-sandbox и указанием пользовательского профиля.

Дополнительные меры включают:

  • Перезапуск браузера после определённого количества запросов, чтобы избежать накопления характерных паттернов.
  • Использование прокси‑серверов с ротацией IP‑адресов, что снижает вероятность блокировки по сетевому признаку.
  • Обход капчи через сервисы распознавания, если защита переходит к проверке пользовательского ввода.

Применение совокупности перечисленных техник обеспечивает стабильную работу скриптов, минимизируя вероятность обнаружения автоматизации со стороны современных систем защиты.

1.2. Этика и ответственность

Этика и ответственность при применении скрытого режима в автоматизации браузера требуют строгого соблюдения нормативных и моральных критериев.

Первый критерий - соответствие законодательству. Операции, имитирующие обычный пользовательский трафик, могут нарушать законы о несанкционированном доступе, если они осуществляются без разрешения владельца ресурса. Кроме того, большинство сайтов публикуют условия использования, в которых явно запрещается обход их механизмов защиты. Нарушение этих условий влечёт юридические последствия.

Второй критерий - обеспечение конфиденциальности. Автоматизированный сбор персональных данных подлежит требованиям законов о защите информации (например, GDPR, Федеральный закон «О персональных данных»). Любой скрипт, работающий в скрытом режиме, обязан ограничивать объём собираемых сведений и применять шифрование при передаче.

Третий критерий - влияние на инфраструктуру сайта. Скрытая имитация браузера сохраняет обычный объём запросов, но может увеличить нагрузку за счёт частых проверок и повторных обращений к ресурсам. Необходимо контролировать частоту запросов, чтобы избежать деградации обслуживания реальных пользователей.

Четвёртый критерий - прозрачность действий разработчика. Внутренний журнал должен фиксировать каждое обращение, параметры скрытого режима и результаты. Такой аудит позволяет отследить отклонения от нормативных требований и быстро реагировать на инциденты.

Рекомендации по ответственному использованию:

  • Получать согласие владельца сайта перед запуском скрытой автоматизации.
  • Ограничивать набор целевых страниц согласно задачам проекта.
  • Соблюдать правила robots.txt и аналогичные ограничения.
  • Устанавливать лимиты запросов (не более N запросов в секунду, где N - значение, согласованное с администратором ресурса).
  • Шифровать и анонимизировать передаваемые данные, если они содержат личную информацию.
  • Проводить периодический аудит журнала действий и проверять соответствие правовым требованиям.

Соблюдение перечисленных принципов минимизирует правовые риски, защищает интересы пользователей и поддерживает устойчивую работу целевых веб‑ресурсов.

2. Основные методы маскировки

2.1. User Agent

User‑Agent - строка, передающаяся серверу в заголовке User-Agent. Она сообщает тип браузера, операционную систему и иногда дополнительные параметры. Сервисы используют эту строку для распознавания автоматических запросов: при совпадении с известными шаблонами headless‑браузеров или с несовместимыми версиями происходит блокировка.

Проблемные признаки User‑Agent в контексте скрытности Puppeteer:

  • отсутствие мобильных подпоследовательностей в строке, характерных для реальных устройств;
  • наличие токенов HeadlessChrome, Chrome/xx.0.0.0 без указания платформы;
  • несовпадение версии браузера и версии движка Blink.

Для корректного управления User‑Agent в Puppeteer применяют метод page.setUserAgent. Пример настройки:

const puppeteer = require('puppeteer');
(async () => {
 const browser = await puppeteer.launch({headless: true});
 const page = await browser.newPage();
 await page.setUserAgent(
 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +
 '(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
 );
 await page.goto('https://example.com');
 // дальнейшие действия
 await browser.close();
})();

Эффективные практики:

  1. Подбирать строку, соответствующую текущей версии Chrome, установленной в системе.
  2. Периодически менять значение, используя списки реальных User‑Agent‑ов.
  3. Синхронизировать User‑Agent с другими заголовками (Accept‑Language, Sec‑CH‑UA) для избежания несоответствий.
  4. При работе с мобильными сайтами использовать мобильные строки, включающие Mobile и указание модели устройства.

Настройка User‑Agent - один из базовых уровней маскировки, без которого остальные методы скрытности теряют эффективность.

2.2. HTTP Headers

В режиме скрытого доступа браузера Puppeteer каждый запрос сопровождается набором HTTP‑заголовков, которые позволяют серверу определить тип клиента. Для получения статуса «невидимого» необходимо изменить или удалить те заголовки, которые характерны для автоматизированных сред.

Первый приоритет - заголовок User-Agent. По умолчанию он содержит строку, указывающую на Chrome‑Headless. Замена на строку обычного браузера (например, Chrome в режиме без headless) устраняет один из самых очевидных маркеров. В Puppeteer это достигается через page.setUserAgent().

Второй элемент - Accept-Language. Автоматические скрипты часто используют значение en-US,en;q=0.9. Подбор реального списка языков, соответствующего геолокации и настройкам пользователя, снижает вероятность обнаружения. Применяется page.setExtraHTTPHeaders({ 'Accept-Language': 'ru-RU,ru;q=0.9' }).

Третий пункт - Accept-Encoding. Отключение компрессии (gzip, deflate, br) может вызвать подозрения, так как большинство реальных браузеров поддерживают её. Оставьте стандартный набор, но при необходимости уточните через page.setExtraHTTPHeaders.

Четвёртый заголовок - Referer. При навигации без реального перехода реферер часто пустой, что отличается от поведения обычного пользователя. Установите значение, соответствующее предыдущей странице, либо отключите передачу, если это не нарушает логику сайта.

Пятый элемент - DNT (Do Not Track). Реальные пользователи иногда включают эту опцию. Добавление DNT: 1 делает запрос более похожим на запрос от человека, но следует учитывать, что некоторые ресурсы используют этот флаг для дополнительной фильтрации.

Шестой аспект - *Sec‑Fetch‑ заголовки** (Sec-Fetch-Mode, Sec-Fetch-Site, Sec-Fetch-Dest). В headless‑режиме они могут принимать значения, отличные от обычных браузеров. Перенастройка этих полей через page.setExtraHTTPHeaders позволяет подстроить их под типичный пользовательский поток (например, Sec-Fetch-Mode: navigate, Sec-Fetch-Site: same-origin).

Седьмое действие - отключение автоматической отправки Chrome‑Internals заголовков (X-DevTools-Emulate-Network-Conditions-Client-Id, X-Requested-With). Их наличие указывает на инструменты разработки. Удаление возможно через перехват запросов:

await page.setRequestInterception(true);
page.on('request', req => {
 const headers = { ...req.headers() };
 delete headers['x-devtools-emulate-network-conditions-client-id'];
 delete headers['x-requested-with'];
 req.continue({ headers });
});

Наконец, следует учитывать Cookie. Автоматические скрипты часто используют чистый набор или фиксированные значения. Поддержка актуального cookie‑стека, полученного в результате реального взаимодействия, повышает правдоподобие запросов.

Систематическое применение перечисленных изменений к каждому запросу формирует профиль, практически неотличимый от обычного браузера, что существенно снижает вероятность детекции со стороны веб‑ресурсов.

2.3. WebGL

WebGL‑отпечаток предоставляет сайтам информацию о видеокарте, драйверах и конфигурации графической подсистемы. При работе через автоматизированный браузер такие данные позволяют отличить скрипт от обычного пользователя.

По умолчанию Puppeteer открывает WebGL‑контекст, возвращая реальное значение WEBGL_debug_renderer_info.UNMASKED_RENDERER_WEBGL. Это приводит к совпадению отпечатка с реальной машиной, но также раскрывает факт использования автоматизации.

Для сокрытия WebGL‑информации применяются следующие приёмы:

  • переопределение метода WebGLRenderingContext.getParameter с возвращением заранее подготовленных строк;
  • отключение расширения WEBGL_debug_renderer_info через delete window.WebGLRenderingContext.prototype.getParameter;
  • использование пакета puppeteer-extra-plugin-stealth, который автоматически подменяет параметры UNMASKED_VENDOR_WEBGL и UNMASKED_RENDERER_WEBGL;
  • запуск браузера с аргументом --disable-webgl или указанием пользовательского профиля, где WebGL полностью отключён.

Практическая последовательность настройки:

  1. установить puppeteer-extra и puppeteer-extra-plugin-stealth;
  2. подключить плагин к экземпляру Puppeteer;
  3. добавить пользовательский скрипт, который изменяет navigator.hardwareConcurrency и navigator.deviceMemory при необходимости;
  4. при запуске браузера указать args: ['--disable-webgl'] для полной блокировки WebGL.

Эти меры снижают вероятность обнаружения скрипта через графический отпечаток, повышая эффективность скрытого режима работы.

2.4. Canvas Fingerprint

Canvas‑fingerprinting - метод идентификации, использующий отрисовку графики в элементе <canvas> и извлечение полученного изображения в виде массива пикселей. При вызове HTMLCanvasElement.toDataURL() или HTMLCanvasElement.getImageData() браузер возвращает данные, зависящие от драйвера графики, шрифтов, настроек ОС и аппаратного обеспечения. Сочетание этих параметров образует уникальный отпечаток, позволяющий отличить один клиент от другого даже при отключенных cookies.

В автоматизированных сценариях, где применяется Puppeteer, сайты могут запросить данные canvas, чтобы определить, что страница управляется скриптом. Если значение отпечатка совпадает с известными шаблонами headless‑браузеров, запрос будет отклонён или результат будет искажен.

Для снижения риска обнаружения необходимо изменить поведение canvas‑API. Основные приёмы:

  • Перехват методов CanvasRenderingContext2D.prototype.getImageData, HTMLCanvasElement.prototype.toDataURL и HTMLCanvasElement.prototype.toBlob. В перехваченном коде заменяется возвращаемый массив случайными, но статистически правдоподобными, значениями.
  • Установка флага --disable-blink-features=AutomationControlled при запуске браузера. Этот параметр скрывает наличие автоматизации, однако не меняет содержимое canvas.
  • Подключение пакета puppeteer-extra-plugin-stealth. Плагин автоматически внедряет скрипт, который подменяет свойства canvas и добавляет небольшие шумы к каждому пикселю, тем самым разрушая детерминированный отпечаток.
  • Использование сторонних библиотек, например canvas-fingerprint-defender. Они предоставляют готовый набор функций для подмены данных и могут быть интегрированы через page.evaluateOnNewDocument.

Пример внедрения подмены через puppeteer-extra-plugin-stealth:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
 const browser = await puppeteer.launch({headless: true});
 const page = await browser.newPage();
 await page.goto('https://example.com');
 // Дальнейшие действия
 await browser.close();
})();

Если требуется более тонкая настройка, можно добавить собственный скрипт:

await page.evaluateOnNewDocument(() => {
 const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
 CanvasRenderingContext2D.prototype.getImageData = function(...args) {
 const data = originalGetImageData.apply(this, args);
 for (let i = 0; i < data.data.length; i++) {
 data.data[i] ^= 0x2A; // простое XOR‑смещение
 }
 return data;
 };
});

Эти меры снижают вероятность совпадения отпечатка с известными шаблонами, повышая эффективность скрытого режима в Puppeteer. Полное устранение canvas‑fingerprinting невозможно без полного отключения canvas, что ограничивает функциональность страниц. Поэтому оптимальный подход - комбинация параметров запуска, плагинов и кастомных перехватов, обеспечивающих достаточный уровень маскировки при сохранении работоспособности сайта.

2.5. Plugins

Плагин stealth‑plugin от puppeteer-extra - основной инструмент для подавления признаков автоматизации. Он встраивается в Puppeteer, переопределяя свойства браузера, изменяя заголовки, отключая WebGL‑фингерпринты и скрывая navigator.webdriver.

Дополнительные плагины, часто используемые совместно с stealth‑plugin:

  • puppeteer-extra-plugin-user-preferences - задаёт пользовательские настройки Chrome, такие как язык, тайм‑зона и отключение автоматических обновлений, что уменьшает расхождения с реальными клиентами.
  • puppeteer-extra-plugin-block-resources - блокирует загрузку ресурсов (изображения, шрифты, аналитика), снижая сетевой профиль и уменьшая вероятность обнаружения по‑сравнению с обычным браузером.
  • puppeteer-extra-plugin-recaptcha - автоматизирует решение капчи через внешние сервисы, позволяя обходить защиту без вмешательства пользователя.
  • puppeteer-extra-plugin-proxy - управляет прокси‑сервером, меняет IP‑адреса и поддерживает аутентификацию, что помогает распределять запросы и избегать блокировок.

Установка и активация происходит через npm, пример кода:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const UserPrefsPlugin = require('puppeteer-extra-plugin-user-preferences');
puppeteer.use(StealthPlugin());
puppeteer.use(UserPrefsPlugin({prefs: {intl: {accept_languages: 'en-US,en'}}}));
(async () => {
 const browser = await puppeteer.launch({headless: false});
 const page = await browser.newPage();
 await page.goto('https://example.com');
})();

Каждый из перечисленных модулей вносит отдельный слой маскировки, совместно формируя комплексный режим скрытности, который затрудняет определение автоматизированного доступа со стороны веб‑ресурсов.

2.6. Navigator Properties

В режиме скрытого доступа браузера Puppeteer объект navigator остаётся главным источником информации, которую сайты используют для определения автоматизации. Управление свойствами navigator позволяет снизить вероятность обнаружения скриптов, работающих в безголовом режиме.

Для эффективного маскирования необходимо переопределить несколько полей, которые чаще всего проверяются:

  • navigator.userAgent - строка, идентифицирующая тип и версию браузера; подменяется на значение, характерное для обычного пользовательского клиента.
  • navigator.platform - информация о операционной системе; задаётся в соответствии с типичными значениями десктопных или мобильных устройств.
  • navigator.languages - массив предпочтительных языков; рекомендуется использовать массив из одного или нескольких стандартных кодов, например ["en-US","en"].
  • navigator.hardwareConcurrency - количество логических процессоров; подделывается в диапазоне от 2 до 8, чтобы соответствовать типичным пользовательским конфигурациям.
  • navigator.deviceMemory - объём оперативной памяти в гигабайтах; устанавливается в пределах 2-8 ГБ.
  • navigator.webdriver - булево значение, указывающее на управление браузером через WebDriver; должно быть принудительно заменено на false.
  • navigator.plugins и navigator.mimeTypes - списки установленных плагинов и поддерживаемых MIME‑типов; часто имитируются пустыми массивами или набором типичных плагинов.

Переопределение свойств реализуется через метод page.evaluateOnNewDocument, который выполняет скрипт до загрузки любой страницы. Пример кода:

await page.evaluateOnNewDocument(() => {
 Object.defineProperty(navigator, 'webdriver', { get: () => false });
 Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
 Object.defineProperty(navigator, 'platform', { get: () => 'Win32' });
 Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => 4 });
 Object.defineProperty(navigator, 'deviceMemory', { get: () => 4 });
 Object.defineProperty(navigator, 'userAgent', { get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' });
});

Важным аспектом является последовательность применения изменений: свойства должны быть заданы до любого обращения к navigator со стороны скриптов сайта. При этом следует учитывать, что некоторые ресурсы могут проверять согласованность между полями (например, userAgent и platform). Поэтому значения следует подбирать согласованно, имитируя реальные комбинации браузеров и ОС.

Дополнительные меры включают отключение автоматических запросов к API navigator.permissions и скрытие признаков отладки, таких как chrome.runtime. Совместное применение перечисленных техник повышает устойчивость к детекции и позволяет сохранять функциональность страниц без заметных отклонений от поведения обычного пользователя.

3. Практическая реализация с Puppeteer

3.1. Настройка Puppeteer для «стелс-режима»

Настройка Puppeteer для работы в скрытом режиме требует изменения параметров, которые обычно раскрывают автоматизацию. Основные шаги включают изменение пользовательского агента, отключение признаков браузера‑автомата и применение специализированных плагинов.

  1. Изменение пользовательского агента

    При запуске укажите строку, соответствующую обычному браузеру, например:

    const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36';
    await page.setUserAgent(userAgent);
    
  2. Отключение признаков автоматизации

    • Установите параметр --disable-blink-features=AutomationControlled.
    • Перепишите свойства navigator.webdriver, navigator.languages, navigator.plugins.
    • Отключите WebGL‑фингерпринт, переопределив WebGLRenderingContext.getParameter.
  3. Использование готового решения

    Подключите puppeteer-extra и плагин puppeteer-extra-plugin-stealth:

    const puppeteer = require('puppeteer-extra');
    const StealthPlugin = require('puppeteer-extra-plugin-stealth');
    puppeteer.use(StealthPlugin());
    const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] });
    
  4. Дополнительные параметры запуска

    • --no-sandbox и --disable-setuid-sandbox снижают вероятность обнаружения в средах CI.
    • --disable-infobars удаляет информационные панели, указывающие на автоматизацию.
    • --disable-extensions предотвращает загрузку расширений, которые могут быть помечены как подозрительные.
  5. Обработка запросов

    Включите перехват запросов, чтобы скрыть типы ресурсов, характерные для ботов:

    await page.setRequestInterception(true);
    page.on('request', request => {
     const url = request.url();
     if (url.endsWith('.css') || url.endsWith('.png')) {
     request.abort();
     } else {
     request.continue();
     }
    });
    

Комбинация перечисленных настроек обеспечивает минимизацию сигнатур, используемых сайтами для определения автоматизированных клиентов. При правильном применении Puppeteer работает как обычный пользовательский браузер, что позволяет обходить большинство механизмов защиты.

3.2. Использование библиотеки puppeteer-extra

Библиотека puppeteer-extra расширяет возможности стандартного Puppeteer, позволяя подключать набор плагинов, среди которых наиболее часто используется puppeteer-extra-plugin-stealth. Этот плагин маскирует характерные признаки автоматизации, изменяя свойства navigator, webdriver, chrome и другие параметры, которые обычно проверяют сайты для обнаружения ботов.

Для начала необходимо установить пакет и выбранный плагин:

  • npm install puppeteer-extra puppeteer-extra-plugin-stealth
  • При необходимости добавить puppeteer в зависимостях, если он не установлен автоматически.

Подключение в коде выглядит так:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
 const browser = await puppeteer.launch({ headless: false });
 const page = await browser.newPage();
 await page.goto('https://example.com');
 // дальнейшие действия
})();

Плагин автоматически применяет набор модификаций, включающих:

  • Подмену navigator.languages и navigator.plugins.
  • Отключение флага navigator.webdriver.
  • Модификацию User-Agent и Accept-Language.
  • Сокрытие свойств, связанных с отладчиком DevTools.

При необходимости можно настроить отдельные модули плагина, передавая объект конфигурации в use:

puppeteer.use(StealthPlugin({
 hideWebDriver: false, // оставить флаг webdriver
 removeAutomationIndicators: true
}));

Дополнительные плагины из экосистемы puppeteer-extra (например, puppeteer-extra-plugin-adblocker или puppeteer-extra-plugin-recaptcha) могут быть включены аналогичным способом, расширяя функциональность скрытого режима без изменения базового кода.

Ограничения:

  • Плагин не гарантирует 100 % защиту от всех методов обнаружения, особенно при использовании сложных скриптов анализа поведения пользователя.
  • Обновления браузера могут требовать корректировки версии плагина; рекомендуется фиксировать версии зависимостей в package.json.
  • В режиме headless: true некоторые сайты могут по‑прежнему реагировать на отсутствие реального графического контекста; в таких случаях рекомендуется использовать headless: false совместно с виртуальным дисплеем.

Использование puppeteer-extra и его stealth‑плагина представляет эффективный способ уменьшить вероятность блокировки скриптов, обеспечивая более естественное взаимодействие с веб‑страницами.

3.3. Расширенные настройки

В рамках повышения уровня скрытности автоматизированных запросов в Puppeteer применяются дополнительные параметры, которые позволяют устранить большинство известных методов обнаружения. Ниже перечислены ключевые настройки, требующие отдельного внимания.

  • Плагин stealth - подключение puppeteer-extra-plugin-stealth автоматически исправляет свойства navigator, WebGL и Canvas, скрывая признаки автоматизации.
  • Пользовательский User‑Agent - задаётся через page.setUserAgent(). Выбор строки, соответствующей реальному браузеру, предотвращает простую проверку заголовка.
  • Размеры окна и DPI - page.setViewport({width, height, deviceScaleFactor}) имитирует реальные параметры дисплея; отсутствие стандартных размеров (например, 800×600) снижает вероятность обнаружения.
  • Язык и регион - page.setExtraHTTPHeaders({‘Accept-Language’: ‘ru-RU,ru;q=0.9’}) и изменение navigator.language через page.evaluateOnNewDocument обеспечивают согласованность локализации.
  • WebRTC и IP‑адрес - включение собственного STUN‑сервера и переопределение RTCPeerConnection позволяют скрыть локальный IP, используемый в WebRTC‑тестах.
  • Отказ от флагов автоматизации - запуск Chrome с аргументом --disable-blink-features=AutomationControlled и удаление параметра --enable-automation из args устраняет прямой индикатор автоматизации.
  • Прокси‑сервер - указание аутентифицированного прокси через page.authenticate() и --proxy-server распределяет запросы по разным IP, усложняя корреляцию.
  • Скрипты перехвата - page.evaluateOnNewDocument позволяет внедрять пользовательские функции до загрузки страницы, заменяя, например, window.navigator.plugins и window.navigator.hardwareConcurrency.
  • Отложенный ввод - имитация человеческого поведения посредством page.type() с параметром delay и случайных пауз между действиями уменьшает вероятность обнаружения по тайминг‑анализу.

Для применения настроек необходимо создать отдельный экземпляр браузера, передавая все перечисленные параметры в объект launch. Пример конфигурации:

const puppeteer = require('puppeteer-extra');
puppeteer.use(require('puppeteer-extra-plugin-stealth')());
const browser = await puppeteer.launch({
 headless: false,
 args: [
 '--no-sandbox',
 '--disable-setuid-sandbox',
 '--disable-blink-features=AutomationControlled',
 '--proxy-server=http://user:[email protected]:3128'
 ],
 ignoreDefaultArgs: ['--enable-automation']
});

После инициализации следует выполнить предварительные скрипты через evaluateOnNewDocument, установить User-Agent, viewport, Accept-Language и другие параметры. Данные действия позволяют достичь высокого уровня непрозрачности, минимизируя количество сигналов, которые могут быть использованы сайтами для идентификации автоматизированного клиента.

4. Обход продвинутых техник обнаружения

4.1. JavaScript-обнаружение

Веб‑страницы используют JavaScript для проверки окружения браузера и выявления автоматизации. Сразу после загрузки скрипты могут запросить свойства объекта navigator, проверить наличие флага webdriver, сравнить список плагинов и языков, а также проанализировать тайминги выполнения кода.

  • navigator.webdriver - значение true указывает на управляемый браузер.
  • navigator.plugins - пустой массив характерен для headless‑режима.
  • navigator.languages - отсутствие стандартных локалей может быть сигналом.
  • Object.prototype.toString.call(window.chrome) - возвращает "[object Chrome]" только в обычных Chrome.
  • performance.timing - неестественно быстрые или одинаковые интервалы между событиями.
  • проверка document.hidden и visibilityState - некорректные состояния указывают на эмуляцию.
  • сравнение результатов eval('(()=>{})') - изменённая строка функции раскрывает подмену.

Для подавления этих проверок применяют модификацию глобальных объектов до начала выполнения пользовательского кода. Основные приёмы:

  1. Перезаписать navigator.webdriver в false.
  2. Заполнить navigator.plugins фиктивными объектами, имитирующими обычные плагины.
  3. Установить массив navigator.languages, включающий типичные локали (например, ["en-US","en"]).
  4. Переопределить Object.prototype.toString так, чтобы возвращалось ожидаемое значение для window.chrome.
  5. Скорректировать свойства performance.timing, добавив случайные задержки.
  6. Обеспечить согласованность document.hidden и visibilityState с реальными пользовательскими действиями.
  7. Восстановить оригинальное поведение eval и Function.prototype.toString.

Эти вмешательства обычно реализуются через плагины, интегрируемые в Puppeteer, которые автоматически применяют набор патчей перед загрузкой первой страницы. Применение перечисленных методов снижает вероятность обнаружения скриптов, использующих JavaScript‑проверки.

4.2. Обнаружение по времени рендеринга

Время, затрачиваемое браузером на построение и отрисовку страницы, часто используется сайтами для выявления автоматических клиентов. При обычном пользовательском сеансе рендеринг происходит в диапазоне, характерном для конкретного устройства, версии браузера и нагрузки сети. Автоматизированные инструменты, такие как Puppeteer, могут генерировать аномальные задержки, которые легко обнаружить.

Основные признаки, указывающие на скриптовый доступ, включают:

  • Непрерывные паузы между запросами - отсутствие естественных интервалов, характерных для человеческого поведения.
  • Слишком быстрый или слишком медленный рендер - время от начала загрузки до события DOMContentLoaded существенно отличается от среднего значения для данного пользовательского агента.
  • Отсутствие колебаний в FPS - статический профиль кадров, характерный для безголовых браузеров.

Для снижения риска обнаружения по времени рендеринга рекомендуется:

  1. Эмулировать реальное сетевое окружение: задать случайные задержки в диапазоне 100-500 мс между запросами, использовать page.setViewport с реальными размерами экрана.
  2. Включить режим «headful»: запускать браузер в полноэкранном режиме, а не в безголовом, чтобы сохранить характерные тайминги отрисовки.
  3. Синхронизировать тайминг событий: добавить искусственные задержки перед page.waitForNavigation, page.waitForSelector и другими точками ожидания, имитируя человеческие реакции.
  4. Использовать профилирование: измерять performance.timing в реальном времени, сравнивать полученные значения с эталонными данными, корректировать скрипт при отклонениях.
  5. Отключить ускоренные режимы: отключить --disable-gpu, --disable-software-rasterizer, которые могут ускорять отрисовку и делать её несовместимой с обычным пользовательским опытом.

Контроль за метриками рендера требует регулярного мониторинга. При изменении целевого сайта следует пересчитывать средние показатели времени загрузки, поскольку многие ресурсы адаптируют свои проверки под новые типы автоматизации. Применяя перечисленные меры, скрипт сохраняет профиль времени рендеринга, приближённый к реальному пользователю, и снижает вероятность блокировки.

4.3. Обнаружение по движению мыши и клавиатуры

Обнаружение автоматизации по имитации перемещения курсора и ввода с клавиатуры базируется на анализе событий mousemove, mousedown, keydown и их параметров. Сайт может сравнивать интервалы между событиями, скорость перемещения, наличие свойства isTrusted, а также проверять соответствие координат реальному разрешению экрана. При отсутствии естественной динамики скрипт считается подозрительным.

Для снижения риска обнаружения необходимо:

  • Отключить генерацию событий мыши и клавиатуры в браузерном контексте: await page.evaluate(() => { Object.defineProperty(window, 'onmousemove', { value: null }); });.
  • Перехватить создание событий и задать фальшивый флаг isTrusted: document.addEventListener('mousemove', e => { Object.defineProperty(e, 'isTrusted', { get: () => true }); });.
  • Эмулировать реальное устройство через page.emulate или page.setViewport, указав типичный размер экрана и плотность пикселей.
  • Синхронно генерировать события с реалистичными задержками: использовать await page.mouse.move(x, y, {steps: 10}); await page.waitForTimeout(random(30, 120));.
  • Подменить свойства navigator и window связанные с вводом, например navigator.hardwareConcurrency, navigator.maxTouchPoints, чтобы соответствовать ожидаемому профилю пользователя.

Дополнительные меры:

  1. Отключить автоматическое скроллирование, которое может вызвать резкие изменения координат.
  2. При необходимости имитировать ввод, использовать page.keyboard.type с параметром delay, имитируя человеческую скорость печати.
  3. Проверить, не вызываются ли события через dispatchEvent без указания bubbles и cancelable, что часто фиксируют скрипты защиты.

Комбинация корректных размеров окна, правдоподобных задержек и подмены флагов isTrusted значительно уменьшает вероятность срабатывания механизмов, отслеживающих искусственное управление курсором и клавиатурой.

5. Тестирование эффективности «стелс-режима»

5.1. Инструменты для анализа fingerprint

В рамках скрытого режима управления браузером в Puppeteer необходим детальный контроль над характеристиками, которые сайт может использовать для построения уникального отпечатка. Анализ fingerprint позволяет выявать уязвимые параметры и корректировать их до запуска скриптов.

Для получения полной картины отпечатка применяются следующие инструменты:

  • FingerprintJS - библиотека, собирающая сведения о Canvas, WebGL, шрифтах, аудио‑контексте и прочих свойствах. Позволяет сравнить результаты в обычном браузере и в экземпляре Puppeteer.
  • puppeteer-extra-plugin-stealth - набор модулей, автоматически маскирующих известные признаки автоматизации (navigator.webdriver, language, plugins). Включает проверки, аналогичные тем, что используют сервисы защиты от ботов.
  • Chrome DevTools Protocol (CDP) - низкоуровневый интерфейс, предоставляющий доступ к параметрам профиля процессора, таймеров, размеров окна. Через CDP можно изменить значения, которые попадают в отпечаток.
  • amIUnique / Panopticlick - онлайн‑сервисы, выдающие детальный отчёт о собираемых данных. Их API позволяет автоматизировать запросы и сравнивать результаты между реальными и эмулированными сессиями.
  • User-Agent Switcher - простая утилита для подмены строки User‑Agent и заголовков Accept‑Language. В сочетании с puppeteer‑extra‑plugin‑stealth уменьшает количество совпадений с типичными автоматическими клиентами.

Практический процесс анализа выглядит так:

  1. Запуск браузера Puppeteer с включённым плагином stealth.
  2. Сбор базовых характеристик через FingerprintJS в начале сессии.
  3. Передача полученных данных в сервис amIUnique для получения сравнения с реальными пользователями.
  4. При обнаружении отклонений корректировка параметров через CDP (изменение размеров окна, отключение WebGL‑расширений, подмена таймеров).
  5. Повторный сбор и проверка, пока отклик сайта соответствует профилю обычного пользователя.

Комбинация перечисленных средств обеспечивает систематический подход к уменьшению риска идентификации браузера, управляемого Puppeteer, как автоматизированного клиента.

5.2. Проверка на популярных сайтах

Проверка эффективности скрытого режима в Puppeteer проводится на сайтах, активно использующих анти‑бот‑механизмы. Тестирование позволяет убедиться, что модификации браузера не вызывают типовых признаков автоматизации.

Для оценки применяются следующие ресурсы:

  • Google Search - проверка наличия капчи и корректного отображения результатов.
  • Facebook - проверка доступа к страницам без запросов о подозрительной активности.
  • Amazon - проверка корректного формирования запросов к каталогу и отсутствие блокировок.
  • LinkedIn - проверка возможности входа в профиль без запросов подтверждения личности.
  • Reddit - проверка возможности отправки комментариев без ограничения по скорости.

Процедура тестирования состоит из трёх этапов:

  1. Инициализация браузера с подключённым плагином stealth и настройками:
    • отключение headless‑режима;
    • подмена userAgent и viewport;
    • удаление свойства navigator.webdriver.
  2. Переход к целевому URL, ожидание полной загрузки DOM, сбор информации о признаках автоматизации (например, наличие navigator.plugins, languages, chrome.runtime).
  3. Анализ полученного ответа:
    • отсутствие запросов капчи → индикатор успешного скрытия;
    • отсутствие ошибок 403/429 → индикатор корректного обхода ограничений;
    • отсутствие предупреждающих сообщений в консоли браузера → индикатор полной маскировки.

Результаты демонстрируют, что при корректной конфигурации скрытый режим успешно проходит проверки на перечисленных платформах. На некоторых сайтах, например, Facebook, требуется дополнительно подменять заголовки Accept-Language и Referer для полного обхода детекторов. На остальных платформах базовая настройка плагина обеспечивает стабильный доступ без вызова защитных механизмов.

6. Ограничения и альтернативы

6.1. Невозможность полной невидимости

Поскольку браузер управляется через Puppeteer, его поведение оставляет следы, которые могут быть обнаружены сервером. Даже при включении параметров, скрывающих автоматизацию (например, --disable-blink-features=AutomationControlled), сохраняются признаки, связанные с:

  • отсутствием реального пользовательского ввода (механизм navigator.webdriver);
  • статическим набором HTTP‑заголовков (User‑Agent, Accept‑Language);
  • ограниченной поддержкой WebGL и Canvas, что приводит к однообразию графических отпечатков;
  • фиксированным таймингом выполнения скриптов, отличному от человеческих действий;
  • несовпадением параметров профиля браузера (маски, плагины, шрифты).

Эти характеристики формируют многокомпонентный отпечаток, который сравнивается с базой известных автоматизированных клиентов. Любой отклоняющийся параметр позволяет системе обнаружить, что запрос исходит не от обычного пользователя.

Кроме того, сеть может выявлять автоматизацию через анализ частоты запросов, последовательности переходов и отсутствие реферальных заголовков. Даже при распределении запросов через прокси‑серверы, метаданные соединения (TLS‑fingerprint, версия протокола) остаются отличимыми от типичных браузеров.

Таким образом, полное сокрытие присутствия скрипта в текущей архитектуре невозможно. Технические меры снижают вероятность обнаружения, но не устраняют фундаментальные различия между управляемым экземпляром и реальным клиентом. Эксперты рекомендуют комбинировать скрытие параметров, имитацию пользовательского ввода и адаптивные задержки, принимая во внимание, что 100 % анонимность не гарантируется.

6.2. Использование прокси и ротации IP-адресов

Прокси‑серверы позволяют скрыть реальный IP‑адрес браузера, создавая отдельный сетевой путь для каждого запущенного экземпляра. При работе в режиме скрытого доступа к веб‑ресурсам каждый запрос должен проходить через уникальный конечный пункт, иначе система обнаружения может сопоставить последовательные обращения с одним источником.

Для интеграции прокси в Puppeteer требуется указать параметры запуска браузера. Пример кода:

const puppeteer = require('puppeteer');
(async () => {
 const proxy = 'http://login:[email protected]:3128';
 const browser = await puppeteer.launch({
 args: [`--proxy-server=${proxy}`],
 headless: true,
 });
 const page = await browser.newPage();
 await page.goto('https://example.com');
 // дальнейшая логика
 await browser.close();
})();

Эффективная ротация IP‑адресов достигается сочетанием нескольких техник:

  • Список прокси - хранить массив строк с данными доступа, выбирать элемент случайным образом или последовательно.
  • Тайм‑аут между запросами - задавать паузы (например, 2-5 секунд) перед переключением на следующий прокси, чтобы избежать частых смен, которые могут выглядеть подозрительно.
  • Контроль ошибок - при получении статуса 403, 429 или таймаутов автоматически переключать текущий прокси на следующий в списке.
  • Обновление списка - периодически загружать новые адреса из внешних сервисов, удаляя неработающие.
  • Разделение контекстов - создавать отдельные браузерные контексты (incognito) для каждой группы запросов, привязывая к ним отдельный прокси.

Пример реализации ротации:

const proxies = [
 'http://user1:[email protected]:3128',
 'http://user2:[email protected]:3128',
 // …
];
async function launchWithProxy(proxy) {
 return puppeteer.launch({
 args: [`--proxy-server=${proxy}`],
 headless: true,
 });
}
(async () => {
 for (const proxy of proxies) {
 const browser = await launchWithProxy(proxy);
 const page = await browser.newPage();
 try {
 await page.goto('https://target-site.com', { timeout: 15000 });
 // обработка страницы
 } catch (e) {
 // при ошибке переходим к следующему прокси
 } finally {
 await browser.close();
 }
 await new Promise(r => setTimeout(r, 3000)); // пауза перед сменой
 }
})();

Ключевые аспекты настройки:

  • Аутентификация - включать логин и пароль в URL прокси, если сервис требует.
  • HTTPS‑поддержка - использовать --ignore-certificate-errors только в случае отсутствия доверенных сертификатов, иначе это может вызвать подозрения.
  • Параметры сети - задавать --disable-features=IsolateOrigins,site-per-process только при необходимости, чтобы избежать конфликтов с политиками безопасности сайта.
  • Логи - фиксировать IP‑адрес, использованный для каждого запроса, для последующего анализа эффективности ротации.

Систематическое применение перечисленных методов обеспечивает стабильную работу скриптов, минимизирует риск блокировки и поддерживает высокий уровень анонимности при взаимодействии с целевыми ресурсами.

6.3. Решение Captcha

Решение капчи в скрытом режиме работы Puppeteer требует сочетания технических приемов и внешних сервисов, поскольку автоматизированные запросы часто вызывают проверку пользователя. Основные подходы делятся на два направления: локальная обработка и привлечение специализированных API.

  • Встроенные плагины. Puppeteer‑extra‑plugin‑recaptcha позволяет автоматически обнаруживать формы reCAPTCHA, получать ключ сайта и отправлять запросы в выбранный сервис решения. Плагин интегрируется в цепочку запуска браузера, не нарушая общих настроек stealth‑модулей.

  • Внешние сервисы. 2Captcha, Anti‑Captcha, CapMonster предоставляют REST‑интерфейсы, принимающие токен сайта и возвращающие ответ в виде токена g-recaptcha-response. Для их использования необходимо:

    1. Вычислить sitekey из DOM.
    2. Сформировать запрос к API сервиса, указав sitekey и URL страницы.
    3. Получить токен и вставить его в скрытое поле формы через page.evaluate.
    4. Отправить форму программно.
  • Оптическое распознавание. Для простых изображений (CAPTCHA‑type) можно применить Tesseract.js или специализированные модели машинного обучения. Такой подход требует предварительной предобработки изображения (бинаризация, удаление шумов) и последующего ввода полученного текста в форму.

  • Обход проверки. При работе в режиме скрытности полезно:

    • Отключать загрузку скриптов, отвечающих за капчу, используя page.setRequestInterception и фильтрацию запросов по URL.
    • Подменять заголовки User-Agent, Accept-Language и другие свойства, чтобы не вызывать подозрений у анти‑ботов.
    • Менять IP‑адреса через прокси‑пулы, что уменьшает вероятность повторных вызовов капчи.
  • Ручное решение. При необходимости можно вызвать интерактивный ввод токена пользователем через консоль или отдельный UI‑модуль, после чего продолжить автоматизацию.

Эффективная комбинация этих методов позволяет поддерживать скрытую работу скриптов, минимизировать количество вызовов капчи и обеспечить стабильный проход страниц, защищённых проверкой человеческого взаимодействия.

Как повысить эффективность обработки данных в 10 раз с помощью ИИ

Интеграция AI для анализа, структурирования и обогащения собранных данных. Доступ к более 50 моделям для решения бизнес-задач по самым низким ценам в РФ.