Проблема обнаружения headless браузера

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

Существует несколько распространённых техник, которые сайты используют для того, чтобы понять, работает ли пользовательский браузер в headless-режиме:

  1. User-Agent и характеристики браузера

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

  2. Использование JavaScript для проверки

    Один из самых очевидных способов обнаружения — это использование JavaScript, который может проверять доступность некоторых свойств, доступных только в обычных браузерах, но недоступных в headless-режиме. Например, проверка значений navigator.plugins, navigator.webdriver и других скрытых объектов позволяет точно определить, используется ли Puppeteer для автоматизации.

  3. Отслеживание поведения интерфейса

    Сайты могут отслеживать поведение браузера, например, через анализ взаимодействия с элементами страницы. В headless-режиме браузер часто взаимодействует с элементами слишком быстро и без задержек, что может отличаться от обычных действий человека.

  4. Canvas Fingerprinting

    Canvas fingerprinting — это метод, при котором сайт рисует картинку на элементе <canvas> и анализирует данные, полученные в результате этого процесса. В headless-браузере могут возникать отличия в генерации изображения, которые легко выявить.

  5. WebGL и особенности графической системы

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

Как обойти обнаружение headless-браузера

Для обхода различных методов обнаружения headless-режима важно применить несколько техник, направленных на изменение стандартных характеристик работы Puppeteer.

Подделка navigator.webdriver

Одним из основных признаков headless-режима является наличие свойства navigator.webdriver, которое указывает на использование автоматизации браузера. В headless-режиме Puppeteer устанавливает это свойство в значение true. Чтобы обойти проверку, можно подделать значение navigator.webdriver:

await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, &
        get: () => false
    });
});

Этот код изменяет значение свойства navigator.webdriver на false, что позволит скрыть факт использования автоматизации.

Подделка User-Agent

Как правило, браузеры в headless-режиме могут использовать стандартный User-Agent, который не всегда совпадает с тем, что используют обычные браузеры. Для предотвращения блокировки можно задать свой собственный User-Agent:

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');

Здесь указан стандартный User-Agent для браузера Chrome, что позволяет избежать распознавания как headless-версии.

Ожидания для имитации человеческого поведения

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

const randomDelay = () => Math.floor(Math.random() * 200) + 100;
await page.click('button#submit');
await page.waitForTimeout(randomDelay());
await page.type('input#search', 'Puppeteer', { delay: randomDelay() });

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

Модификация Canvas и WebGL

Для обхода canvas и WebGL fingerprinting можно воспользоваться дополнительными библиотеками или специально настроенными методами. Например, с помощью Puppeteer можно использовать библиотеку puppeteer-extra-plugin-stealth, которая автоматически подделывает признаки, такие как navigator.plugins и WebGL, и делает браузер более схожим с настоящим.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');

Эта библиотека решает множество проблем с детекцией, включая canvas fingerprinting и другие методы, основанные на особенностях рендеринга.

Работа с WebRTC

WebRTC — это протокол, который позволяет передавать аудио, видео и данные напрямую между браузерами. Он может быть использован для обнаружения headless-режима, так как в обычных браузерах WebRTC настроен на работу, а в headless-режиме могут возникать аномалии. Для предотвращения утечек информации можно отключить WebRTC в настройках браузера Puppeteer.

await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, 'mediaDevices', {
        get: () => ({
            enumerateDevices: () => Promise.resolve([])
        })
    });
});

Этот код предотвращает доступ к медиа-устройствам, таким как камера и микрофон, тем самым уменьшая шанс быть выявленным с помощью WebRTC.

Рекомендации по настройке Puppeteer для анонимности

Для успешного обхода систем, обнаруживающих headless-режим, следует учитывать несколько ключевых аспектов:

  1. Использование модификаций и плагинов Использование готовых решений, таких как puppeteer-extra-plugin-stealth, значительно упрощает задачу. Этот плагин автоматически применяет множество исправлений, что позволяет избежать множества распространённых методов детекции.

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

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

  4. Использование proxy-серверов и VPN В некоторых случаях стоит также использовать прокси-серверы и VPN для сокрытия реального IP-адреса и изменения географического положения запроса, что помогает избежать блокировок на основе гео-локации.

Заключение

Обнаружение headless-браузеров является важной проблемой для тестирования и автоматизации с Puppeteer. Однако существует ряд эффективных методов обхода, начиная от подделки стандартных характеристик браузера и заканчивая использованием специализированных библиотек, таких как puppeteer-extra-plugin-stealth. Правильная настройка и использование этих методов помогает снизить вероятность блокировки и повышает стабильность работы автоматических тестов.