一个以 fingerprint-chromium 为主要使用场景的 Windows 启动器。
它主要解决这几件事:
- 把浏览器启动参数放到外部配置,而不是写死在快捷方式里
- 支持多个国家/地区 profile
- 启动前根据当前出口 IP 自动选择对应 profile
- 把它注册成 Windows 默认浏览器中转器
- 把系统传入的 URL 继续转发给真实浏览器
这个项目主要面向 fingerprint-chromium 用户。
也就是说,它默认假设你使用的是这类支持类似参数模型的 Chromium 变体,例如:
--fingerprint=...--user-data-dir=...--lang=...--accept-lang=...--timezone=...
如果你使用的是普通 Chrome / Chromium,也不是完全不能用,但你需要自己确认:
- 你的浏览器是否支持这些参数
- 这些参数是否真的会生效
- 某些指纹相关行为是否由浏览器分支本身实现
换句话说:
这是一个围绕 fingerprint-chromium 使用方式设计的启动器,不是给普通 Chrome 做的通用包装壳。
典型场景:
- 指纹浏览器 / 反检测浏览器工作流
- 多国家/地区浏览环境
- 代理出口国家变化时,自动匹配浏览器语言与时区
- 希望 Windows 点链接时,默认走这套浏览器环境
git clone https://github.com/JunDaTang/FingerprintBrowserLauncher.git
cd FingerprintBrowserLauncher可以去微软官网安装,也可以直接用:
winget install Microsoft.DotNet.SDK.8运行初始化脚本,自动配置 NuGet 源和检查环境:
.\setup.ps1这一步会自动处理 NuGet 源配置问题,避免后续发布时出现 NU1100 错误。
Copy-Item .\config.example.json .\config.json至少必须改这两类路径:
browserPath- 你实际会用到的每个
--user-data-dir=...
例如:
"browserPath": "C:\\Browsers\\fingerprint-chromium\\chrome.exe"以及:
"--user-data-dir=C:\\Browsers\\profiles\\profile-uk-1001"如果你不改这些路径,项目在你的机器上大概率无法直接运行。
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true
.\Install.ps1.\dist\FingerprintBrowserLauncher.exe https://example.comWindows 链接 / 手动启动
│
▼
FingerprintBrowserLauncher.exe
│
├─ 读取 config.json
│
├─ 是否手动传了 --profile ?
│ │
│ ├─ 是 → 直接使用指定 profile
│ │
│ └─ 否 → 查询当前出口 IP
│ │
│ ├─ 查询成功 → countryProfileMap 映射 profile
│ └─ 查询失败 → 回退到 defaultProfile
│
▼
拼接启动参数(fingerprint / lang / timezone / user-data-dir ...)
│
▼
启动 fingerprint-chromium
│
▼
打开目标 URL
如果你后面想让 README 更直观,建议补这几类截图:
-
项目目录截图
- 展示
config.example.json - 展示
Install.ps1 - 展示构建输出目录
- 展示
-
Install.ps1 运行截图
- 展示自动生成注册表
- 展示占位路径提醒
- 展示交互式确认
-
Windows 默认应用截图
- 展示把
HTTP / HTTPS指向这个启动器
- 展示把
-
BrowserScan 对比截图
- 展示不同出口 IP 下自动切 profile 的效果
建议放在:
assets/
screenshots/
如果后面你真要补图,README 可以再插入 markdown 图片链接。
如果你已经编译好了,可以直接用安装脚本准备一个可运行目录,并自动生成适合你本机路径的注册表文件:
.\Install.ps1它会帮你:
- 创建
dist\ - 把编译好的 exe 复制到
dist\ - 把
config.json复制到dist\(如果目标目录里还没有) - 自动生成本机路径版的注册表文件
- 检查
browserPath和--user-data-dir是否还是占位路径
如果你想更顺手一点,可以使用交互模式:
.\Install.ps1 -Interactive交互模式下会:
- 询问安装目录
- 发现占位路径时提示你立即打开
config.json - 询问你是否马上导入注册表
如果你还想让它顺手导入注册表:
.\Install.ps1 -ImportRegistry如果你想安装到固定目录,比如:
.\Install.ps1 -TargetDir "C:\\Tools\\FingerprintBrowserLauncher" -ImportRegistry对于不想手改注册表的用户,这个方式更推荐。
在你预期这个项目能正常工作前,先确认下面几件事:
- 已安装
.NET 8 SDK config.json已存在browserPath指向真实存在的浏览器 exe- 选中的
--user-data-dir路径在你的机器上可用 - 你的目标浏览器本身支持这些参数
如果这些基础项没配对,启动器可能能启动,但结果不会符合你的预期。
启动流程大致是:
- 读取
config.json - 如果命令行手动传了
--profile <name>,优先用它 - 否则,如果开启了
autoDetectByIp,就先查询当前出口 IP 信息 - 用
countryProfileMap把国家代码映射成 profile 名称 - 如果检测失败,就回退到
defaultProfile - 启动真实浏览器,并附上对应 profile 的参数和传入 URL
例如:
- 当前出口国家是
GB-> 选择uk - 当前出口国家是
HK-> 选择hk - 当前出口国家是
IN-> 选择in - 查询超时 / 接口失败 -> 回退到
defaultProfile
FingerprintBrowserLauncher/
.github/workflows/build.yml
FingerprintBrowserLauncher.csproj
Program.cs
config.example.json
config.json
Install.ps1
README.md
其中:
bin/obj/dist/
都属于本地构建或发布产物,不建议直接提交到 git。
示例配置:
{
"browserPath": "C:\\path\\to\\fingerprint-chromium\\chrome.exe",
"defaultProfile": "uk",
"appendUrlAtEnd": true,
"autoDetectByIp": true,
"ipInfoUrl": "https://ipapi.co/json/",
"ipLookupTimeoutSeconds": 5,
"countryProfileMap": {
"GB": "uk",
"US": "us",
"HK": "hk",
"IN": "in"
},
"profiles": {
"uk": {
"args": [
"--fingerprint=1001",
"--user-data-dir=C:\\path\\to\\profiles\\profile-uk-1001",
"--lang=en-GB",
"--accept-lang=en-GB,en",
"--timezone=Europe/London"
]
}
}
}browserPath:真实浏览器 exe 路径defaultProfile:自动识别失败时使用的回退 profileappendUrlAtEnd:是否把传入 URL 追加到参数最后autoDetectByIp:是否根据出口 IP 自动选 profileipInfoUrl:IP 信息查询接口ipLookupTimeoutSeconds:IP 查询超时时间(秒)countryProfileMap:国家代码 -> profile 名称映射profiles:实际的浏览器参数集合
每个 profile 本质上就是一组原样传给浏览器的参数,例如:
--fingerprint=1001--user-data-dir=...--lang=...--accept-lang=...--timezone=...
建议:每个国家/地区用独立的 user-data-dir。
如果多个 profile 共用一个目录,很容易残留旧的语言、地区或浏览状态。
这个项目本身不是浏览器内核,也不负责实现指纹伪装逻辑。
它做的是:
- 组织配置
- 选择 profile
- 启动浏览器
- 转发 URL
- 帮你接入 Windows 默认浏览器链路
而真正的指纹相关能力是否生效,仍然取决于你使用的浏览器本体。
如果你正在使用:
那么本项目就是围绕这类用法设计的辅助启动器。
如果你不想自动识别,也可以手动强制指定某个 profile:
FingerprintBrowserLauncher.exe --profile hk https://browserscan.net/适合这些场景:
- 你想做可重复测试
- 当前 IP 查询接口不稳定
- 你就是想固定某一个 profile,不想跟出口 IP 联动
当 autoDetectByIp 开启时,程序会先查询 IP 信息,然后在控制台输出类似:
[Launcher] Manual profile: <none>
[Launcher] Detected IP: 50.7.250.106
[Launcher] Detected country: HK
[Launcher] Detected timezone: Asia/Hong_Kong
[Launcher] Selected profile: hk
如果请求超时或失败,就会自动回退到 defaultProfile。
如果你的网络比较慢,或者经过 Clash / 代理链路,建议适当调大:
"ipLookupTimeoutSeconds": 5必要时可以更高。
这个项目现在不再维护静态 .reg 示例文件。
推荐方式是直接使用:
Install.ps1
它会根据你本机实际安装目录,自动生成注册表文件并可选导入。
例如:
.\Install.ps1 -ImportRegistry或者安装到固定目录:
.\Install.ps1 -TargetDir "C:\\Tools\\FingerprintBrowserLauncher" -ImportRegistry执行完成后,再去 Windows 默认应用里,把下面这些关联给它:
HTTPHTTPS.htm.html
程序会默认从 exe 同目录 读取 config.json。
所以如果你移动了 exe,也要把下面这个文件一起带走:
config.json
如果你更换了安装目录,建议重新运行一次 Install.ps1,让它重新生成对应路径的注册表。
FingerprintBrowserLauncher.exe https://example.comFingerprintBrowserLauncher.exe https://browserscan.net/在 BrowserScan 上建议重点关注:
- Timezone
- Languages
- Accept-Language
- Intl API
- WebRTC
- DNS Leak
- WebGL / GPU 暴露
说明程序没有在 exe 同目录找到 config.json。
发布自包含版本时出现此错误,说明 NuGet 源未配置。解决方法:
dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org
dotnet nuget locals all --clear然后重新运行发布命令。你也可以在项目初期运行 .\setup.ps1 来避免此问题。
通常是 IP 查询超时,调大 ipLookupTimeoutSeconds。
通常是 user-data-dir 残留了旧状态。建议每个 profile 使用独立且尽量干净的目录。
这通常不是启动器本身的问题,而是 Clash / 代理 / 网络层配置问题。
确认你已经导入了由 Install.ps1 生成的注册表,然后重新打开默认应用页面再看。
如果你第一次接触这个项目,建议先别一上来就搞多国家自动切换。
更稳的顺序是:
- 先关闭复杂功能
- 先固定一个 profile
- 先确认浏览器能正常启动
- 再开启按 IP 自动选 profile
- 最后再接入默认浏览器
一个更容易排错的最小配置是:
"autoDetectByIp": false,
"defaultProfile": "uk"先把单 profile 跑通,再逐步加复杂度,会舒服很多。
仓库已配置 GitHub Actions 自动构建 Windows x64 单文件版本。
每次 push 到 main 或创建 PR 时,都会自动执行构建。
如果你只是想先试用项目,也可以直接去 GitHub Actions / Artifacts 查看构建产物。
MIT