Идентичность

Фингерпринтинг часового пояса, локали и языка

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

Документация

Нужна поддерживаемая продуктовая документация?

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

Введение

Ваш браузер раскрывает географическую информацию через множество каналов: часовой пояс через API Intl, локаль через форматирование чисел и дат, язык через navigator.language и заголовок Accept-Language, а также геолокацию через Geolocation API. Эти четыре свойства формируют географический слой идентичности вашего браузера. Когда они не согласуются друг с другом или с вашим IP-адресом, несоответствие видимо.

BotBrowser предоставляет специальные флаги CLI для настройки каждого географического свойства на уровне движка. По умолчанию BotBrowser автоматически выводит все географические настройки из IP вашего прокси, поэтому один флаг --proxy-server производит полностью согласованную географическую идентичность. Эта статья охватывает систему автоопределения, флаги ручного переопределения и стратегии конфигурации для мультирегиональных рабочих процессов.

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

Географические метаданные - один из наиболее часто проверяемых аспектов идентичности браузера. Системы отслеживания сравнивают:

  • Геолокация IP vs. часовой пояс: IP-адрес в Германии с часовым поясом America/New_York - очевидное несоответствие
  • Локаль vs. язык: локаль de-DE с Accept-Language: en-US одна - необычно
  • Язык vs. регион IP: японский IP с только английскими языковыми предпочтениями может указывать на ошибку конфигурации
  • Координаты геолокации vs. IP: если Geolocation API возвращает координаты в Токио, а IP указывает на Нью-Йорк, конфликт очевиден

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

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

Техническая основа

Как браузеры раскрывают географическую информацию

Часовой пояс: Intl.DateTimeFormat().resolvedOptions().timeZone в JavaScript возвращает имя часового пояса IANA (например, America/New_York). Метод getTimezoneOffset() объекта Date возвращает смещение UTC в минутах. Оба должны быть согласованы друг с другом и с заявленным местоположением.

Локаль: Intl.NumberFormat().resolvedOptions().locale и Intl.DateTimeFormat().resolvedOptions().locale раскрывают локаль форматирования браузера. Это влияет на форматирование чисел (запятая vs. точка для десятичных), форматирование дат (ДД/ММ vs. ММ/ДД) и форматирование валют.

Язык: navigator.language возвращает основной язык, а navigator.languages возвращает полный список предпочтительных языков. Заголовок Accept-Language HTTP отправляет эти предпочтения с каждым запросом.

Геолокация: API navigator.geolocation.getCurrentPosition() возвращает GPS-подобные координаты. Это требует разрешения пользователя, но при предоставлении координаты должны быть правдоподобны с учетом IP и часового пояса.

Цепочка согласованности

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

IP-адрес → Страна → Часовой пояс → Локаль → Языки → Геолокация

Каждый шаг должен логически следовать из предыдущего. IP прокси в Японии должен производить:

  • Часовой пояс: Asia/Tokyo
  • Локаль: ja-JP
  • Языки: ja-JP,ja,en
  • Геолокация: координаты в Японии (при запросе)

Разрыв любого звена в этой цепочке создает обнаруживаемое несоответствие.

Летнее время и смещения UTC

Конфигурация часового пояса должна учитывать летнее время (DST). Использование UTC-смещений вроде UTC-5 вместо имен часовых поясов IANA вроде America/New_York не работает при переходах DST. America/New_York - это UTC-5 зимой и UTC-4 летом. Фиксированное UTC-смещение не обрабатывает этот переход, создавая сезонное несоответствие, раскрывающее ручную настройку часового пояса.

BotBrowser использует имена часовых поясов IANA внутренне, обеспечивая корректное поведение DST в течение года.

Geographic Identity Consistency Chain Proxy IP 203.0.113.1 Timezone Asia/Tokyo Locale ja-JP Languages ja-JP, ja, en Geolocation 35.67, 139.65 BotBrowser auto-derives all from proxy IP Override any property with --bot-config-* flags when needed

Распространенные подходы и их ограничения

