Назад к блогу
Отпечатки

Контроль частоты кадров с BotBrowser

Как BotBrowser управляет частотой обновления дисплея и таймингом requestAnimationFrame на уровне движка, чтобы предотвратить fingerprinting по FPS.

Введение

API requestAnimationFrame синхронизирует операции отрисовки с циклом обновления экрана. Частота вызовов раскрывает частоту обновления дисплея (60 Гц ≈ 16.67 мс, 144 Гц ≈ 6.94 мс), что доступно любому сайту и используется для fingerprinting.

Влияние на приватность

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

Подход BotBrowser на уровне движка

BotBrowser задаёт частоту кадров в самом рендеринг-пайплайне через флаг --bot-fps. Это гарантирует согласованность всех источников, зависящих от частоты кадров.

Режимы

# Частота из профиля
chrome --bot-profile="/path/to/profile.enc" --bot-fps=profile

# Фиксированные 60 FPS
chrome --bot-profile="/path/to/profile.enc" --bot-fps=60

# Использовать реальную частоту дисплея
chrome --bot-profile="/path/to/profile.enc" --bot-fps=real

Проверка

Измерьте интервалы requestAnimationFrame и убедитесь, что измеренная FPS совпадает с заданной.

Резюме

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

title: "Управление частотой кадров с BotBrowser" description: "Как BotBrowser контролирует сигналы частоты обновления дисплея с помощью флага --bot-fps на уровне движка браузера." date: "2025-07-08" locale: ru category: fingerprint tags: ["fps", "frame-rate", "requestAnimationFrame", "fingerprinting", "privacy"] published: true

Риск для конфиденциальности

Частота обновления дисплея, измеримая через тайминг requestAnimationFrame, раскрывает оборудование монитора. Это значение определяется физическим оборудованием и не меняется при очистке cookies или смене браузера.

Решение BotBrowser

BotBrowser предоставляет флаг --bot-fps для управления частотой кадров на уровне конвейера рендеринга движка браузера.

Частота кадров на основе профиля

Используйте значение из профиля отпечатка:

chrome --bot-profile="/path/to/profile.enc" \
       --bot-fps=profile \
       --user-data-dir="$(mktemp -d)"

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

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

Установите конкретное значение или используйте реальную частоту обновления дисплея:

# Фиксированные 60 FPS
chrome --bot-profile="/path/to/profile.enc" \
       --bot-fps=60

# Реальная частота обновления дисплея
chrome --bot-profile="/path/to/profile.enc" \
       --bot-fps=real

Управление на уровне движка

Поскольку это работает на уровне конвейера рендеринга:

  • Обратные вызовы requestAnimationFrame срабатывают с контролируемой частотой
  • Временные метки кадров согласованы с сообщаемой частотой
  • CSS-анимации ведут себя согласованно с сообщаемой частотой кадров

Верификация

После запуска с --bot-fps проверьте частоту кадров:

const { chromium } = require('playwright-core');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-fps=60',
  ],
  headless: true,
});

const page = await (await browser.newContext()).newPage();

const measuredFps = await page.evaluate(() => {
  return new Promise(resolve => {
    const timestamps = [];
    function frame(ts) {
      timestamps.push(ts);
      if (timestamps.length < 60) {
        requestAnimationFrame(frame);
      } else {
        const intervals = [];
        for (let i = 1; i < timestamps.length; i++) {
          intervals.push(timestamps[i] - timestamps[i - 1]);
        }
        const avg = intervals.reduce((a, b) => a + b) / intervals.length;
        resolve(Math.round(1000 / avg));
      }
    }
    requestAnimationFrame(frame);
  });
});

console.log('Измеренный FPS:', measuredFps); // Должно быть ~60

Ключевые проверки:

  1. Измеренная частота кадров соответствует настроенному значению
  2. Интервалы между кадрами согласованы
  3. Несколько методов измерения дают одинаковый результат

Начало работы

  1. Скачайте BotBrowser с GitHub
  2. Загрузите профиль отпечатка с помощью --bot-profile
  3. Установите частоту кадров с --bot-fps=profile, --bot-fps=real или --bot-fps=60
  4. Проверьте, что сообщаемая частота кадров соответствует вашей конфигурации
#fps#frame-rate#requestAnimationFrame#fingerprinting#privacy#display