Подмена отпечатков браузера

Puppeteer — это мощный инструмент для автоматизации браузеров, использующий API для взаимодействия с Chrome или Chromium. Одной из задач, с которой сталкиваются разработчики при использовании Puppeteer, является подмена отпечатков браузера. Это необходимо для обхода защит, которые проверяют наличие автоматизированных скриптов, и для имитации реального пользователя, чтобы не быть заблокированным системами защиты от ботов.

Отпечаток браузера (browser fingerprint) — это уникальные характеристики, которые позволяют определить, что браузер или устройство использует именно этот пользователь. Подмена этих характеристик помогает сделать автоматизированные тесты более правдоподобными.

Основные аспекты отпечатка браузера

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

  1. User-Agent — строка, которая сообщает о браузере и его версии.
  2. Screen resolution — разрешение экрана устройства.
  3. Timezone — информация о временной зоне.
  4. Language settings — язык браузера.
  5. Plugins — перечень плагинов, доступных в браузере.
  6. Canvas fingerprinting — уникальная характеристика, получаемая через рендеринг HTML5 canvas.
  7. WebGL fingerprinting — уникальные особенности, связанные с WebGL.
  8. LocalStorage, Cookies — данные, сохранённые в браузере.

Для тестирования или обхода защиты важно не только заменить некоторые из этих параметров, но и сделать это таким образом, чтобы система не заметила изменений.

Использование Puppeteer для подмены отпечатков браузера

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

  1. Изменение User-Agent

С помощью Puppeteer можно легко изменить строку User-Agent, чтобы имитировать другой браузер или устройство. Это можно сделать через page.setUserAgent().

const puppeteer = require(&

(async () => { const browser = await puppeteer.launch(); const page =
await browser.newPage(); await page.setUserAgent('Mozilla/5.0 (Windows
NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/58.0.3029.110 Safari/537.3'); await
page.goto('https://www.whatismybrowser.com/'); await browser.close();
})();

Этот метод полезен, когда нужно скрыть или изменить информацию о браузере, но стоит учитывать, что простая подмена User-Agent не всегда достаточно для скрытия использования Puppeteer.

  1. Подмена разрешения экрана

Размер экрана является одним из важных признаков, по которому можно отличить реального пользователя от бота. В Puppeteer можно подменить разрешение экрана, задав его через page.setViewport().

const puppeteer = require('puppeteer');

(async () => { const browser = await puppeteer.launch(); const page =
await browser.newPage(); await page.setViewport({ width: 1366, height:
768 }); await page.goto('https://www.whatismybrowser.com/'); await
browser.close(); })();

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

  1. Установка временной зоны

Время и временная зона также могут быть использованы для идентификации пользователя. Чтобы изменить временную зону в Puppeteer, необходимо использовать page.emulateTimezone().

const puppeteer = require('puppeteer');

(async () => { const browser = await puppeteer.launch(); const page =
await browser.newPage(); await page.emulateTimezone('Europe/Moscow');
await page.goto('https://www.whatismybrowser.com/'); await
browser.close(); })();

Этот метод позволяет установить временную зону, совпадающую с той, что используется у реального пользователя.

  1. Подмена данных в LocalStorage и Cookies

Для более сложных сценариев нужно подменить данные, хранящиеся в LocalStorage и Cookies. Это можно сделать с помощью методов page.setCookie() и page.evaluate() для изменения значений LocalStorage.

const puppeteer = require('puppeteer');

(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage();

// Изменение cookies await page.setCookie({ name: 'session_id', value: '1234567890', domain: 'example.com' });

// Изменение LocalStorage await page.evaluate(() => { localStorage.setItem('user', 'testUser'); });

await page.goto('https://www.example.com'); await browser.close(); })();

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

Проблемы и ограничения

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

  2. WebDriver Detection Множество сайтов используют методы для обнаружения использования WebDriver, а значит, автоматизации через Puppeteer. Такие методы могут включать проверку наличия объекта navigator.webdriver. Чтобы скрыть использование WebDriver, можно изменить этот объект через page.evaluate():

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    });
  });
  await page.goto('https://www.whatismybrowser.com/');
  await browser.close();
})();

Этот код скроет наличие WebDriver, что поможет избежать блокировки.

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

Заключение

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