Puppeteer предоставляет мощные инструменты для автоматизации браузера с использованием JavaScript, но часто возникает проблема — обнаружение работы с headless-браузером. Проблема заключается в том, что многие сайты используют различные методы для определения того, работает ли браузер в headless-режиме. Для тестировщиков это может быть значительной преградой, так как многие сервисы блокируют или ограничивают доступ для автоматических систем, пытаясь минимизировать мошенничество, боты и нежелательные автоматические запросы.
Существует несколько распространённых техник, которые сайты используют для того, чтобы понять, работает ли пользовательский браузер в headless-режиме:
User-Agent и характеристики браузера
Многие сайты проверяют User-Agent, который
headless-браузер, как правило, может содержать по умолчанию. Это
упрощает процесс распознавания автоматических запросов. Однако,
достаточно просто изменить или подделать User-Agent, чтобы
не быть пойманным этим методом.
Использование JavaScript для проверки
Один из самых очевидных способов обнаружения — это использование
JavaScript, который может проверять доступность некоторых свойств,
доступных только в обычных браузерах, но недоступных в headless-режиме.
Например, проверка значений navigator.plugins,
navigator.webdriver и других скрытых объектов позволяет
точно определить, используется ли Puppeteer для автоматизации.
Отслеживание поведения интерфейса
Сайты могут отслеживать поведение браузера, например, через анализ взаимодействия с элементами страницы. В headless-режиме браузер часто взаимодействует с элементами слишком быстро и без задержек, что может отличаться от обычных действий человека.
Canvas Fingerprinting
Canvas fingerprinting — это метод, при котором сайт рисует картинку на
элементе <canvas> и анализирует данные, полученные в
результате этого процесса. В headless-браузере могут возникать отличия в
генерации изображения, которые легко выявить.
WebGL и особенности графической системы
При использовании WebGL для рендеринга графики могут возникать различия между 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 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 — это протокол, который позволяет передавать аудио, видео и данные напрямую между браузерами. Он может быть использован для обнаружения headless-режима, так как в обычных браузерах WebRTC настроен на работу, а в headless-режиме могут возникать аномалии. Для предотвращения утечек информации можно отключить WebRTC в настройках браузера Puppeteer.
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'mediaDevices', {
get: () => ({
enumerateDevices: () => Promise.resolve([])
})
});
});
Этот код предотвращает доступ к медиа-устройствам, таким как камера и микрофон, тем самым уменьшая шанс быть выявленным с помощью WebRTC.
Для успешного обхода систем, обнаруживающих headless-режим, следует учитывать несколько ключевых аспектов:
Использование модификаций и плагинов Использование
готовых решений, таких как puppeteer-extra-plugin-stealth,
значительно упрощает задачу. Этот плагин автоматически применяет
множество исправлений, что позволяет избежать множества распространённых
методов детекции.
Симуляция действий реального пользователя Нужно постараться как можно больше имитировать поведение обычного пользователя: добавление случайных задержек, изменение движений мыши и другие методы.
Обновление и настройка библиотеки Puppeteer активно развивается, и иногда обнаружение может быть связано с устаревшей версией библиотеки. Регулярное обновление Puppeteer и его зависимостей помогает избежать подобных проблем.
Использование proxy-серверов и VPN В некоторых случаях стоит также использовать прокси-серверы и VPN для сокрытия реального IP-адреса и изменения географического положения запроса, что помогает избежать блокировок на основе гео-локации.
Обнаружение headless-браузеров является важной проблемой для
тестирования и автоматизации с Puppeteer. Однако существует ряд
эффективных методов обхода, начиная от подделки стандартных
характеристик браузера и заканчивая использованием специализированных
библиотек, таких как puppeteer-extra-plugin-stealth.
Правильная настройка и использование этих методов помогает снизить
вероятность блокировки и повышает стабильность работы автоматических
тестов.