轻量级多账号指纹浏览器系统特色封面

从零搭建基于 Chrome 的轻量级多账号指纹浏览器系统

传统的商业指纹浏览器普遍按月收费且存在数据隐私隐患。通过 “Mihomo/v2rayN 本地多端口 SOCKS5 代理 + Chrome 原生底层指纹伪装 + HTA 可视化调度” 的纯本地架构,可以用零成本实现一套极简、高效且安全的自研指纹浏览器系统。

一、系统核心优势与指纹隔离原理

相比简单的浏览器多开,本方案在底层实现了商业级指纹浏览器的核心隔离特性:

  • 网络指纹隔离:每个账号绑定专属的本地 SOCKS5 端口,出口 IP 互不关联,彻底避免 IP 连带封号。
  • 时区与地理伪装 (--timezone):根据代理节点所在国家,从 Chrome 引擎层面强制重写 Intl.DateTimeFormat 时区,避免“IP 在美国,时区显示 UTC+8”的常见指纹漏洞。
  • 语言与 Header 伪装 (--lang):重写 Accept-Language 请求头与 navigator 语言属性,使语言环境与节点地理位置完全匹配。
  • 存储与 Cookie 隔离 (--user-data-dir):为每个账号创建物理级独立的存储目录,Cookie、IndexedDB、LocalStorage、插件完全隔离。
  • 反自动化特征注入 (--disable-blink-features=AutomationControlled):移除 Chromium 默认暴露的 navigator.webdriver 标记,规避风控系统拦截。

二、网络层:建立 Mihomo / v2rayN 多端口 SOCKS5 服务

代理转发是整个系统的基石。我们需要将不同的代理节点,映射为本地独立的 SOCKS5 监听端口(127.0.0.1:42001 ~ 42023)。

方案 A:使用 Mihomo (Clash.Meta) 协议自动化转换(推荐)

通过 convert.py 脚本,将订阅/节点文件 (nodes.txt) 解析并自动生成兼容 Mihomo 协议的 clash_config.yaml。脚本会自动为每一个节点分配一个独立的 SOCKS5 入站端口(Inbound),并开启 UDP 支持。

1. 解析与 YAML 生成脚本 (convert.py)

Python

import yaml

# 基础配置文件模板(兼容 Mihomo / Clash.Meta 规范)
BASE_CONFIG = {
    "port": 7890,
    "socks-port": 7891,
    "allow-lan": False,
    "mode": "rule",
    "log-level": "info",
    "external-controller": "127.0.0.1:9090",
    "inbounds": [],
    "proxies": [],
    "proxy-groups": [
        {
            "name": "PROXY",
            "type": "select",
            "proxies": []
        }
    ],
    "rules": [
        "GEOIP,LAN,DIRECT",
        "FINAL,PROXY"
    ]
}

def generate_clash_config():
    config = BASE_CONFIG.copy()
    
    try:
        with open("nodes.txt", "r", encoding="utf-8") as f:
            raw_proxies = yaml.safe_load(f)
            if isinstance(raw_proxies, list):
                config["proxies"] = raw_proxies
    except Exception as e:
        print(f"[!] 读取 nodes.txt 异常,请检查格式: {e}")
        return

    inbounds = []
    proxy_names = []

    # 循环遍历所有节点,动态生成多 SOCKS5 入站端口 (42001, 42002...)
    start_port = 42001
    for i, p in enumerate(config["proxies"]):
        p_name = p.get("name", f"Node_{i+1:02d}")
        proxy_names.append(p_name)
        listen_port = start_port + i

        # 构建 Mihomo 标准 SOCKS5 入站规则
        inbound_rule = {
            "name": f"inbound_{listen_port}",
            "type": "socks",
            "port": listen_port,
            "listen": "127.0.0.1",
            "proxy": p_name,       # 将该端口流量绑定至对应出口节点
            "udp": True            # 开启 UDP 转发支持
        }
        inbounds.append(inbound_rule)
        print(f"[+] 映射 SOCKS5 端口: {listen_port} -> 目标节点: {p_name}")

    config["inbounds"] = inbounds
    config["proxy-groups"][0]["proxies"] = proxy_names

    # 写入生成的配置文件
    with open("clash_config.yaml", "w", encoding="utf-8") as f:
        yaml.dump(config, f, allow_unicode=True, sort_keys=False)
    
    print("\n[✓] 成功生成兼容 Mihomo 的 clash_config.yaml!多端口 SOCKS5 映射完成。")

if __name__ == "__main__":
    generate_clash_config()

2. 内核启动批处理 (run_convert.bat)

脚本会优先拉起 mihomo.exe,若不存在则回退调用 clash.exe:

DOS

@echo off
chcp 65001 >nul
title Mihomo 多端口 SOCKS5 内核启动器

echo ===================================================
echo   正在运行 convert.py 提取节点并分配 SOCKS5 监听端口...
echo ===================================================

python convert.py

if %errorlevel% neq 0 (
    echo [错误] Python 脚本执行失败,请检查环境或 nodes.txt 格式!
    pause
    exit /b
)

