Назад в Центр знаний
Идентичность

Переключение бренда: Chrome, Edge, Brave, Opera

Почему User-Agent, Client Hints и navigator.userAgentData должны указывать один бренд браузера, и как задать и проверить идентичность Chrome, Edge, Brave или Opera.

BotBrowser Team

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

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

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

Граница возможностей BotBrowser: При выборе бренда на запуске BotBrowser может согласовать User-Agent, Client Hints, navigator.userAgentData, порядок брендов, GREASE и версии бренда. Он не эмулирует интерфейс, функции или поведение расширений конкретного бренда; работающий экземпляр нельзя сменить без создания нового; также нельзя гарантировать принятие этой идентичности сайтом или результат её обнаружения.

TL;DR

Кратко (TL;DR): Надёжное переключение бренда меняет все поверхности бренда одновременно. Задайте --bot-browser-brand при запуске, согласуйте версии Chromium и бренда, затем проверьте User-Agent, Client Hints и navigator.userAgentData. Согласованный бренд лишь часть цельной идентичности профиля, региона, платформы и сети.

Кратко

Содержание

Почему смешанный бренд браузера легко заметить

Бренд браузера - это название производителя, которое браузер сообщает о себе: Google Chrome, Microsoft Edge, Brave, Opera или просто Chromium. Бренд указывается сразу в нескольких местах, и ответ на вопрос «что это за бренд?» должен совпадать везде. Сеанс, который в заголовке User-Agent называет себя Microsoft Edge, а в Sec-CH-UA или navigator.userAgentData по-прежнему перечисляет только Google Chrome, дает два разных ответа на один вопрос.

Это важно и для приватности, и для обычной работоспособности. Сайты и аналитические сервисы используют бренд, чтобы сегментировать посетителей, решать, какие функции или подсказки показывать, и группировать похожие сеансы. Когда сигналы расходятся, само расхождение делает браузер заметнее, чем любой отдельный бренд, а это противоположно цели настройки, ориентированной на приватность. Кроме того, возникают бытовые проблемы: страница может показать подсказку, рассчитанную на Edge, сеансу, у которого Client Hints сообщают Chrome.

Схема: строка User-Agent, заголовки Client Hints и navigator.userAgentData определяются одним выбранным брендом браузера

Чаще всего с этим сталкиваются две группы читателей. Команды, которые проверяют работу продукта для пользователей Edge или Brave, должны получить браузер, называющий тот бренд, который проверяется. Люди, которые ведут несколько раздельных идентичностей для приватности, должны получить для каждой идентичности устойчивый и внутренне согласованный результат. Обе цели зависят от согласованности, а не от одного значения, и обе легко нарушить частичным изменением. Закладки тоже входят в браузерную идентичность, которую можно подготовить заранее, об этом рассказано в материале Внедрение закладок: предзаполнение закладок браузера.

Перед сменой бренда стоит задать себе три вопроса:

  • Какие поверхности сообщают бренд и меняются ли они все вместе?
  • Относится ли версия, специфичная для бренда, к той же основной версии Chromium, что и остальная идентичность?
  • Описывают ли выбор профиля, сети, региональных параметров и платформы по-прежнему один согласованный браузер?

Поверхности, которые несут идентичность бренда

В браузере на основе Chromium бренд выражается через строку User-Agent, заголовки Client Hints, API navigator.userAgentData, порядок и форму списка брендов и номера версий, связанные с каждой записью. Каждая поверхность описана ниже.

Строка User-Agent

Заголовок запроса User-Agent и navigator.userAgent несут бренд в виде токена продукта в конце строки. Все браузеры на основе Chromium сохраняют токены Chrome/ и Safari/537.36 ради совместимости, поэтому различается токен производителя:

Chrome: Mozilla/5.0 ... Chrome/142.0.7444.60 Safari/537.36
Edge:   Mozilla/5.0 ... Chrome/142.0.7444.60 Safari/537.36 Edg/142.0.3595.65
Brave:  Mozilla/5.0 ... Chrome/142.0.7444.60 Safari/537.36
Opera:  Mozilla/5.0 ... Chrome/142.0.7444.60 Safari/537.36 OPR/<версия opera>

У Brave в этой строке нет собственного токена, поэтому его бренд виден в Client Hints. Это одна из причин, по которой одной строки недостаточно, чтобы понять, что сообщает браузер.