Часовой пояс и локаль на уровне фреймворка

Playwright предоставляет параметры timezoneId и locale для каждого контекста:

const context = await browser.newContext({
  timezoneId: 'America/New_York',
  locale: 'en-US',
});

Это меняет поведение API Intl и navigator.language, но:

  • Координаты геолокации не затрагиваются
  • Заголовок Accept-Language может не полностью согласовываться
  • Смещение часового пояса в Date.getTimezoneOffset() может не обновляться согласованно во всех контекстах

Ручная установка заголовков

Установка Accept-Language через page.setExtraHTTPHeaders() меняет HTTP-заголовок, но не navigator.language или navigator.languages. Несоответствие между значениями HTTP и JavaScript обнаруживаемо.

VPN с системным часовым поясом

Изменение системного часового пояса для соответствия VPN работает, но влияет на все приложения, не только на браузер. Также требует административного доступа и ручного вмешательства при каждой смене региона.

Подход BotBrowser

Автоматическое географическое определение

По умолчанию BotBrowser автоматически выводит все географические настройки из IP прокси:

chrome --bot-profile="/path/to/profile.enc" \
       --proxy-server=socks5://user:pass@jp-proxy:1080

BotBrowser определяет японский IP и автоматически настраивает:

  • Часовой пояс: Asia/Tokyo
  • Локаль: ja-JP
  • Языки: ja-JP,ja,en
  • Геолокация: координаты, приблизительно определенные по IP

Никаких дополнительных флагов не нужно. Поведение auto является значением по умолчанию для всех географических настроек.

Флаги ручного переопределения

Когда нужны конкретные географические настройки, четыре флага CLI обеспечивают полный контроль:

--bot-config-timezone (ENT Tier1): установка часового пояса IANA.

--bot-config-timezone=America/New_York    # Конкретный часовой пояс
--bot-config-timezone=auto                # Вывод из IP (по умолчанию)
--bot-config-timezone=real                # Использовать системный часовой пояс

--bot-config-locale (ENT Tier1): установка локали браузера.

--bot-config-locale=en-US    # Конкретная локаль
--bot-config-locale=auto     # Вывод из IP/языка (по умолчанию)

--bot-config-languages (ENT Tier1): установка языковых предпочтений.

--bot-config-languages=en-US,en          # Конкретные языки
--bot-config-languages=auto              # Вывод из IP (по умолчанию)

--bot-config-location (ENT Tier1): установка координат геолокации.

--bot-config-location=40.7128,-74.0060   # Конкретные координаты
--bot-config-location=auto               # Вывод из IP (по умолчанию)
--bot-config-location=real               # Использовать системный GPS

Реализация на уровне движка

BotBrowser устанавливает эти значения на уровне движка браузера, что означает:

  • Часовой пояс: Intl.DateTimeFormat().resolvedOptions().timeZone и Date.getTimezoneOffset() оба отражают настроенный часовой пояс, включая корректное поведение DST
  • Локаль: все форматтеры Intl (NumberFormat, DateTimeFormat, Collator) используют настроенную локаль
  • Языки: navigator.language, navigator.languages и HTTP-заголовок Accept-Language все согласованы
  • Геолокация: navigator.geolocation.getCurrentPosition() возвращает настроенные координаты

Все значения согласованы между основным потоком, workers и HTTP-заголовками.

Настройка и использование

Полная географическая конфигурация (CLI)

chrome --bot-profile="/path/to/profile.enc" \
       --proxy-server=socks5://user:pass@us-east.proxy:1080 \
       --bot-config-timezone=America/New_York \
       --bot-config-locale=en-US \
       --bot-config-languages=en-US,en \
       --bot-config-location=40.7128,-74.0060

Распространенные конфигурации по регионам

