From 2389d9c7b68e85bc3d3fdba481be8f0066375ba5 Mon Sep 17 00:00:00 2001 From: Rogee Date: Sun, 6 Sep 2026 11:19:08 +0800 Subject: [PATCH] docs: plan Windows multi-account workflow and configurable browser --- ...26-09-06-10-54-windows-technology-stack.md | 95 ++++++ docs/2026-09-06-11-03-account-ownership-ux.md | 45 +++ docs/2026-09-06-11-05-PLAN.md | 285 ++++++++++++++++++ ...6-11-14-fingerprint-chromium-evaluation.md | 55 ++++ 4 files changed, 480 insertions(+) create mode 100644 docs/2026-09-06-10-54-windows-technology-stack.md create mode 100644 docs/2026-09-06-11-03-account-ownership-ux.md create mode 100644 docs/2026-09-06-11-05-PLAN.md create mode 100644 docs/2026-09-06-11-14-fingerprint-chromium-evaluation.md diff --git a/docs/2026-09-06-10-54-windows-technology-stack.md b/docs/2026-09-06-10-54-windows-technology-stack.md new file mode 100644 index 0000000..2a78acb --- /dev/null +++ b/docs/2026-09-06-10-54-windows-technology-stack.md @@ -0,0 +1,95 @@ +# Windows 多账号监听与任务执行:技术栈评估 + +## 范围与结论 + +需求:Windows 上运行多个 Chrome 登录环境;一个账号持续监听通知,按规则将关注、私信任务分发给其它账号。本文按初期单机、小规模账号部署评估,不实施启动浏览器、登录、关注或发送消息。 + +推荐:Python 3.12 + asyncio + Playwright Python(CDP 接入)+ SQLite + 系统安装的 Chrome。需要桌面界面时增加 PySide6;Windows 分发使用 PyInstaller,在 Windows 构建和验证。初期不用 Redis、Celery、微服务、Docker 或 Electron。 + +## 仓库调研 + +通过 CodeGraph 获取结构与相关函数源码,并查看私信脚本开头: + +- src/subscribe_notifications.py:通过 browser-harness 执行页面表达式、处理推送通知并获取详情。 +- src/follow_user.py:通过浏览器上下文中的 XHR 调用关注接口,包含当前账号检查、目标校验与结果回查。 +- src/douyin_im.py:在已登录页面发现 IM SDK 服务,通过 SDK 获取会话、读取和发送私信。 +- 当前模式依赖 browser-harness 子进程和当前选中页面,现有调用处未显式传入账号级 CDP 连接。这是多账号产品化需要解决的隔离点;并非声称 harness 本身不支持多连接。 +- 已有业务协议逻辑值得复用,但尚未进行 Windows 实机、多账号、长时间运行验证。 + +## 组件职责 + +| 层 | 建议 | 职责 | +| --- | --- | --- | +| 核心 | Python 3.12 | 复用现有业务代码,独立 CLI 入口 | +| 异步调度 | asyncio | 监听、分发、各账号串行消费、跨账号并发 | +| 浏览器接入 | Playwright async API + connect_over_cdp | 每个账号绑定独立连接;必要时 new_cdp_session 获取底层事件 | +| 浏览器管理 | subprocess + pathlib | 启动系统 Chrome,管理端口、目录与进程 | +| 持久化 | sqlite3 | 账号映射、事件去重、任务状态、恢复依据 | +| 配置与日志 | json + logging | 环境无关配置、滚动日志、敏感数据脱敏 | +| 桌面界面(可选) | PySide6 | 账号状态、启停、待人工处理队列 | +| 打包 | PyInstaller | Windows 原生构建,先 onedir | + +Playwright 仅作为 CDP 连接和 JS/网络事件通道,不建议把点击按钮、输入文本或遍历 DOM 作为最终业务方案。保留浏览器内接口/SDK 执行方式与完全脱离浏览器的 HTTP 客户端是不同目标。当前代码依赖前者;若要求后者,需另行验证签名、令牌、长连接协议,不应只替换成 httpx 后承诺可用。浏览器内部 SDK 属于非公开稳定契约,页面更新可能使其失效。 + +## Chrome 隔离 + +每个账号使用一个独立 user-data-dir、一个独立 Chrome 主实例及一个独立 CDP 端口。例如 listener/9222、worker-a/9223、worker-b/9224。端口只是示例,应可配置并在启动时检查冲突。不要仅依赖同一个 User Data 下的 --profile-directory 来实现独立进程与独立 CDP。 + +命令形态: + +```powershell +& $ChromeExe --remote-debugging-port=9222 --user-data-dir="$env:LOCALAPPDATA\DouyinController\profiles\listener" +``` + +ChromeExe 由配置或常见安装位置发现,不硬编码机器路径。同一目录不允许多个实例并发使用,也不要在 Chrome 运行时复制目录。每个新目录由用户首次手动登录,之后由 Chrome 保存登录状态。Chrome 136 起远程调试参数对默认数据目录有限制,应使用非默认 user-data-dir;本次未成功拉取官方页面,版本细节应在选定 Windows/Chrome 版本上复核。 + +CDP 不应对公网或局域网开放;检查实际监听地址,仅允许本机访问,不关闭安全防护。账号配置保存预期 UID;每次执行写操作前校验实际 UID,不能用第一个标签页或端口号代替身份验证。 + +## 最小执行模型 + +1. 监听账号收取事件,先持久化并去重,再按规则生成执行任务。 +2. 一个进程运行调度器和多个异步账号 worker,每个账号串行执行,不需要每账号一个 Python 进程。 +3. SQLite 是任务真源,asyncio.Queue 只是进程内唤醒/排队手段。任务至少记录来源事件、执行账号、动作、目标、参数、状态及错误。 +4. 用唯一约束避免重复派发同一事件/执行账号/动作/目标的任务;同一事件允许多条同类动作时还需规则步骤标识。 +5. 状态可采用 pending/running/succeeded/failed/unknown。进程重启时不能把所有 running 直接重新执行,需先核对结果。 +6. 私信发送超时不代表发送失败;无法确认时标记 unknown,人工核对或基于 SDK 消息标识查询,不能盲目重发。关注也应回查状态。 +7. 若规则要求先关注再私信,按同一账号任务步骤执行,并以明确成功条件决定下一步,而不是只靠队列插入顺序。 +8. 登录失效、验证码或风控立即暂停对应账号并提示用户,不自动登录或绕过验证。监听账号失效时停止新的派发。 +9. 页面刷新/连接断开后需重连并重新安装订阅;断线期间事件是否可补拉,需按现有通知接口验证,不能承诺推送零丢失。 + +## Windows 注意事项 + +- 核心可跨平台开发,浏览器启动、中文路径、权限、打包、休眠恢复必须在 Windows 实测。 +- Chrome 与登录界面运行在交互式用户会话,初期不做 Windows Service(Session 0 与桌面隔离)。可用任务计划程序在用户登录后启动,设置“仅当用户登录时运行”。 +- Windows 休眠/网络断开会打断监听。运行时要有心跳、离线状态与恢复流程;不要宣称普通桌面进程天然 24 小时可靠。 +- 多账号通常主要消耗 Chrome 内存和 CPU,先按实际账号数量测量,不先承诺单机容量。 +- 引入 PySide6 后,Qt 主线程处理 UI,asyncio 核心置于独立线程,用 Qt 信号传递状态,避免阻塞界面;初期 CLI 无需承担这层复杂度。 +- 打包不是加密。保护 profile 目录和任务数据库,不记录 Cookie、令牌或完整带签名 URL,私信内容按最小必要原则保存。 + +## 空白 Windows 环境安装(推荐方案,不表示当前脚本已迁移) + +安装 Windows 版 Python 3.12 和 Chrome,在 PowerShell 执行: + +```powershell +py -3.12 -m venv .venv +.\.venv\Scripts\python.exe -m pip install playwright +# 仅需要桌面界面或打包时安装: +.\.venv\Scripts\python.exe -m pip install PySide6 pyinstaller +``` + +只通过 connect_over_cdp 连接系统 Chrome 时,无需 playwright install 下载配套 Chromium。实际交付时锁定实测依赖版本。当前已有脚本仍调用 browser-harness,以上依赖不会自动替换现有桥接代码。首次迁移优先明确账号级连接,再复用原有通知、关注与 IM 业务函数。 + +## 其它选型 + +- 若团队以 C# 为主、Windows 桌面交付是最高优先级,可选 .NET LTS + WPF + Microsoft.Playwright + SQLite;代价是重写或桥接现有 Python 逻辑。 +- Node.js + Playwright 也可行,但对当前 Python 项目收益不明显;Electron 不会替代那些实际登录的 Chrome 实例,反而增加一套前端运行环境。 +- 多机部署或单进程调度确实成为瓶颈时,再考虑服务端数据库、远程队列和 worker 服务。 + +## 调研限制与参考 + +本次通过 fetch_content 尝试读取以下官方资料,工具因 DNS 映射至 198.18.0.0/15 的 SSRF 防护拒绝请求,未更改网络安全配置。下列链接供复核,不能视为本次已经成功读取的证据: + +- +- + +本次结论依据仓库可见代码与通用平台约束。未进行 Windows 实机测试、接口稳定性保证或平台自动化权限核验。关注与私信仅在账号授权、平台规则允许、避免骚扰的前提下使用;支持配额、暂停与审计,不以多账号切换规避限制。 diff --git a/docs/2026-09-06-11-03-account-ownership-ux.md b/docs/2026-09-06-11-03-account-ownership-ux.md new file mode 100644 index 0000000..fa93fdb --- /dev/null +++ b/docs/2026-09-06-11-03-account-ownership-ux.md @@ -0,0 +1,45 @@ +# 账号归属与切换 UX + +## 用户确认的要求 + +- Windows + Chrome,多账号独立持久化登录环境。 +- 多个大号可以同时监听;每个大号关联多个小号。 +- 一个小号同一时间仅服务于一个大号,但允许切换归属。 +- 大号通知产生的任务仅下发给其关联小号。 +- 使用者自行决定启动多少账号,产品不提供机器容量评估。 +- 支持关机后一键恢复环境;登录是否仍有效以平台实际状态为准,失效时用户手动登录,不自动尝试登录。 + +## 最小数据设计建议(尚未实现) + +每个小号记录一个可空的 owner_account_id,直接指向大号,不使用多对多关联表。空值表示未分配,不接收任务。账号角色与归属由后台校验:只有小号可以设置归属,归属必须是大号。 + +账号 ID、预期平台 UID、Chrome user-data-dir、CDP 配置与归属分开保存。切换归属不更换小号身份,不删除登录数据,不新建浏览器实例。 + +## 切换交互建议 + +在小号菜单提供“切换所属大号”,选择目标后展示原归属、新归属、待执行任务数及执行中状态,并确认切换。 + +为避免跨组执行,建议采取以下默认规则;这是方案建议,并非用户已确认的任务处置细节: + +1. 切换期间暂停该小号接收及领取新任务。 +2. 若有执行中任务,阻止立即切换,提示任务结束后再操作,不强行中断已发出的关注或私信。 +3. 在同一数据库事务中取消该小号原归属的待执行任务,并更新归属;保留取消原因及历史结果,不迁移给新大号,也不自动改派其它小号。 +4. 切换后仅接受新归属大号的任务。 +5. 派发、领取和实际发出操作前校验任务来源大号与小号当前归属;任务领取与切换互斥,防止检查后竞态。 +6. 已发出但结果不确定的任务保留 unknown 状态,只查询核对,不因切换或重启自动重发。 + +确认文案示例:“将小号 X 从大号 A 切换至大号 B。A 下该小号的 N 条待执行任务将取消,历史记录保留。是否继续?” + +## 主界面 + +按大号分组展示关联小号;另设“未分配小号”。支持单组启停、选择多组启动、全部停止。监听状态、登录状态、执行状态应分别展示,避免把已登录误认为正在监听或可执行。 + +账号数量不做推荐或性能评级;真实启动/连接错误仍应呈现。 + +## 持久化与一键恢复 + +SQLite 保存归属、账号配置与任务记录;独立 Chrome 数据目录保存登录环境。启动时恢复连接并核验 UID 与登录状态,登录有效才恢复对应角色的工作。对重启遗留 running 任务先核对,不盲目重发。登录数据仅保存在本机,删除需单独确认。 + +## 范围 + +本次仅更新产品规则与建议,没有修改 src、启动浏览器或执行账号操作。技术栈维持 Python + asyncio + Playwright/CDP + SQLite,桌面界面使用 PySide6。 diff --git a/docs/2026-09-06-11-05-PLAN.md b/docs/2026-09-06-11-05-PLAN.md new file mode 100644 index 0000000..5cffd2e --- /dev/null +++ b/docs/2026-09-06-11-05-PLAN.md @@ -0,0 +1,285 @@ +# PLAN:Windows 多账号通知监听与任务执行 + +本文整合已确认产品需求、推荐技术方案、UX 与实施计划,作为后续开发入口。本文是计划,不代表功能已经实现或完成 Windows 验证。原调研文档保留供追溯;如存在冲突,以本文中的最新已确认需求为准。 + +## 1. 已确认需求 + +### 1.1 运行环境 + +- 运行在 Windows,首版使用官方 Chrome。 +- 浏览器可执行路径和附加启动参数必须可配置,为后续切换 fingerprint-chromium 预留入口;暂不实现或启用其指纹功能。 +- 支持多个独立账号浏览器环境,通过 CDP 连接。 +- 支持多个大号同时登录并持续监听通知。 +- 启动多少账号由使用者根据机器性能自行决定;产品不提供容量评估、推荐数量或自动性能定额。 +- 仍需展示实际启动失败、连接异常等错误,不因不做容量评估而隐藏问题。 + +### 1.2 角色与归属 + +- 大号:监听通知,并根据规则产生关注、私信执行任务。 +- 小号:执行归属大号下发的关注、私信任务。 +- 一个大号可以关联多个小号。 +- 一个小号同一时间只能服务于一个大号,可以按需要切换归属。 +- 大号产生的任务只能派发给其关联的小号,不得跨组派发,也不得交给大号执行。 +- “下发到小号”指下发执行任务,不表示把通知内容作为私信转发给小号。 + +### 1.3 登录持久化与恢复 + +- 保存每个账号的独立登录环境,关机后保留。 +- 提供一键启动,恢复所选账号环境并检查登录状态。 +- 登录有效时恢复对应监听或执行能力;登录失效时提示用户手动登录,不自动尝试登录。 +- 不承诺 Cookie 永不过期,也不把“一键启动”描述为无条件自动登录成功。 + +## 2. 方案建议与边界 + +以下为推荐实现,区别于上节已确认需求。 + +### 2.1 技术栈 + +| 模块 | 推荐技术 | 职责 | +| --- | --- | --- | +| 核心 | Python 3.12 | 复用现有业务脚本 | +| Chrome 管理 | subprocess、pathlib | 启动实例,管理目录、端口和进程 | +| 浏览器接入 | Playwright Python 异步 API、CDP | 显式绑定每个账号的连接和页面 | +| 调度 | asyncio | 多大号监听、任务分发、小号串行消费 | +| 持久化 | SQLite / sqlite3 | 账号、归属、事件和任务状态 | +| 桌面界面 | PySide6 | 账号组管理、状态、启停与日志 | +| 日志 | logging | 错误与操作记录,敏感字段脱敏 | +| Windows 分发 | PyInstaller | Windows 原生构建,初期使用 onedir | + +初期单进程调度,各账号独立异步 worker,同一小号串行执行、不同小号可并发。不引入 Redis、Celery、微服务、Docker、Electron,也不先做 Windows Service。 + +### 2.2 业务执行方式 + +- 最终关注、私信和通知处理不依赖模拟点击或遍历 DOM;页面交互仅用于调研触发请求及用户手动登录。 +- 推荐复用当前浏览器上下文内的接口调用与 IM SDK 逻辑,Playwright 作为 CDP、JS 和网络事件通道。 +- 浏览器内调用接口/SDK 不等于完全脱离浏览器的纯 HTTP 方案。后者涉及签名、令牌和长连接协议验证,不在本计划中承诺。 +- 页面内部 SDK 不是稳定公开契约,需处理页面版本变化导致的不可用。 +- src 中保留可独立运行的 Python 功能脚本;公共能力可复用,不硬编码环境路径、账号或目标页面 ID。 + +### 2.3 浏览器可配置启动(已确认方向) + +首版验证官方 Chrome,后续可通过配置选择 fingerprint-chromium 等兼容 CDP 的 Chromium 浏览器,不将浏览器路径写死在业务脚本中。 + +最小配置建议: + +```json +{ + "browser": { + "executable_path": null, + "extra_args": [] + } +} +``` + +- executable_path 为空时查找本机官方 Chrome;填写时严格使用指定文件,路径无效立即报错,不静默回退到其它浏览器。 +- extra_args 为字符串数组,默认空;使用 subprocess 参数列表启动,不拼接 shell 命令。 +- user-data-dir、CDP 端口及本机访问限制由程序统一管理;附加参数不得覆盖这些隔离设置或关闭必要安全防护,冲突应报错。 +- 配置持久化,一键启动读取同一份配置;设置界面提供可执行文件选择,附加参数放在高级设置。 +- 通知、关注、私信代码只使用显式账号连接,不关心浏览器品牌。不先建立多内核插件或适配框架。 +- 修改配置不热切换正在运行的实例,下次受控启动才生效;存在旧实例时不得把旧连接当成新配置已生效。 +- 更换浏览器内核不自动共用或转换原登录目录,应使用独立目录验证,保留旧环境;不承诺跨内核迁移后仍免登录。 +- fingerprint-chromium 正式启用前另行验证 Windows、CDP、登录恢复、通知与 IM 流程和供应链安全;可配置不等于已经兼容,也不承诺防关联或防封。 + +## 3. 账号环境与隔离 + +```text +大号 A → 独立 Chrome 数据目录 / CDP 连接 + ├─ 小号 A1 → 独立 Chrome 数据目录 / CDP 连接 + └─ 小号 A2 → 独立 Chrome 数据目录 / CDP 连接 +大号 B → 独立 Chrome 数据目录 / CDP 连接 + └─ 小号 B1 → 独立 Chrome 数据目录 / CDP 连接 +``` + +- 每个账号一个独立 user-data-dir、Chrome 主实例和 CDP 端口。 +- 不仅靠同一 User Data 下的 --profile-directory 实现进程隔离。 +- Chrome 路径、存储根目录和端口可配置或自动发现;检测端口冲突、目录占用,重复启动不得生成重复实例。 +- 使用非默认 Chrome 数据目录;Chrome 136 起默认目录的远程调试限制需在目标版本实测。 +- 账号记录预期 UID;连接及写操作前核验实际身份,不把“第一个标签页”当成账号选择规则。 +- CDP 仅允许本机访问;登录目录与数据库仅供必要的本机用户访问,不记录 Cookie、令牌或完整带签名 URL。 +- 切换归属仅修改关系,不退出登录、不更换数据目录、不创建新的小号实例。 + +## 4. UX + +### 4.1 主界面 + +以“大号及其关联小号”为账号组,另设“未分配小号”。大号不是单独执行池成员。 + +每组展示: + +- 大号头像、昵称及账号标识。 +- 登录状态、监听状态。 +- 关联小号列表、可用数量、各小号执行状态。 +- 待执行、成功、失败、结果待核对的任务数量与记录。 + +操作建议: + +- 添加大号、添加小号。 +- 启动/停止单组、启动所选账号组、停止全部。 +- 关联小号、解除关联、切换所属大号。 +- 打开账号浏览器供手动登录或查看。 +- 查看任务记录、异常和日志。 + +登录、连接、监听/执行状态分别展示,不能把“已登录”等同于“正在监听”或“可执行”。账号数量不做性能推荐。 + +### 4.2 小号归属切换(任务处置方案待确认) + +建议流程: + +1. 选择“切换所属大号”,选定目标大号。 +2. 展示原归属、新归属、待执行数量与执行中状态。 +3. 若有正在执行的任务,暂不允许切换,等任务结束后再操作;不强制中断已经发出的请求。 +4. 确认后暂停该小号接收和领取任务,在同一事务中取消旧归属待执行任务并更新归属。 +5. 保留历史及取消原因,不把旧任务带入新组,也不自动改派其它小号。 +6. 切换后仅接收新归属大号的任务。 + +确认提示示例: + +> 将小号 X 从大号 A 切换至大号 B。原有 5 条待执行任务将取消,历史记录保留。是否继续? + +后端必须保证切换与任务领取/执行互斥,并校验任务来源与当前归属,不能只在 UI 过滤。执行结果未知的任务保留待核对状态,不因切换而重发。 + +“解除关联”与“删除登录数据”分开操作;删除登录数据须单独确认。 + +## 5. 通知与任务流程 + +```text +各大号监听通知 + → 事件落库、去重 + → 按规则生成任务 + → 仅派发给所属小号 + → 每个小号串行执行 + → 核验结果、保存状态 +``` + +### 5.1 持久化建议 + +保持最小模型,不使用多对多归属表: + +| 数据 | 主要内容 | +| --- | --- | +| 账号 | 内部 ID、角色、预期 UID、显示信息、数据目录、CDP 配置、启用配置 | +| 归属 | 小号上的可空 owner_account_id,仅允许指向大号 | +| 事件 | 来源大号、通知 ID、接收时间、必要内容、处理状态 | +| 任务 | 来源大号/事件、执行小号、目标 UID、动作/步骤、参数、状态、结果和错误 | + +未分配小号不接收任务。数据库保存任务原来源,不因当前归属改变而重写历史。 + +- 事件去重至少包含来源大号和通知 ID。 +- 任务去重包含来源事件、执行小号、动作/步骤和目标。 +- SQLite 是任务真源,内存队列只用于调度,不能作为唯一存储。 +- 事件入库与任务生成须支持中断恢复,不能出现事件被标记已处理但任务未生成的永久遗漏。 + +### 5.2 状态与恢复 + +建议任务状态:pending、running、succeeded、failed、unknown、cancelled。 + +- 请求超时不等于执行失败;关注需回查,私信需根据消息标识或人工核对。 +- 结果不确定时记录 unknown,禁止无条件重发。 +- 重启遗留 running 任务先核对,不直接重置为 pending。 +- 若规则要求先关注再私信,应显式记录步骤与成功条件,不仅依赖队列顺序。 +- 页面刷新或连接中断后重新连接并安装订阅;断线通知是否能补拉需验证,不承诺零丢失。 +- 登录失效、验证码或风控暂停相关账号并提示用户,不自动登录或绕过验证。 + +## 6. 一键启动与 Windows 生命周期 + +```text +读取所选账号组与归属 + → 复用或启动独立 Chrome 实例 + → 连接对应 CDP + → 核验实际 UID、登录状态 + ├─ 有效:恢复监听/执行能力并核对遗留任务 + └─ 失效:标记需要登录,等待用户处理 +``` + +- 某个账号失败不得把任务错发给其它组;界面分别展示各账号恢复结果。 +- 大号失效时不再产生新任务;小号失效时暂停其执行。 +- 登录目录保存在本机持久位置,与临时文件及打包解压目录分离。 +- 运行在用户交互式会话;如需要开机自启,可采用用户登录后的任务计划,不依赖 Session 0 启动交互式 Chrome。 +- 断网、休眠恢复需显示离线并重连;普通桌面程序不承诺休眠期间持续监听。 +- 不默认提供登录环境跨机器迁移、Cookie 导出或同步。 + +## 7. 实施顺序 + +以下均为待开展工作,不表示已有功能验收通过。 + +### 阶段一:账号隔离与恢复 + +- [ ] 建立账号配置、归属和持久化数据目录。 +- [ ] 实现可持久化的浏览器路径与附加参数配置,默认查找官方 Chrome,校验无效路径及受管参数冲突。 +- [ ] 支持独立启动、重复启动检测、CDP 连接及 UID 校验。 +- [ ] 将现有业务脚本改为显式使用账号连接,保留独立 CLI 入口。 +- [ ] 验证 Windows 关机/重启后登录环境恢复及失效暂停。 + +### 阶段二:多大号监听与执行 + +- [ ] 支持多个大号同时订阅通知。 +- [ ] 实现事件持久化、去重和可恢复任务生成。 +- [ ] 实现按归属派发、每小号串行执行和结果回查。 +- [ ] 实现 unknown 处理、断线重连和刷新后重新订阅。 + +### 阶段三:桌面 UX 与归属切换 + +- [ ] 确认任务分配与切换处置规则后实现对应交互。 +- [ ] 实现账号组、未分配小号、所选组一键启动和状态展示。 +- [ ] 实现安全的归属切换、解除关联和登录数据删除确认。 +- [ ] 确保 UI 不阻塞监听调度;Qt 主线程处理界面,异步核心可运行在独立线程并通过信号通信。 + +### 阶段四:Windows 交付 + +- [ ] 在 Windows 验证中文路径、目录权限、端口冲突和 Chrome 版本兼容性。 +- [ ] 验证断网、休眠、进程退出、部分账号失效和任务结果未知场景。 +- [ ] 用最小可运行测试覆盖去重、归属隔离、切换竞态及重启防重发逻辑。 +- [ ] 在 Windows 构建 PyInstaller 包,提供安装、首次登录、启动和恢复说明。 + +## 8. 验收要点 + +- 多个大号可同时登录并监听,不设置产品侧推荐账号数量。 +- 每个大号的任务只进入其关联小号;大号及其它组小号不可执行。 +- 一个小号最多有一个归属,未分配小号不执行任务。 +- 切换归属保留登录环境;切换后旧组任务不能继续被新领取执行。 +- 同一小号没有并行写操作,重复事件不会重复派发同一任务。 +- 关机后可一键恢复所选环境;有效登录可复用,失效登录明确提示并暂停。 +- 身份不匹配时停止操作,不通过随意选择其它标签页继续执行。 +- 超时及重启不会造成私信盲目重发,历史任务来源可追溯。 +- 页面业务执行不依赖模拟点击;关键功能有可独立运行的 Python 入口。 +- 默认可启动官方 Chrome;配置指定可执行路径与附加参数后,启动器准确使用配置,业务代码无需更改;无效路径和隔离参数冲突明确报错。 +- 配置重启后保留,运行中不热切换内核、不静默回退;第三方内核兼容性单独验收。 + +## 9. 开发前仍需确认的业务规则 + +以下不能从“一个大号关联多个小号”直接推断,不在本次合并中擅自定案: + +1. 一条通知由一个小号执行,还是派发给多个关联小号?若只选一个,采用什么选择规则? +2. 哪些通知触发关注、私信,目标如何确定,私信内容是什么,动作是否要求顺序? +3. 是否采用第 4.2 节建议:切换时取消旧待执行任务,执行中阻止切换? +4. 小号不可用时任务等待、取消还是允许同组改派?大号失效时已排队任务是否继续? +5. “停止”只暂停监听/执行还是同时关闭 Chrome,以及下次启动恢复哪些账号组? + +这些待确认项不影响先开发独立浏览器环境与账号归属存储,但应在实现相关执行策略前确认。 + +## 10. 空白 Windows 开发环境安装 + +安装 Python 3.12 与 Chrome,在 PowerShell 执行: + +```powershell +py -3.12 -m venv .venv +.\.venv\Scripts\python.exe -m pip install playwright +# 开发桌面界面、打包时增加: +.\.venv\Scripts\python.exe -m pip install PySide6 pyinstaller +``` + +仅 connect_over_cdp 接入系统 Chrome 时无需下载 Playwright 自带 Chromium。交付前锁定实测依赖版本。上述命令面向推荐方案,当前脚本仍依赖 browser-harness,尚未完成连接层迁移,不能据此声称现有脚本已可在空白 Windows 运行。 + +## 11. 来源与限制 + +合并来源: + +- [Windows 技术栈评估](2026-09-06-10-54-windows-technology-stack.md) +- [账号归属与切换 UX](2026-09-06-11-03-account-ownership-ux.md) +- [fingerprint-chromium 评估](2026-09-06-11-14-fingerprint-chromium-evaluation.md) +- 用户确认首版采用官方 Chrome,浏览器启动配置保留后续切换 fingerprint-chromium 的入口。 +- 用户追加的多大号同时登录、用户自行决定容量、持久化与一键恢复,以及小号单一归属可切换要求。 + +既有调研识别了 src/subscribe_notifications.py、src/follow_user.py、src/douyin_im.py 中可复用的业务逻辑。本次只合并文档,未修改 src 或执行浏览器操作。此前官方资料抓取受网络安全检查阻断,未完成 Windows 实测,Chrome 兼容性和接口稳定性仍需验证。 + +关注、私信操作限于账号授权与平台规则允许的用途,避免骚扰,不使用多账号切换规避限制。初期不扩展至分布式部署、容量评估或全自动登录。 diff --git a/docs/2026-09-06-11-14-fingerprint-chromium-evaluation.md b/docs/2026-09-06-11-14-fingerprint-chromium-evaluation.md new file mode 100644 index 0000000..9ea64d6 --- /dev/null +++ b/docs/2026-09-06-11-14-fingerprint-chromium-evaluation.md @@ -0,0 +1,55 @@ +# fingerprint-chromium 选型评估 + +## 用户问题 + +评估 是否适合 Windows 多账号浏览器启动,以及能否避免因指纹关联而连锁封号。 + +## 调研过程与证据 + +普通 fetch_content 请求被 DNS 映射至 198.18.0.0/15 的 SSRF 检查阻断,未修改安全配置。随后使用 browser-harness 打开公开 GitHub 项目页和 Releases 页读取页面文本,不使用抖音登录态,不下载或运行第三方二进制,不执行账号操作。 + +已读取: + +- +- + +### 项目页面确认的事实 + +- 基于 Ungoogled Chromium,不是给官方 Chrome 安装的扩展。 +- 提供 Windows x64 安装包与 ZIP。读取时 Releases 标记 Latest 为 148.0.7778.215,包含 Windows x64 二进制及 SHA-256 摘要。 +- 项目声明支持修改 UA、Canvas、音频、字体、ClientRects、WebGL 等部分特征,存在用于配置指纹的启动参数。 +- 项目说明涉及 CDP 自动化修改;这是作者的功能说明,不能代替本项目对 Playwright/CDP 的端到端兼容性验证。 +- 主分支主要是文档。作者明确说明源码/补丁位于 tags,且采用延迟公开政策:当前版本先发布二进制,下一版本发布时再公开对应补丁。README 表中 148 的源码标注为随 149 发布。 +- 作者声明不提供技术支持。 +- 参数在版本间存在变化:144 移除了旧 GPU 参数,引入新的选择性禁用参数;148 又调整了内存与 GPU 模拟。不能将一套启动参数视为跨版本稳定契约。 +- README 自测表提到 GPU 可能有问题;较新 release 宣称改善 GPU 参数一致性。这些都是项目声明,本次未独立验证。 + +## 评估结论 + +### 技术适配 + +可作为可选 Chromium 内核做受控兼容性验证,不需要重写 Python + Playwright/CDP + SQLite + PySide6 的总体方案。最小预留仅为可配置浏览器可执行路径与必要启动配置,不立即实现多内核适配框架。 + +默认仍建议官方 Chrome。第三方内核需要单独验证:启动/CDP、账号身份核对、手动登录、关机后的数据恢复、通知订阅、IM SDK、页面刷新重连与版本升级。当前没有 Windows 实机结果,不能宣称已经兼容。 + +### 防关联与防封边界 + +独立 user-data-dir 隔离登录存储,不提供完整设备或网络身份隔离。该项目可以修改部分浏览器特征,但检测网站结果不能推导为抖音账号不会关联,更不能推导为不会封号。 + +平台可能综合网络、账号关系、行为与内容等信号;本次没有抖音侧独立证据说明该项目降低关联封禁的有效性。不要在产品中宣传“防封”“杜绝关联”或将其当成继续执行受限操作的依据。账号遇到限制仍应暂停,而不是通过切换环境绕过。 + +### 供应链与维护 + +1. 第三方浏览器处理全部账号会话,需评估来源、发布者身份、Windows 签名情况、漏洞修复节奏与升级维护。 +2. 发布页摘要可检查文件一致性,但不能证明构建可信或无恶意代码。 +3. 延迟公开源码使最新二进制的同步源码审查和构建对照受限;不能把项目公开直接等同于当前二进制已审计。 +4. 项目无技术支持,异常排查由自身承担;本次没有审计补丁或验证可复现构建。 +5. 不在官方 Chrome 和第三方 Chromium 之间直接共用同一个在用 profile;验证使用独立目录,保护生产登录数据。不要把跨内核或降级后的目录兼容性视为理所当然。 + +## 对 PLAN 的建议 + +尚未修改现有 PLAN,也未替用户确定切换默认内核。建议后续增加一条兼容性边界: + +> 默认使用官方 Chrome,浏览器可执行路径可配置。fingerprint-chromium 作为待验证可选内核;采用前完成 Windows、CDP、业务流程及供应链评估。不承诺指纹隔离、防关联或防封效果。 + +初期不增加代理管理、指纹生成器、随机化策略或自动轮换机制。关注重点仍是业务权限、账号隔离、去重、结果核对和异常暂停。