Заголовки Client Hints

Client Hints - структурированная замена разбору строки User-Agent. Механизм определен в RFC 8942, а подсказки об агенте пользователя описаны в MDN. Небольшой набор подсказок с низкой энтропией, включая Sec-CH-UA, отправляется с запросами по умолчанию. Более подробные значения, такие как Sec-CH-UA-Full-Version-List, отправляются только после того, как сервер запросил их заголовком ответа Accept-CH. Значение Sec-CH-UA перечисляет токены брендов с основными версиями:

  • Chrome: "Chromium";v="142", "Google Chrome";v="142", "Not:A-Brand";v="99"
  • Edge: "Chromium";v="142", "Microsoft Edge";v="142", "Not:A-Brand";v="99"
  • Brave: "Chromium";v="142", "Brave";v="142", "Not:A-Brand";v="99"

API navigator.userAgentData

JavaScript-представление той же информации - navigator.userAgentData. Его свойство brands повторяет список Sec-CH-UA с низкой энтропией, а getHighEntropyValues() возвращает промис с подробными полями, например fullVersionList, platform и platformVersion. Что сообщает заголовок, то должен сообщать и этот API:

navigator.userAgentData.brands;
// Chrome: [{brand: "Chromium", version: "142"}, {brand: "Google Chrome", version: "142"}, ...]
// Edge:   [{brand: "Chromium", version: "142"}, {brand: "Microsoft Edge", version: "142"}, ...]

Поскольку значения с высокой энтропией возвращаются только по запросу, расхождение может оставаться незаметным, пока сайт их не запросит. Настройка, которая выглядит правильной при первой загрузке, позже может противоречить сама себе, поэтому проверки ниже охватывают и значения по умолчанию, и подробные. О том, как серверы используют эти заголовки как сигналы идентичности, читайте в статье Client Hints Fingerprinting: HTTP-заголовки и идентичность, где разобрано, что раскрывает каждая подсказка.

Порядок токенов, записи GREASE и график версий

Chromium добавляет в список брендов намеренно бессмысленную запись «GREASE», чтобы серверы не опирались на фиксированный формат списка. Ее текст и позиция меняются. По документации BotBrowser, массив брендов содержит корректные токены GREASE, поэтому список в Sec-CH-UA и список в navigator.userAgentData.brands должны совпадать между собой в том же порядке.

График версий - еще одна деталь, в которой легко ошибиться. Chrome, Edge и Opera выпускают версии по собственным графикам. У Chrome и Edge основная версия Chromium общая, но полные номера версий различаются: Chrome 142 может иметь версию 142.0.7444.60, а соответствующая сборка Edge - 142.0.3595.65. Значение OPR/ бренда Opera следует собственной нумерации Opera, а не нумерации Chromium. Для Chrome и Edge запись бренда, полная версия которой не относится к основной версии Chromium остальной идентичности, является расхождением, даже если все названия токенов верны.

Почему одной замены User-Agent недостаточно

Фреймворки автоматизации позволяют легко изменить строку. Playwright принимает параметр userAgent при создании контекста, а Puppeteer предлагает page.setUserAgent():

// Playwright
const context = await browser.newContext({
  userAgent: 'Mozilla/5.0 ... Edg/142.0.3595.65',
});
// Puppeteer
await page.setUserAgent('Mozilla/5.0 ... Edg/142.0.3595.65');

Замена только строки меняет заголовок и navigator.userAgent. Если метаданные Client Hints не заданы отдельно, остальные поверхности продолжают сообщать исходный бренд:

  • Sec-CH-UA по-прежнему перечисляет токены исходного бренда.
  • navigator.userAgentData.brands по-прежнему возвращает исходный список.
  • Sec-CH-UA-Full-Version-List по-прежнему содержит исходные номера версий.
  • Значения, возвращаемые getHighEntropyValues(), по-прежнему описывают исходный браузер.

В итоге идентичность в одном месте называет себя Edge, а в другом Chrome. Ручное задание метаданных закрывает часть разрыва, но перекладывает работу на вас: порядок токенов, запись GREASE, полные версии, а также каждую страницу, worker и запрос приходится согласовывать вручную, и список, написанный вручную, легко сделать неточным в мелочи. Подробнее о том, как заголовок, Client Hints и navigator.userAgentData должны согласовываться между собой, читайте в статье User-Agent и Client Hints: одна согласованная идентичность, где рассказано о задании и проверке пользовательской идентичности.

