跳转至

浏览器指纹伪装系统

1. 系统概述

proxy/src/browser-headers.ts 是代理层的一个关键安全模块(87 行),负责生成精确的浏览器请求头,以绕过 API 网关的机器人检测。

浏览器指纹伪装系统
─────────────────
                                      ┌──────────────────┐
mkHeaders(domain="monkeycode-ai.com") │ MonkeyCode API    │
──────────────────────────────────────┤ 请求头生成器       │
                                      └──────────────────┘
                                      ┌──────────────────┐
bzHeaders(domain="baizhi.cloud")      │ 百智云 API        │
──────────────────────────────────────┤ 请求头生成器       │
                                      └──────────────────┘
                                      ┌──────────────────┐
scHeaders(SCaptcha)                   │ SCaptcha 验证码   │
──────────────────────────────────────┤ 请求头生成器       │
                                      └──────────────────┘
                                      ┌──────────────────┐
navHeaders(任意 domain)               │ 页面导航(非 XHR) │
──────────────────────────────────────┤ 请求头生成器       │
                                      └──────────────────┘
                                      ┌──────────────────┐
wsHeaders(domain, cookie)             │ WebSocket         │
──────────────────────────────────────┤ 连接请求头生成器    │
                                      └──────────────────┘

2. 基础伪造头

所有变体共享的基准用户代理和 Accept 语言:

// proxy/src/browser-headers.ts
const BASE_UA =
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " +
  "AppleWebKit/537.36 (KHTML, like Gecko) " +
  "Chrome/148.0.0.0 Safari/537.36"

const BASE_ACCEPT = "application/json, text/plain, */*"
const BASE_ACCEPT_LANG = "zh-CN,zh;q=0.9,en;q=0.8"
const BASE_SEC_CH =
  '"Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"'

3. 基础合并函数

function merge(
  domain: string,
  extra: Record<string, string> = {}
): Record<string, string> {
  return {
    "User-Agent": BASE_UA,
    Accept: BASE_ACCEPT,
    "Accept-Language": BASE_ACCEPT_LANG,
    "Accept-Encoding": "gzip, deflate, br",
    "Sec-Ch-Ua": BASE_SEC_CH,
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"macOS"',
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    Origin: `https://${domain}`,
    Referer: `https://${domain}/`,
    Priority: "u=1, i",
    ...extra,
  }
}

4. 四种专用生成器

