浏览器品牌切换:Chrome、Edge、Brave、Opera
如何在 Chrome、Edge、Brave 和 Opera 浏览器身份之间切换,确保 UA、Client Hints 和 navigator API 的完整信号一致性。
简介
每个基于 Chromium 的浏览器都有由品牌标记、User-Agent 字符串、Client Hints 头部和 navigator API 值定义的独特身份。Chrome、Edge、Brave 和 Opera 尽管共享 Chromium 引擎,但各自呈现不同的品牌信息、版本编号和功能表面。当你的浏览器声称是 Edge 但在 Sec-CH-UA 中报告 Chrome 特定的品牌标记时,这种不一致是显而易见的。
BotBrowser 在浏览器引擎级别处理品牌切换。当你使用 --bot-config-browser-brand 选择品牌时,所有相关信号会一致更新:User-Agent 字符串、所有 Client Hints 头部、navigator.userAgentData、品牌标记顺序和版本元数据都反映所选品牌。本文解释品牌切换控制什么、如何配置它,以及为什么所有品牌信号的一致性很重要。
隐私影响
浏览器品牌是浏览器身份的重要组成部分。追踪系统使用品牌信息来:
- 按浏览器分段用户:不同品牌有不同的用户群、人口统计和使用模式
- 验证指纹一致性:声称 Chrome 品牌标记但具有 Edge 特定 navigator 属性的指纹是可疑的
- 追踪品牌特定行为:每个品牌都有独特的默认设置、功能标志和扩展行为,这些都影响指纹
当品牌信号不一致时,不匹配本身就成为追踪信号。报告 Sec-CH-UA: "Microsoft Edge" 但 navigator.userAgent 包含 "Chrome" 而没有 Edge 特定标记的浏览器显然是配置错误的。这种不一致比任何单独的品牌更具特征性。
BotBrowser 确保当你选择品牌时,与该品牌关联的每个信号都正确对齐。没有部分更新或遗漏的属性。
技术背景
什么定义浏览器品牌
浏览器的品牌身份通过多个信号表达:
User-Agent 字符串:传统的 User-Agent 头部和 navigator.userAgent 属性。每个品牌有不同的格式:
- 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/108.0.0.0
Client Hints (Sec-CH-UA):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"
navigator.userAgentData:提供结构化品牌信息的 JavaScript API:
navigator.userAgentData.brands
// Chrome: [{brand: "Chromium", version: "142"}, {brand: "Google Chrome", version: "142"}, ...]
// Edge: [{brand: "Chromium", version: "142"}, {brand: "Microsoft Edge", version: "142"}, ...]
GREASE 标记:Chromium 向 Client Hints 添加随机化的 "GREASE" 标记,以防止服务器依赖特定的标记格式。GREASE 标记的格式和位置因品牌而异。
版本节奏:Chrome、Edge 和 Opera 按不同的时间表发布。Chrome 142 可能对应 Edge 142,但补丁版本不同。Opera 有自己的主版本编号。这些版本关系必须正确才能使品牌可信。
品牌标记顺序
Sec-CH-UA 和 navigator.userAgentData.brands 中品牌标记的顺序很重要。每个品牌有特定的、一致的顺序。随机化顺序或使用错误的顺序是不匹配信号。
BotBrowser 为每个支持的品牌维护正确的品牌标记顺序,包括正确的 GREASE 标记位置。
常见方法及其局限性
User-Agent 字符串覆盖
Playwright 和 Puppeteer 等框架提供 User-Agent 覆盖选项:
// 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');
这些只改变 User-Agent 头部和 navigator.userAgent。它们不更新:
Sec-CH-UA头部(仍报告 Chrome 品牌标记)navigator.userAgentData.brands(仍返回 Chrome 品牌)Sec-CH-UA-Full-Version-List(仍显示 Chrome 版本)- 高熵 Client Hints 值
结果是 UA 字符串和 Client Hints 之间的明显不匹配。
通过 CDP 进行 Client Hints 覆盖
CDP 提供 Network.setUserAgentOverride,可以设置一些 Client Hints 值。但是:
- 它需要
Network.enable,这可能影响指纹行为 - 不是所有 Client Hints 值都被覆盖
- 覆盖必须在每个页面和每个 worker 上维护
- 品牌标记顺序和 GREASE 标记生成不是自动的
基于扩展的品牌伪装
修改 User-Agent 头部的扩展面临与框架级覆盖相同的限制。它们无法修改 navigator.userAgentData.getHighEntropyValues() 返回的值,因为该 API 是在原生代码中实现的,不在扩展可访问的 JavaScript 层。
BotBrowser 的方案
--bot-config-browser-brand 标志
BotBrowser 的 --bot-config-browser-brand 标志(ENT Tier2)在引擎级别更改浏览器的品牌身份:
# Launch as Microsoft Edge
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=edge
# Launch as Brave
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=brave
# Launch as Opera
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=opera
当你设置品牌时,BotBrowser 更新所有相关信号:
| 信号 | 已更新 |
|---|---|
User-Agent 头部 | 是 |
navigator.userAgent | 是 |
Sec-CH-UA 头部 | 是 |
Sec-CH-UA-Full-Version-List | 是 |
navigator.userAgentData.brands | 是 |
getHighEntropyValues() | 是 |
| 品牌标记顺序 | 是 |
| GREASE 标记格式 | 是 |
支持的品牌
| 品牌 | 标志值 | 备注 |
|---|---|---|
| Chrome | chrome | 默认基于 Chromium 的身份 |
| Edge | edge | 带有正确 Edg/ 标记的 Microsoft Edge |
| Brave | brave | Brave 浏览器身份 |
| Opera | opera | 带有 OPR/ 标记的 Opera |
| Chromium | chromium | 通用 Chromium 身份 |
| WebView | webview | Android WebView(ENT Tier3) |
版本对齐
每个品牌都有自己的版本节奏。切换到 Edge 时,Edge 特定版本必须与 Chromium 版本对齐。BotBrowser 自动处理此问题,但你可以通过以下方式覆盖:
--bot-config-brand-full-version:设置品牌特定的完整版本(例如 Edge 的142.0.3595.65)--bot-config-ua-full-version:设置 Chromium 完整版本(例如142.0.7444.60)
这些标志确保当供应商的节奏与 Chromium 不同时,UA-CH 元数据保持内部一致。
WebView 身份(ENT Tier3)
对于 Android WebView 模拟,将品牌切换与自定义 User-Agent 和平台设置结合:
chrome --bot-profile="/path/to/android-profile.enc" \
--bot-config-browser-brand=webview \
--user-agent="Mozilla/5.0 (Linux; Android {platform-version}; {model}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/{ua-full-version} Mobile Safari/537.36" \
--bot-config-platform=Android \
--bot-config-platform-version=13 \
--bot-config-model=SM-G991B \
--bot-config-mobile=true
像 {platform-version} 和 {model} 这样的占位符在运行时从相应的标志替换。BotBrowser 自动生成匹配的 navigator.userAgentData 和 Client Hints 头部。
配置与使用
基本品牌切换(CLI)
# Edge identity with US proxy
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=edge \
--proxy-server=socks5://user:pass@proxy:1080 \
--bot-config-timezone=America/New_York \
--bot-config-locale=en-US
# Brave identity with UK proxy
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=brave \
--proxy-server=socks5://user:pass@uk-proxy:1080 \
--bot-config-timezone=Europe/London \
--bot-config-locale=en-GB
Playwright 集成
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-config-browser-brand=edge',
'--bot-config-timezone=America/New_York',
'--bot-config-locale=en-US',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
const brands = await page.evaluate(() =>
navigator.userAgentData.brands.map(b => `${b.brand} v${b.version}`)
);
console.log('Brands:', brands);
const ua = await page.evaluate(() => navigator.userAgent);
console.log('UA:', ua);
await browser.close();
})();
Puppeteer 集成
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-config-browser-brand=edge',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://example.com');
const highEntropy = await page.evaluate(async () => {
return await navigator.userAgentData.getHighEntropyValues([
'fullVersionList', 'platform', 'platformVersion'
]);
});
console.log('High-entropy:', highEntropy);
await browser.close();
})();
多品牌设置
为不同身份运行不同品牌:
# Chrome identity
chrome --bot-profile="/profiles/chrome-user.enc" \
--bot-config-browser-brand=chrome \
--proxy-server=socks5://proxy-a:1080 \
--user-data-dir="/tmp/chrome-session"
# Edge identity
chrome --bot-profile="/profiles/edge-user.enc" \
--bot-config-browser-brand=edge \
--proxy-server=socks5://proxy-b:1080 \
--user-data-dir="/tmp/edge-session"
# Brave identity
chrome --bot-profile="/profiles/brave-user.enc" \
--bot-config-browser-brand=brave \
--proxy-server=socks5://proxy-c:1080 \
--user-data-dir="/tmp/brave-session"
验证
使用品牌覆盖启动后,验证以下信号:
const page = await context.newPage();
await page.goto('https://example.com');
// Check User-Agent string
const ua = await page.evaluate(() => navigator.userAgent);
console.log('User-Agent:', ua);
// Check Client Hints brands
const brands = await page.evaluate(() =>
navigator.userAgentData.brands.map(b => ({ brand: b.brand, version: b.version }))
);
console.log('Brands:', JSON.stringify(brands));
// Check high-entropy values
const highEntropy = await page.evaluate(async () => {
return await navigator.userAgentData.getHighEntropyValues([
'fullVersionList', 'platform', 'platformVersion',
'architecture', 'bitness', 'model'
]);
});
console.log('High-entropy:', JSON.stringify(highEntropy));
确认:
- User-Agent 字符串包含正确的品牌标识符(Edge 为 Edg/,Opera 为 OPR/)
Sec-CH-UA以正确的顺序列出正确的品牌标记navigator.userAgentData.brands与 HTTP 级别的 Client Hints 匹配- 高熵值如
fullVersionList显示正确的品牌特定版本 - 使用非 Chrome 品牌时不出现 Chrome 特定标记(除非该品牌包含 Chromium 作为基础标记)
最佳实践
-
保持版本对齐。 切换到 Edge 时,使用
--bot-config-brand-full-version设置与配置文件中 Chromium 主版本对应的正确 Edge 版本。 -
品牌与地区使用模式匹配。 Edge 在企业环境中更常见。Brave 有特定的用户群体。选择与你呈现的身份一致的品牌。
-
品牌与匹配的代理和区域设置结合。 一个完整的身份包括品牌、网络和地理组件。
-
使用为目标品牌设计的配置文件。 某些配置文件功能可能因品牌而异。将从真实 Edge 浏览器捕获的配置文件与
--bot-config-browser-brand=edge一起使用可产生最一致的结果。 -
使用指纹验证工具测试品牌标记。 配置后验证所有品牌信号是否对齐。
常见问题
品牌切换是否改变浏览器的功能表面? 品牌切换更新所有身份信号(UA、Client Hints、navigator 属性)。品牌之间的功能级别差异(如 Brave 的 Shield 或 Edge 的侧边栏)不在 UI 级别模拟,但报告的身份是一致的。
我可以用任何品牌配合任何配置文件吗?
可以。--bot-config-browser-brand 标志覆盖品牌身份,无论配置文件的基本配置如何。CLI 标志具有最高优先级。
如果我不设置 --bot-config-browser-brand 会怎样? 浏览器使用加载的配置文件中指定的品牌。如果配置文件未指定品牌,Chrome 是默认值。
品牌切换是否影响扩展行为? 品牌切换更改身份信号,而不是扩展运行时。安装在浏览器中的扩展无论配置的品牌如何都以相同方式运行。
我可以在运行时切换品牌而不重启吗?
不可以。--bot-config-browser-brand 标志在启动时设置。要更改品牌,请使用所需的品牌启动新的浏览器实例。
GREASE 标记随机化怎么处理? BotBrowser 为每个品牌生成适当的 GREASE 标记。GREASE 格式和位置遵循在每个浏览器品牌真实实例中观察到的模式。
WebView 品牌切换与其他品牌不同吗? 是的。WebView 身份(ENT Tier3)通常需要额外的平台、型号和移动设置标志来产生完整的 Android WebView 指纹。详见上面的 WebView 部分。
总结
浏览器品牌身份涵盖 User-Agent 字符串、Client Hints 头部、navigator API、品牌标记顺序和版本元数据。BotBrowser 的 --bot-config-browser-brand 标志在引擎级别一致更新所有这些信号,确保完整且可信的品牌身份。
有关 User-Agent 和 Client Hints 详情,请参阅 User Agent 控制和 Client Hints。有关品牌身份与地理设置的结合,请参阅 时区、区域设置和语言配置。有关不同品牌的多身份设置,请参阅 多账户浏览器隔离。