Переопределение, которое поддерживается вручную, еще и быстро стареет. Когда меняется основная версия Chromium, каждая жестко заданная строка и номер версии в скрипте устаревают, и следующее обновление может оставить User-Agent на одной версии, а Client Hints на другой. Один параметр бренда, который браузер применяет везде, избавляет от такого учета. Переход от полных строк User-Agent к Client Hints описан в материале Миграция от User-Agent Reduction к Client Hints.

Любой подход, который переписывает по одной поверхности, страдает той же проблемой. Правило заголовков в расширении, замена строки во фреймворке и скрипт, меняющий одно свойство, покрывают каждый только свою поверхность, и ничто не гарантирует, что поверхности по-прежнему согласуются. Надежное решение: выбрать бренд один раз, в самом начале, и сделать так, чтобы все поверхности выводились из этого выбора.

Задание бренда при запуске в BotBrowser

Параметр BotBrowser --bot-browser-brand (ENT Tier2; значение webview требует ENT Tier3) выбирает бренд при старте браузера. Согласно документации BotBrowser, его задание согласованно меняет строку User-Agent, список брендов navigator.userAgentData, заголовки Client Hints и связанные значения, а результат остается согласованным в основном потоке, в Workers и в заголовках HTTP-запросов.

ПоверхностьСледует выбранному бренду
Заголовок User-AgentДа
navigator.userAgentДа
Заголовок Sec-CH-UAДа
Sec-CH-UA-Full-Version-ListДа
navigator.userAgentData.brandsДа
getHighEntropyValues()Да
Запись GREASEДа

Поддерживаемые значения бренда

БрендЗначение параметраПримечания
ChromechromeИдентичность на основе Chromium по умолчанию
EdgeedgeMicrosoft Edge с токеном Edg/
BravebraveИдентичность браузера Brave
OperaoperaOpera с токеном OPR/
ChromiumchromiumОбычная идентичность Chromium без бренда производителя
WebViewwebviewAndroid WebView (ENT Tier3)

Согласование версии бренда с версией Chromium

При переходе на Edge или Opera полная версия производителя должна соответствовать версии Chromium в профиле. За это отвечают два параметра, и документация рекомендует, чтобы у обоих совпадала основная версия. Собственный номер OPR/ у Opera следует нумерации Opera:

  • --bot-brand-full-version задает полную версию, специфичную для бренда, например 142.0.3595.65 для Edge.
  • --bot-ua-full-version задает полную версию Chromium, например 142.0.7444.60.
chrome --bot-profile="path/to/profile.enc" \
       --bot-browser-brand=edge \
       --bot-ua-full-version=142.0.7444.60 \
       --bot-brand-full-version=142.0.3595.65

Примеры запуска для Edge, Brave и Opera

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

# Идентичность Edge, региональные параметры США
chrome --bot-profile="path/to/profile.enc" \
       --bot-browser-brand=edge \
       --bot-timezone=America/New_York \
       --bot-locale=en-US
# Идентичность Brave, региональные параметры Великобритании
chrome --bot-profile="path/to/profile.enc" \
       --bot-browser-brand=brave \
       --bot-timezone=Europe/London \
       --bot-locale=en-GB
# Идентичность Opera
chrome --bot-profile="path/to/profile.enc" \
       --bot-browser-brand=opera

Playwright и Puppeteer передают те же параметры через опцию args. Документация отмечает, что параметр бренда нужно указывать в args, а не в собственной опции фреймворка, и это частая причина того, что бренд не меняется:

const { chromium } = require('playwright-core');
const browser = await chromium.launch({
  executablePath: 'path/to/botbrowser/chrome',
  headless: false,
  args: ['--bot-profile=path/to/profile.enc', '--bot-browser-brand=edge', '--bot-brand-full-version=142.0.3595.65'],
});

Рабочий пример показывает, чего ожидать. Допустим, в профиле используется Chromium 142, а вам нужна идентичность Edge. Вы запускаете браузер с --bot-browser-brand=edge, --bot-ua-full-version=142.0.7444.60 и --bot-brand-full-version=142.0.3595.65. Тогда строка User-Agent заканчивается на Edg/142.0.3595.65, Sec-CH-UA перечисляет Microsoft Edge рядом с Chromium с основной версией 142, а fullVersionList показывает полные версии Chromium и Edge отдельными записями. Если любой из этих трех элементов не совпадает с остальными, один из параметров версии отсутствует или противоречит другим.

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

