Files
douyin-pc/docs/2026-09-06-14-07-fingerprint-chromium-patchright.md
T

9.9 KiB
Raw Blame History

0.1.2fingerprint-chromium + Patchright 迁移与验证

1. 用户要求及已确认来源

用户指出 Chrome 显示“正受到自动测试软件的控制”,要求改用 fingerprint-chrome 和 Patchright。已通过交互确认具体项目为:

  • 浏览器:https://github.com/adryfish/fingerprint-chromium
  • Python 驱动:https://github.com/Kaliiiiiiiiii-Vinyzu/patchright-python

原实现显式传入 --enable-automation,确实需要移除。提示条是否显示、navigator.webdriver 的值、CDP 暴露特征与平台能否识别自动化不是同一件事。 本次更换内核/驱动并测试相关可观测项,不承诺匿名、不可检测、防封或绕过风控。

上游 fingerprint-chromium 基于 Ungoogled Chromium,最新二进制补丁源码延迟发布。本次使用用户确认的第三方项目发布文件,并验证固定摘要;不把它称为 Google 官方 Chrome,也不声称独立审计了所有补丁。

2. 锁定的运行环境

  • fingerprint-chromium148.0.7778.215Windows x64。
  • Patchright Python1.62.3,包含其匹配 Node 驱动。
  • Python、PySide6/Qt、psutil 等保持现有完整打包方式,无需最终用户自行安装。

浏览器发布文件:

https://github.com/adryfish/fingerprint-chromium/releases/download/148.0.7778.215/ungoogled-chromium_148.0.7778.215-1.1_windows_x64.zip
SHA256 9ef3f471b7a6641b4224532522b29141ce3746e27d55788d88e2fd951f362579

来源、版本、ZIP 根目录与校验值保存于 packaging/fingerprint-browser-lock.json。上游 BSD-3-Clause 许可保存于 packaging/fingerprint-chromium-LICENSE.txt,并进入安装包 licenses。其他浏览器第三方许可可由 chrome://credits 及内附文件查看。

3. 代码变化

浏览器启动与隔离

src/account_browser.py

  • 默认仅使用安装目录 fingerprint-browser/chrome.exe不回退到系统 Chrome 或 Chrome for Testing
  • 不再传入 --enable-automation
  • 按内部随机账号 ID 派生正 31 位稳定种子,启动时传入 --fingerprint=<seed>
  • 不随重启、UID 查询或归属变化随机轮换种子。不另外伪造平台/UA,不增加代理轮换或跨平台伪装。
  • 重连时检查实际命令行的种子与自动化参数;仍核验 PID、创建时间、可执行路径、user-data-dir 及本机端口归属。
  • 高级参数不允许覆盖 fingerprint、端口、用户目录、安全隔离等受管项。

同一种子不意味着跨不同硬件/系统的所有指纹值必然完全一致。自定义浏览器路径属于高级用户显式配置;仅文件名不能证明任意自定义二进制属于该项目,默认随包内核则受固定摘要约束。

Patchright 与页面 SDK 上下文

accounts_app.pycdp_explicit.pytest_browser_matrix.py 改为 patchright.async_api;Windows 构建虚拟环境已卸载旧 Python Playwright 包。

Session.evaluate() 默认使用 Patchright 的隔离上下文。需要调用站点现有全局 SDK、签名 fetch 或通知监听对象时,明确指定 main_world=True,对应 isolated_context=False

  • 登录资料读取;
  • 通知安装、等待和释放;
  • 关注与详情请求;
  • IM SDK 与旧 CLI 业务表达式。

这不是关闭 Patchright 的全部修补,而是明确访问对象所在上下文;不能把所有脚本盲目放进隔离 world,否则读取不到网页实际 SDK。普通不依赖页面全局对象的测试仍使用隔离 world。没有添加额外的手工 stealth JS 补丁。

旧账号与配置

  • 新浏览器设置使用 fingerprint_browser / fingerprint_browser:<账号ID> 键;旧 browser 设置保留,但不自动复用旧 Chrome 路径。
  • 账号 UID、名称、归属、任务与历史保持不变。
  • 按可执行路径隔离登录目录,新内核不会覆盖旧 Chrome 数据或复制 Cookie。
  • 已绑定账号的“登录 / 刷新信息”也使用只读观察流程,重登后仍须匹配原 UID。
  • 老 Chrome 尚在运行时显示具体原因,不能偷偷接入/强制终止未知进程。升级前应停止业务并关闭旧浏览器。

打包

build_windows.py

  • 收集 Patchright 全部运行数据及 Node 驱动;冒烟报告标识改为 patchright
  • 只允许确认过的项目 HTTPS release 下载源,并检查 ZIP SHA256。
  • 将发行包的版本目录展平至 fingerprint-browser/
  • 校验原始 ZIP 文件名、目录穿越、反斜杠、NUL、ADS 冒号及符号链接。
  • 特别使用 ZipInfo.orig_filenameWindows 会规范化 filename 的反斜杠,仅检查规范化结果不符合原始名称拒绝策略。
  • 保留中文安装界面、全部运行依赖、许可、构建清单和 SHA256 文件。
  • 安装包版本改为 0.1.2AppId 不变。

4. 测试记录

本地基础与测试发现修复