echo.
echo ===================================================
echo   配置生成完毕,正在启动 Mihomo 后台代理服务...
echo ===================================================

if exist "mihomo.exe" (
    start "Mihomo-Core" mihomo.exe -f clash_config.yaml
    echo [✓] Mihomo 内核已成功拉起,本地多端口 SOCKS5 服务就绪!
) else if exist "clash.exe" (
    start "Clash-Core" clash.exe -f clash_config.yaml
    echo [✓] Clash 内核已成功拉起!
) else (
    echo [!] 未找到 mihomo.exe 或 clash.exe,请将核心文件放置于当前目录。
)

timeout /t 3 >nul

方案 B:使用 v2rayN 图形客户端建立 SOCKS5 监听

如果你习惯使用 v2rayN,也可以通过界面配置实现相同的多端口 SOCKS5 监听:

  1. 设置多入站 (Inbound) 端口:在 v2rayN 设置中,添加多个本地监听端口(如 42001、42002…),并将协议设置为 SOCKS。
  2. 路由规则绑定:通过 v2rayN 的自定义路由规则,将来自 42001 端口的流量绑定到“美国节点”,42002 绑定到“日本节点”等。
  3. 启用局域网连接:确保勾选 “允许来自局域网的连接”,保证本地回环 127.0.0.1 可以顺畅通信。

三、通用批量调度引擎 (launcher.bat)

通过统一的入口脚本,接收前端传入的账号 ID(如 01、02),动态匹配对应的 SOCKS5 代理端口、专属地理时区与语言环境:

DOS

@echo off
chcp 65001 >nul
title Chrome 多 Profile 调度后台

set "ACT_ID=%~1"

:: 针对不同账号,精准配置不同的 SOCKS5 端口、语言和时区
if "%ACT_ID%"=="01" start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D:\ChromeProfiles\Account_01" --proxy-server="socks5://127.0.0.1:42001" --lang="en-US" --timezone="America/New_York" --disable-blink-features=AutomationControlled
if "%ACT_ID%"=="02" start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D:\ChromeProfiles\Account_02" --proxy-server="socks5://127.0.0.1:42002" --lang="en-US" --timezone="America/Los_Angeles" --disable-blink-features=AutomationControlled
if "%ACT_ID%"=="04" start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D:\ChromeProfiles\Account_04" --proxy-server="socks5://127.0.0.1:42004" --lang="de-DE" --timezone="Europe/Berlin" --disable-blink-features=AutomationControlled
if "%ACT_ID%"=="05" start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D:\ChromeProfiles\Account_05" --proxy-server="socks5://127.0.0.1:42005" --lang="zh-HK" --timezone="Asia/Hong_Kong" --disable-blink-features=AutomationControlled
if "%ACT_ID%"=="14" start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D:\ChromeProfiles\Account_14" --proxy-server="socks5://127.0.0.1:42014" --lang="ja-JP" --timezone="Asia/Tokyo" --disable-blink-features=AutomationControlled

exit

四、前端可视化控制台 (Console.hta)

无需安装复杂的网页框架,直接使用 Windows 原生支持的 HTA (HTML Application) 编写前端控制台。控制台卡片直观展示了每个环境的专属端口、地理时区与语言,并支持实时搜索筛选与一键拉起。

HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=11">
    <title>Chrome Profile 多环境控制台</title>
    <hta:application 
        id="ChromeConsole" 
        applicationname="ChromeConsole" 
        border="thin" 
        caption="yes" 
        icon="C:\Program Files\Google\Chrome\Application\chrome.exe"
        showintaskbar="yes" 
        singleinstance="yes"
        windowstate="normal"
    />
    <style>
        * { box-sizing: border-box; }
        body { font-family: "Microsoft YaHei", -apple-system, BlinkMacSystemFont, Roboto, sans-serif; background: #1e1e2e; color: #cdd6f4; margin: 0; padding: 25px; }
        
        .header { text-align: center; margin-bottom: 25px; }
        h1 { color: #89b4fa; margin: 0 0 15px 0; font-size: 28px; font-weight: bold; }
        
        .search-box {
            width: 380px;
            padding: 10px 16px;
            font-size: 15px;
            border-radius: 20px;
            border: 2px solid #45475a;
            background: #181825;
            color: #cdd6f4;
            outline: none;
            text-align: center;
        }
        .search-box:focus { border-color: #89b4fa; }

        .grid { max-width: 1700px; margin: 0 auto; text-align: left; }
        .card { 
            display: inline-block; 
            *display: inline; zoom: 1;
            width: 23%; 
            margin: 0 1% 20px 1%; 
            vertical-align: top;
            background: #313244; 
            border-radius: 10px; 
            padding: 18px; 
            border: 1px solid #45475a;
        }
        
        @media screen and (max-width: 1300px) { .card { width: 31%; } }
        @media screen and (max-width: 900px) { .card { width: 48%; } }

        .title { font-weight: bold; font-size: 18px; color: #f38ba8; margin-bottom: 10px; }
        .info { font-size: 14px; color: #a6adc8; line-height: 1.7; margin-bottom: 16px; }
        .tag { display: inline-block; padding: 2px 8px; background: #45475a; color: #89b4fa; border-radius: 4px; font-size: 12px; margin-top: 4px; }
        
        .btn { 
            display: block; width: 100%; background: #89b4fa; color: #11111b; 
            border: none; padding: 10px 0; border-radius: 6px; font-weight: bold; 
            font-size: 15px; cursor: pointer; text-align: center; margin-top: 10px;
        }
        .btn:hover { background: #b4befe; }
        .btn-launched { background: #a6e3a1 !important; color: #11111b !important; }
    </style>
</head>
<body>

    <div class="header">
        <h1>Chrome 多账号指纹环境控制台</h1>
        <input type="text" id="searchInput" class="search-box" placeholder="🔍 快速搜索账号 / SOCKS5端口 / 国家 / 时区..." onkeyup="filterProfiles()">
    </div>

    <div class="grid" id="container"></div>

    <script>
        // 配置各账号环境的特征参数:包含独立端口、匹配时区与语言
        var profiles = [
            { id: "01", name: "账号1-US (美东)", port: "42001", tz: "America/New_York", lang: "en-US" },
            { id: "02", name: "账号2-US (美西)", port: "42002", tz: "America/Los_Angeles", lang: "en-US" },
            { id: "04", name: "账号4-DE (德国)", port: "42004", tz: "Europe/Berlin", lang: "de-DE" },
            { id: "05", name: "账号5-HK (香港)", port: "42005", tz: "Asia/Hong_Kong", lang: "zh-HK" },
            { id: "06", name: "账号6-SG (新加坡)", port: "42006", tz: "Asia/Singapore", lang: "en-SG" },
            { id: "07", name: "账号7-TW (台湾)", port: "42007", tz: "Asia/Taipei", lang: "zh-TW" },
            { id: "10", name: "账号10-SE (瑞典)", port: "42010", tz: "Europe/Stockholm", lang: "sv-SE" },
            { id: "12", name: "账号12-GB (英国)", port: "42012", tz: "Europe/London", lang: "en-GB" },
            { id: "14", name: "账号14-JP (日本)", port: "42014", tz: "Asia/Tokyo", lang: "ja-JP" },
            { id: "15", name: "账号15-KR (韩国)", port: "42015", tz: "Asia/Seoul", lang: "ko-KR" },
            { id: "22", name: "账号22-CA (加拿大)", port: "42022", tz: "America/Toronto", lang: "en-CA" }
        ];

        function renderProfiles() {
            var container = document.getElementById('container');
            container.innerHTML = '';
            for (var i = 0; i < profiles.length; i++) {
                var p = profiles[i];
                var card = document.createElement('div');
                card.className = 'card profile-card';
                card.setAttribute('data-search', (p.id + p.name + p.port + p.tz + p.lang).toLowerCase());
                card.innerHTML = 
                    '<div>' +
                        '<div class="title">[' + p.id + '] ' + p.name + '</div>' +
                        '<div class="info">' +
                            'SOCKS5 端口: <b>' + p.port + '</b><br>' +
                            '地理时区: ' + p.tz + '<br>' +
                            '系统语言: ' + p.lang + '<br>' +
                            '<span class="tag">数据隔离: Account_' + p.id + '</span>' +
                        '</div>' +
                    '</div>' +
                    '<button class="btn" id="btn-' + p.id + '" onclick="launchProfile(\'' + p.id + '\')">启动隔离环境</button>';
                container.appendChild(card);
            }
        }

        function launchProfile(id) {
            try {
                var shell = new ActiveXObject("WScript.Shell");
                shell.Run("D:\\ChromeProfiles\\launcher.bat " + id, 0, false);
                
                var btn = document.getElementById('btn-' + id);
                var oldText = btn.innerHTML;
                btn.className = 'btn btn-launched';
                btn.innerHTML = '✓ 已拉起环境';
                setTimeout(function() {
                    btn.className = 'btn';
                    btn.innerHTML = oldText;
                }, 2000);
            } catch (e) {
                alert("启动失败,请检查 launcher.bat 路径是否存在!");
            }
        }

        function filterProfiles() {
            var keyword = document.getElementById('searchInput').value.toLowerCase().replace(/^\s+|\s+$/g, '');
            var cards = document.getElementsByClassName('profile-card');
            for (var i = 0; i < cards.length; i++) {
                var cardText = cards[i].getAttribute('data-search');
                cards[i].style.display = (cardText.indexOf(keyword) !== -1) ? 'inline-block' : 'none';
            }
        }

        renderProfiles();
    </script>
</body>
</html>

五、完整运行流程拓扑

整个系统的自动化调用链路如下:

轻量级 Chrome 多账号指纹隔离系统架构
轻量级 Chrome 多账号指纹隔离系统架构(多端口 SOCKS5 代理 + 参数伪装 + HTA 调度)

双击运行 run_convert.bat 挂载 SOCKS5 监听端口,随后打开 Console.hta 控制台,点击任意账号卡片,系统即会自动拉起一套具备独立 IP、专属时区、匹配语言与完全隔离存储的商业级指纹浏览器环境!


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注