Идентичность Android WebView (ENT Tier3) требует большего, чем один бренд. Сочетайте бренд webview с шаблоном User-Agent и параметрами платформы Android из профиля Android. Подстановки вроде {platform-version} и {model} заполняются из соответствующих параметров, а BotBrowser формирует согласованные значения navigator.userAgentData и Client Hints:

chrome --bot-profile="path/to/android-profile.enc" \
       --bot-browser-brand=webview \
       --user-agent="Mozilla/5.0 (Linux; Android {platform-version}; {model} Build/TP1A.220624.021; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/{ua-full-version} Mobile Safari/537.36" \
       --bot-platform=Android \
       --bot-platform-version=13 \
       --bot-model=SM-G991B \
       --bot-mobile=true

Как держать несколько брендов раздельно

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

chrome --bot-profile="profiles/chrome-user.enc" \
       --bot-browser-brand=chrome \
       --user-data-dir="/tmp/chrome-session"
chrome --bot-profile="profiles/edge-user.enc" \
       --bot-browser-brand=edge \
       --user-data-dir="/tmp/edge-session"

Документация также описывает задание отдельного бренда для каждого контекста браузера при его создании (ENT Tier3). В обоих случаях бренд выбирается при создании экземпляра или контекста, поэтому для смены бренда нужно создать новый.

Проверка того, что везде виден один бренд

После запуска результат можно проверить в самом браузере, без дополнительных инструментов. Откройте инструменты разработчика на любой странице и пройдите по списку:

  1. Строка User-Agent содержит правильный токен производителя (Edg/ для Edge, OPR/ для Opera).
  2. Заголовок запроса Sec-CH-UA перечисляет ожидаемые токены брендов.
  3. navigator.userAgentData.brands совпадает с заголовком.
  4. fullVersionList показывает версию, специфичную для бренда, рядом с версией Chromium, и у Chrome и Edge у обеих одинаковая основная версия. Версия бренда Opera следует собственной нумерации Opera.
  5. Никакого другого названия бренда нет, кроме базового токена Chromium, который включают все бренды на основе Chromium.

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

navigator.userAgent;
navigator.userAgentData.brands;
await navigator.userAgentData.getHighEntropyValues(['fullVersionList', 'platform', 'platformVersion']);

Для заголовка откройте панель «Сеть», выберите HTTPS-запрос верхнего уровня и прочитайте заголовки запроса. Подробные заголовки, например Sec-CH-UA-Full-Version-List, появляются только после того, как сайт запросит их через Accept-CH, поэтому их отсутствие при первом запросе ожидаемо и не является расхождением. Если ваши страницы запускают worker, выполните те же строки в консоли в контексте worker и убедитесь, что он сообщает тот же бренд, что и страница.

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

Когда что-то выглядит неверно, симптом обычно указывает на причину:

СимптомВероятная причинаЧто исправить
Строка UA содержит Edg/, а список брендов называет только Google ChromeИзменена только строкаЗадать бренд при запуске, а не заменять строку
Версия Edge в fullVersionList похожа на версию ChromeВерсия, специфичная для бренда, не заданаДобавить --bot-brand-full-version
Для Edge основная версия Chromium различается в строке UA и в списке брендовУ двух параметров версии разная основная версияСогласовать --bot-ua-full-version и --bot-brand-full-version с профилем
Бренд никогда не меняетсяПараметр передан как опция фреймворкаПередать его внутри args
Бренд отличается от указанного в профилеПараметры командной строки имеют приоритет над профилемУбрать параметр или обновить профиль

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

Воспроизводимое наблюдение на основе открытого поведения Chromium

Эта небольшая проверка показывает границу без утверждения, что запускался BotBrowser. Страница записывает navigator.userAgent, список брендов низкой энтропии и fullVersionList; сервер записывает User-Agent и Sec-CH-UA, а затем запрашивает подробную подсказку через Accept-CH. В документированной модели Chromium первый запрос может содержать бренд низкой энтропии без Sec-CH-UA-Full-Version-List, а второй запрос может содержать подробный список. Замена только строки не обязана обновлять структурированные метаданные.