初始 31 项 unittest 基线通过。新功能增加种子、无系统回退、安全解压、旧配置隔离和 Patchright world 选择覆盖后,unittest 共 35 项通过

检查编辑器自动 pytest 时发现真实问题:系统 pytest 不在项目虚拟环境,并缺少根目录导入配置。新增 pytest.inirequirements-test.txt,使用项目 .venv。完整 pytest 还发现两个旧函数式测试仍 mock 已移除的 subprocess.run,已改为实际 evaluate_script 边界。

最终 44 项 pytest 全部通过,包含此前 unittest discover 不会收集的函数式测试。没有把旧配置/收集失败掩盖为“断言通过”。

uv pip install --python .venv/bin/python -r requirements-test.txt
.venv/bin/python -m pytest -q
.venv/bin/python -m unittest discover -s src -q
.venv/bin/python src/test_notifications.py
.venv/bin/python src/test_verify_notification_mark_read.py

配置化 Pyright 最终 0 error / 0 warning。辅助诊断中的旧 follow_user.py 缓存项又用单独 LSP 检查确认干净。

Windows 测试

Windows 构建虚拟环境安装新依赖、卸载旧 Playwright 后:

  • 44 项 pytest 通过
  • 首次 Windows 安全解压测试暴露了 ZIP 名称规范化差异,修复验证器和跨平台测试夹具后重跑通过。
  • 使用真实随包 fingerprint-chromium、原生 Patchright CDP 的离线矩阵通过。
  • 测试临时目录和账号 UID 都是假的;所有目标站点请求被固定响应拦截,没有自动登录、关注、私信或标记已读。

矩阵覆盖包括:

  1. 多账号独立端口与目录;
  2. 实际进程参数中无 --enable-automation,且每个账号使用自己的固定 seed
  3. navigator.webdriver 为布尔 false
  4. 隔离 world 看不到主 world SDK 夹具;显式主 world 能安装监听、接收消息、清理自己的监听且保留站点已有监听;
  5. 自有实例重连、错误 UID/多标签拒绝;
  6. 名称录入后的 UID/资料自动回填且不启动业务;
  7. 刷新、退出重启、localStorage 持久化;
  8. 重启后 seed 不变;
  9. 安全关闭与账号目录删除。

CDP 轨迹验证

仅对上述离线矩阵开启 DEBUG=pw:protocol,没有在真实账号上记录原始协议。

实际观察到 CDP 命令:903
Runtime.callFunctionOn31
Runtime.enable0
DOM.enable0

轨迹包含实际调用,不是空日志。它验证了本次测试路径没有发出这两个 enable 指令,不代表所有未来 SDK 分支或平台检测手段都已覆盖。

Windows 打包与无外部运行时冒烟

  • GUI/CLI onedir 与 Inno 中文安装程序构建成功。
  • 打包冒烟确认 Qt、SQLite、核心、Patchright 正常,使用安装目录内 fingerprint-browser/chrome.exe
  • 复制到新的中文/空格路径,限制 PATH、提供无效外部 PYTHONHOME / 浏览器路径,仍可成功运行打包冒烟。
  • 新包 _internal 中没有旧 Python playwright 包。
  • 账号数为 0、真实写入次数为 0;没有遗留测试 Chrome 进程。
  • 全部 21 个本地 Python 源文件摘要与 Windows 构建清单一致。

此处是已有 Windows 机器上的隔离环境测试,不是重装系统、真实多账号写操作或长期风控测试,也没有用截图证明所有未来版本的提示条外观。

5. 发布

仅发布到指定 Windows,未执行产品安装或自动升级:

C:\Users\rogee\Desktop\抖音账号助手-0.1.2\
  DouyinAccounts-0.1.2-Windows-x64-Setup.exe
  SHA256SUMS.txt
  使用说明.txt

安装程序大小:222,672,989 字节

SHA256 ce24ab16b6d51b5fe31564ef11d139f1ba416e07149309080a7a395ff43c6ce6

旧安装包目录未删除。用户应先停止业务、退出旧程序并关闭旧 Chrome,再安装 0.1.2;新内核中需自己登录原账号,原 UID 绑定、规则和任务保持不变。

6. 可复用构建命令与证据

Windows 源码目录:

py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-build-windows.txt -r requirements-test.txt
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe build_windows.py
.\.venv\Scripts\python.exe src\test_browser_matrix.py `
  --chrome "$PWD\dist\DouyinAccounts\fingerprint-browser\chrome.exe" `
  --report "$PWD\browser-matrix-fingerprint.json"

不需要执行 patchright install,也不另行下载其他 Chromium;产品直接使用指定发行版。更新浏览器需修改新锁文件并重新验证,不能自行追随可变 latest URL。

本次 Windows 工作目录 C:\Users\rogee\douyin-pc-build-20260906 保存:

  • tests-fingerprint.log
  • browser-matrix-fingerprint.json
  • browser-matrix-fingerprint-protocol.json
  • fingerprint-protocol.log(仅离线假数据)
  • build-fingerprint.log
  • .build-cache\smoke-packaged.json
  • smoke-fingerprint-isolated.json
  • dist\DouyinAccounts\build-manifest.json
  • release\SHA256SUMS.txt

仍待用户验收:安装/升级体验、实际浏览器提示条、真实多账号登录与业务,以及长时间平台行为。指纹内核和 Patchright 不能替代身份校验、行为约束与平台规则。