РегионЧасовой поясЛокальЯзыкиКоординаты
Восток СШАAmerica/New_Yorken-USen-US,en40.7128,-74.0060
Запад СШАAmerica/Los_Angelesen-USen-US,en34.0522,-118.2437
ВеликобританияEurope/Londonen-GBen-GB,en51.5074,-0.1278
ГерманияEurope/Berlinde-DEde-DE,de,en52.5200,13.4050
ФранцияEurope/Parisfr-FRfr-FR,fr,en48.8566,2.3522
ЯпонияAsia/Tokyoja-JPja-JP,ja,en35.6762,139.6503
Южная КореяAsia/Seoulko-KRko-KR,ko,en37.5665,126.9780
БразилияAmerica/Sao_Paulopt-BRpt-BR,pt,en-23.5505,-46.6333
АвстралияAustralia/Sydneyen-AUen-AU,en-33.8688,151.2093

Интеграция с Playwright

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

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
      '--proxy-server=socks5://user:pass@us-east.proxy:1080',
      '--bot-config-timezone=America/New_York',
      '--bot-config-locale=en-US',
      '--bot-config-languages=en-US,en',
      '--bot-config-location=40.7128,-74.0060',
    ],
    headless: true,
  });

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

  const tz = await page.evaluate(() =>
    Intl.DateTimeFormat().resolvedOptions().timeZone
  );
  const langs = await page.evaluate(() => navigator.languages);
  const locale = await page.evaluate(() =>
    Intl.NumberFormat().resolvedOptions().locale
  );

  console.log('Timezone:', tz);     // America/New_York
  console.log('Languages:', langs); // ['en-US', 'en']
  console.log('Locale:', locale);   // en-US

  await browser.close();
})();

Мультирегиональная конфигурация

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

const regions = [
  {
    profile: '/profiles/us-user.enc',
    proxy: 'socks5://user:pass@us.proxy:1080',
    timezone: 'America/New_York',
    locale: 'en-US',
    languages: 'en-US,en',
    location: '40.7128,-74.0060',
  },
  {
    profile: '/profiles/de-user.enc',
    proxy: 'socks5://user:pass@de.proxy:1080',
    timezone: 'Europe/Berlin',
    locale: 'de-DE',
    languages: 'de-DE,de,en',
    location: '52.5200,13.4050',
  },
  {
    profile: '/profiles/jp-user.enc',
    proxy: 'socks5://user:pass@jp.proxy:1080',
    timezone: 'Asia/Tokyo',
    locale: 'ja-JP',
    languages: 'ja-JP,ja,en',
    location: '35.6762,139.6503',
  },
];

for (const cfg of regions) {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      `--bot-profile=${cfg.profile}`,
      `--proxy-server=${cfg.proxy}`,
      `--bot-config-timezone=${cfg.timezone}`,
      `--bot-config-locale=${cfg.locale}`,
      `--bot-config-languages=${cfg.languages}`,
      `--bot-config-location=${cfg.location}`,
    ],
    headless: true,
  });

  // Выполнение региональных задач...
  await browser.close();
}

Верификация

После настройки географических параметров проверьте все свойства:

const page = await context.newPage();

// Часовой пояс
const tz = await page.evaluate(() =>
  Intl.DateTimeFormat().resolvedOptions().timeZone
);

// Смещение часового пояса (должно быть корректным для текущей даты/DST)
const offset = await page.evaluate(() => new Date().getTimezoneOffset());

// Локаль из форматирования чисел
const locale = await page.evaluate(() =>
  Intl.NumberFormat().resolvedOptions().locale
);

// Языки
const lang = await page.evaluate(() => navigator.language);
const langs = await page.evaluate(() => navigator.languages);

// Форматирование даты (специфичное для локали)
const dateFormat = await page.evaluate(() =>
  new Date().toLocaleDateString()
);

// Форматирование чисел (специфичное для локали)
const numFormat = await page.evaluate(() =>
  (1234567.89).toLocaleString()
);

console.log('Timezone:', tz);
console.log('Offset:', offset);
console.log('Locale:', locale);
console.log('Language:', lang);
console.log('Languages:', langs);
console.log('Date format:', dateFormat);
console.log('Number format:', numFormat);