const observation = {
  ua: navigator.userAgent,
  brands: navigator.userAgentData?.brands ?? null,
  high: navigator.userAgentData ? await navigator.userAgentData.getHighEntropyValues(['fullVersionList']) : null,
};
console.table(observation);
Точка наблюденияОжидаемый результатДиагностическая ценность
Первый запросUser-Agent и Sec-CH-UA низкой энтропииНаходит замену UA до запроса подробных подсказок
Запрос после Accept-CHМожет появиться Sec-CH-UA-Full-Version-ListОтделяет отсутствие согласия от расхождения версий
Скрипт страницыbrands и fullVersionList совпадают с заголовкамиНаходит правило заголовка, которое не изменило JavaScript

Это наблюдение основано на API NavigatorUAData в MDN и спецификации Client Hints, а не на конкретном профиле BotBrowser. Его можно повторить в обычной сборке Chromium. Одна и та же марка и одна основная версия Chromium должны быть видны во всех трех строках.

Итог на практике

Относитесь к бренду как к части полной идентичности, а не как к отдельному переключателю:

  • Поддерживайте согласованность версий. Используйте --bot-brand-full-version, чтобы версия производителя относилась к основной версии Chromium в вашем профиле.
  • Начинайте с подходящего профиля. Профиль, снятый с настоящего браузера Edge, в сочетании с --bot-browser-brand=edge дает самый согласованный результат.
  • Согласуйте окружающие параметры. Бренд, часовой пояс, региональные параметры, язык и сетевой маршрут должны описывать один и тот же тип пользователя.
  • Сохраняйте один бренд на всё время жизни идентичности. Смена бренда между визитами на один сайт создает противоречивую историю.
  • Повторяйте проверку после обновления браузера или профиля.

Параметр нужен не всегда. Загруженный профиль уже содержит согласованный бренд, поэтому не задавать --bot-browser-brand - самый простой способ сохранить согласованность. Используйте параметр, когда есть причина показать другой бренд, например чтобы воспроизвести обращение, относящееся только к Edge, или чтобы дать второй идентичности собственный бренд, и затем подтвердите также параметры версий. Каждое дополнительное переопределение - еще одно значение, которое нужно держать согласованным с остальными, поэтому меняйте только то, что требует задача.

Несколько практических вопросов возникают часто:

  • Меняет ли переключение бренда возможности браузера? Нет. Оно обновляет значения идентичности, а не интерфейс браузера. Функции, свойственные брендам, например щиты Brave или боковая панель Edge, не эмулируются.
  • Можно ли использовать любой бренд с любым профилем? Для брендов, отличных от WebView, можно использовать любой совместимый профиль; параметр заменяет бренд в этом профиле, а параметры командной строки имеют наивысший приоритет. Для WebView по-прежнему нужны показанные выше параметры платформы Android, модели и мобильного режима.
  • Что происходит без параметра? Используется бренд, сохраненный в загруженном профиле, а если в профиле его нет, по умолчанию применяется Chrome.
  • Влияет ли бренд на расширения? Документация не описывает влияния на расширения, поэтому после смены бренда проверьте нужные вам расширения.
  • Можно ли сменить бренд во время работы браузера? Нет. Он задается при запуске или при создании контекста, поэтому для другого бренда нужен новый экземпляр.
  • Отличается ли WebView? Да. Ему также нужны параметры платформы, модели и мобильного режима, показанные выше.

С BotBrowser вы можете переключать бренд браузера при запуске с помощью --bot-browser-brand (chrome, edge, brave, opera, chromium или webview) и задавать версию, специфичную для бренда, через --bot-brand-full-version, так что User-Agent, бренды в navigator.userAgentData и заголовки Client Hints меняются вместе и не расходятся. BotBrowser не эмулирует интерфейс и функции, специфичные для бренда. Он не может сменить бренд уже работающего экземпляра или контекста, поскольку бренд задаётся при создании экземпляра или контекста, и не может гарантировать, как сайт отнесётся к полученной идентичности.

Для деталей User-Agent и Client Hints применяйте проверки из этой статьи и согласуйте географические параметры с выбранным брендом.

Источники

#бренд браузера#Chrome#Edge#Brave#Identity

Эта статья входит в руководство: Поверхности идентичности браузера: обзор согласованности

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

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