4.1 MonkeyCode API(mkHeaders()

// 用途: 所有对 monkeycode-ai.com 的 XHR/fetch 请求
// Origin: https://monkeycode-ai.com
// Sec-Fetch-Site: same-origin
export function mkHeaders(
  extra: Record<string, string> = {}
): Record<string, string> {
  return merge("monkeycode-ai.com", extra)
}

✅ 特点:XHR 请求风格(Sec-Fetch-Dest: empty, Sec-Fetch-Mode: cors

4.2 百智云 API(bzHeaders()

// 用途: 对 baizhi.cloud 的 XHR 请求(OAuth 登录流程)
// Origin: https://baizhi.cloud
// Sec-Fetch-Site: same-origin
export function bzHeaders(
  extra: Record<string, string> = {}
): Record<string, string> {
  return merge("baizhi.cloud", extra)
}

✅ 特点:与 mkHeaders 结构相同,仅域名不同

4.3 SCaptcha API(scHeaders()

// 用途: 对 *.s-captcha-r1.com 的 challenge 请求
// Origin: https://monkeycode-ai.com(作为 "父页面")
// Referer: https://monkeycode-ai.com/
export function scHeaders(
  extra: Record<string, string> = {}
): Record<string, string> {
  return {
    "User-Agent": BASE_UA,
    Accept: BASE_ACCEPT,
    "Accept-Language": BASE_ACCEPT_LANG,
    "Content-Type": "application/json",   // 始终 JSON
    "Origin": "https://monkeycode-ai.com",
    "Referer": "https://monkeycode-ai.com/",
    ...extra,
  }
}

⚠️ 重要区别:SCaptcha 是跨域请求,其 Origin 来自 monkeycode-ai.com 页面内嵌的验证码 iframe/script,而非直接访问。NODE_TLS_REJECT_UNAUTHORIZED = "0" 被临时设置——这表明 SCaptcha 端点可能存在证书问题。

4.4 页面导航(navHeaders()

// 用途: 模拟浏览器地址栏输入/页面跳转(非 XHR)
// Accept: text/html(浏览器导航请求)
// Sec-Fetch-Mode: navigate
// Upgrade-Insecure-Requests: 1
export function navHeaders(
  domain: string,
  extra: Record<string, string> = {}
): Record<string, string> {
  return {
    "User-Agent": BASE_UA,
    Accept: "text/html,application/xhtml+xml,application/xml;q=0.9," +
            "image/avif,image/webp,image/apng,*/*;q=0.8," +
            "application/signed-exchange;v=b3;q=0.7",
    "Accept-Language": BASE_ACCEPT_LANG,
    "Accept-Encoding": "gzip, deflate, br",
    "Sec-Ch-Ua": BASE_SEC_CH,
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"macOS"',
    "Sec-Fetch-Dest": "document",       // 页面文档
    "Sec-Fetch-Mode": "navigate",       // 导航模式
    "Sec-Fetch-Site": "cross-site",     // 跨站跳转
    "Upgrade-Insecure-Requests": "1",   // 浏览器默认
    Priority: "u=0, i",
    ...extra,
  }
}

⚠️ 区别:这是唯一使用 text/html Acceptnavigate 模式的请求头,用于模拟 OAuth 回调时的页面跳转。

4.5 WebSocket 连接头(wsHeaders()

// 用途: WebSocket 握手请求头
// Sec-WebSocket-Version: 13
export function wsHeaders(
  domain: string,
  cookie: string
): Record<string, string> {
  return {
    "User-Agent": BASE_UA,
    "Accept-Language": BASE_ACCEPT_LANG,
    "Cache-Control": "no-cache",
    Pragma: "no-cache",
    Origin: `https://${domain}`,
    Cookie: cookie,                    // 携带 Session Cookie
    "Sec-WebSocket-Version": "13",    // WebSocket 协议版本
  }
}

5. 各 API 调用中的请求头使用

端点 使用的操作 请求头函数 域名
登录密码 auth.ts loginUser / loginTeam mkHeaders() monkeycode-ai.com
状态检查 auth.ts checkStatus mkHeaders() monkeycode-ai.com
模型列表 models.ts fetchModels mkHeaders() monkeycode-ai.com
创建任务 task-runner.ts createTask mkHeaders() monkeycode-ai.com
停任务 task-runner.ts stopTask mkHeaders() monkeycode-ai.com
发送短信码 admin-login.ts sendSmsCode bzHeaders() baizhi.cloud
百智云登录 admin-login.ts baizhiPhoneLogin bzHeaders() baizhi.cloud
OAuth authorize admin-login.ts baizhiOAuthAuthorize bzHeaders() + navHeaders() baizhi.cloud
MonkeyCode 回调 admin-login.ts monkeycodeCallback navHeaders() monkeycode-ai.com
SCaptcha 挑战 admin-login.ts getSCaptchaToken scHeaders() *.s-captcha-r1.com
WS 连接 task-runner.ts streamTask wsHeaders() monkeycode-ai.com

6. 安全与防检测分析

6.1 浏览器指纹完整度

指纹维度 设置值 检测用途
User-Agent Chrome 148 / macOS 操作系统 + 浏览器识别
Accept-Language zh-CN,zh;q=0.9,en;q=0.8 语言偏好(中文优先)
Sec-CH-UA Chromium;v="148" 浏览器品牌版本
Sec-CH-UA-Platform "macOS" 操作系统
Sec-Fetch-* 根据场景不同 请求来源类型检测
Origin/Referer 自动域名匹配 同源策略
Accept-Encoding gzip, deflate, br 压缩协议兼容

6.2 可能被检测的信号

信号 当前处理 改进建议
请求间隔(无人工延迟) 立即连续发送 加入随机延迟(300-3000ms)
无鼠标/键盘事件 可通过 Playwright 增加交互
固定 UA 字符串 所有请求共享 每个账号使用不同 UA
无 Cookie 以外的认证 Session Cookie 固定 可添加额外 HTTP 头
无 WebDriver 标志 使用真实浏览器或 Playwright stealth

6.3 SCaptcha 证书问题

// admin-login.ts — SCaptcha 绕过 TLS 验证
const originalTlsSetting = process.env.NODE_TLS_REJECT_UNAUTHORIZED
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
// ... 发起请求 ...
// 恢复原始设置

这表明 SCaptcha 服务可能存在 TLS 证书验证问题,或者代理环境中的证书信任链不完整。


相关章节