Подтвердите, что:

  1. Часовой пояс совпадает с ожидаемым именем IANA
  2. UTC-смещение корректно для текущей даты (с учетом DST)
  3. Локаль корректно влияет на форматирование чисел и дат
  4. Языки в ожидаемом порядке приоритета
  5. Все значения географически согласованы с IP прокси

Лучшие практики

  1. Используйте имена часовых поясов IANA, а не UTC-смещения. America/New_York корректно обрабатывает DST. UTC-5 - нет.

  2. Устанавливайте языки в порядке приоритета. Пользователь в Германии обычно имел бы de-DE,de,en. Включение английского как вторичного языка реалистично для большинства регионов.

  3. Сопоставляйте геолокацию с городом прокси, а не с конкретным адресом. Точность на уровне города достаточна и более реалистична, чем точные координаты.

  4. Держите локаль и часовой пояс в одном регионе. Локаль ja-JP с часовым поясом Europe/London - очевидное несоответствие.

  5. Используйте автоопределение BotBrowser когда возможно. Значение auto по умолчанию производит согласованные результаты из IP прокси без ручной конфигурации.

  6. Тестируйте поведение форматирования, а не только значения API. Проверяйте, что toLocaleDateString() и toLocaleString() производят форматы, подходящие для региона.

Часто задаваемые вопросы

Корректно ли BotBrowser обрабатывает переходы DST? Да. BotBrowser использует имена часовых поясов IANA внутренне, которые кодируют правила DST. Date.getTimezoneOffset() возвращает корректное смещение для любой даты, включая переходы.

Можно ли установить часовой пояс для каждого контекста в Playwright? Опция timezoneId в Playwright для каждого контекста меняет поведение JavaScript Intl. Флаг --bot-config-timezone BotBrowser устанавливает часовой пояс на уровне движка. Оба подхода работают, но флаг BotBrowser также обеспечивает согласованность на уровне HTTP.

Что происходит при использовании автоопределения без прокси? Без прокси BotBrowser использует ваш реальный публичный IP для автоопределения. Географические настройки будут соответствовать вашему фактическому местоположению.

Можно ли установить только часовой пояс и позволить остальному автоопределиться? Да. Вы можете переопределить отдельные настройки. Например, установка только --bot-config-timezone при оставлении локали, языков и местоположения на auto работает. Однако убедитесь, что часовой пояс согласован с автоматически определенными значениями.

Требует ли --bot-config-location разрешения пользователя? BotBrowser устанавливает значения геолокации, которые возвращаются при запросе страницей разрешения на геолокацию. Поведение запроса разрешения пользователя контролируется настройками контекста браузера.

Какой формат языков принимает --bot-config-languages? Список через запятую языковых тегов BCP 47: en-US,en,fr-FR,fr. Порядок определяет приоритет, отражаемый в navigator.languages и заголовке Accept-Language.

Можно ли использовать эти флаги без --bot-profile? Географические флаги работают независимо, но без профиля у вас нет защиты отпечатков. Всегда используйте --bot-profile как основу.

Обновляется ли заголовок Accept-Language при установке --bot-config-languages? Да. Заголовок Accept-Language в каждом HTTP-запросе отражает настроенный список языков, включая корректные значения качества (q-values) для порядка приоритетов.

Итоги

Часовой пояс, локаль, язык и геолокация формируют географический слой идентичности вашего браузера. BotBrowser автоматически выводит все географические настройки из IP вашего прокси по умолчанию, производя согласованную идентичность без ручной конфигурации. Для конкретных требований флаги --bot-config-timezone, --bot-config-locale, --bot-config-languages и --bot-config-location обеспечивают полный контроль на уровне движка.

Для настройки прокси см. Proxy Configuration. Для идентичности браузера см. Browser Brand Switching и User Agent Control and Client Hints. Для мультирегиональных рабочих процессов см. Multi-Account Browser Isolation.

#Timezone#Locale#Language#Identity#Geolocation

Переведите BotBrowser из исследований в продакшн

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