6.5 KiB
EveryPublish Web-only V1 方案
版本:V1-web · 2026-08-21 当前交付面只有网页端。macOS/Windows 客户端、Agent 配对、设备管理和 Agent WSS 暂停,不属于本阶段验收。
1. 目标
EveryPublish V1 是部署在当前设备上的本地 Web 控制台:用户打开浏览器登录,在同一个网页里管理平台账号、素材、发布任务、审核、挑战和结果。发布执行在服务器进程内的本地 worker 完成,不要求安装客户端、不要求生成配对码、不要求绑定设备。
浏览器(React + TDesign)
│ HTTPS/REST + Browser WebSocket
▼
Go server(认证、工作区、素材、任务、挑战、审计)
│
├── WebExecutor(V1 本地模拟/联调,默认可用)
└── PlatformAdapter(真实平台,按平台逐个接入)
│
└── 本机浏览器 profile / cookie vault / QR 登录
2. 明确停止项
- 暂停
client/macos、client/desktop、client/ui的新功能、安装包和启动验收。 - 暂停网页端 Agent 配对码、Agent 设备列表、Agent 总览、远程吊销和客户端日志入口。
- 暂停依赖 Agent WSS 的任务下发;V1 任务由 WebExecutor/PlatformAdapter 在 Go server 所在设备执行。
- 不把当前已有的“假 Agent 在线”当作网页端完成证据。
旧客户端代码保留在仓库中作为后续迁移材料,但不得出现在 V1 菜单、默认流程和验收清单中。
3. V1 页面
| 页面 | 必须可用的功能 |
|---|---|
| 工作台 | 今日任务统计、成功/失败、待处理挑战、最近任务、执行器健康 |
| 账号管理 | 添加账号、平台选择、网页扫码登录、Cookie 导入、登录状态检查、重新登录、删除未绑定账号 |
| 素材库 | 视频/图片上传、进度、SHA-256 去重、预览、分组/标签、删除、下载直链 |
| 新建发布 | 选择素材、选择一个或多个账号、统一标题/正文/标签、封面、立即/定时、草稿保存 |
| 任务中心 | 队列/运行/成功/失败/取消、进度、失败原因、重试、取消、详情、状态时间线和结果链接 |
| 排期日历 | 按日期查看和编辑可编辑任务 |
| 审核中心 | 待审、通过、驳回和批注;可配置跳过审核的本地模式保留在设置 |
| 挑战中心 | QR 图片、验证码、APP 确认、过期、重发、解决记录 |
| 通知 | 任务失败、登录过期、挑战到达、审核结果 |
| 成员/工作区 | 单机 V1 保留基础工作区和成员模型,权限先保证 owner/admin/operator/reviewer 隔离,并支持成员切换工作区 |
| 设置 | 工作区资料、安全(密码修改);通知统一使用站内通知页,外部通知渠道不进入 V1 |
| 审计日志 | 登录、素材、账号、任务、审核、挑战和设置操作 |
4. 连接与状态
V1 只使用网页到 Go server 的两种连接:REST 完成请求,Browser WebSocket 推送任务/挑战/通知。浏览器刷新后通过 REST 补齐状态,不能只依赖 WebSocket。
打开网页
├─ 未登录 ──> 登录页 ──失败/限速──> 保留表单并说明原因
└─ 已登录 ──> GET /auth/me + GET /tasks + GET /challenges
│
├─ WebSocket 已连接 ──> 实时更新
└─ WebSocket 失败 ──> 顶部显示“实时连接断开”,REST 轮询兜底
任务状态统一为:draft → pending_review → queued → dispatched → running → success/failed,可从 failed → queued 重试,draft/rejected → deleted,可取消状态 → cancelled。
5. 执行器边界
WebExecutor 是 Go server 的稳定接口,先提供 mock 实现保证本地全链路,随后按平台接入真实执行器。真实执行器需要从参考仓库借鉴 Playwright/profile/cookie/QR/SSE 逻辑,但必须隔离在 adapter 目录,不能把 Python 示例代码直接散落到 API handler。
TaskDispatcher
├─ 读取任务与账号
├─ 生成短时素材访问令牌
├─ WebExecutor.Submit(ctx, task)
├─ 记录 running / progress / result / error
└─ 广播 task.status
当前实现状态:mock 固定走本机 mock executor;web 对已注册平台走本机 PlatformAdapter,未接入的平台明确保留 mock fallback。B站已接入 QR 登录、加密凭据、UPOS 分片上传和投稿;真实平台成功必须有平台返回的 URL/receipt,mock:// 只能用于自动化测试。
真实平台登录需要用户在浏览器或手机完成扫码;当前无法人工扫码时,只能验证 QR 产生、挑战状态、超时、重发和 mock 解决,不能声称真实账号登录已验收。
6. 验收门槛
本地自动验收
- 注册/登录/刷新/退出和过期 token。
- 上传素材、重复 SHA-256 去重、预览和删除。
- 创建草稿、提交审核、通过/驳回、重提、取消、重试。
- mock executor 将任务推进到 success,并写入结果 URL/receipt。
- Browser WebSocket 断开后 REST 仍可恢复页面状态。
- 账号登录流程可产生 QR,挑战可重发/过期/模拟解决。
- 普通成员不能调用管理员动作,workspace 数据不能串租户。
自动化 smoke 还必须覆盖:注册后的再次登录、refresh token 轮换、空挑战确认值被拒绝、签名素材直链只能使用一次、未登录账号不能创建发布任务,以及 EXECUTOR_MODE=mock 和 EXECUTOR_MODE=web 两种本机执行模式。
人工验收(用户执行)
- 用户在目标平台完成一次真实扫码登录。
- 用户选一个真实账号、上传真实素材、发布一个测试任务。
- 用户确认目标平台内容、任务结果和失败重试。
7. 参考代码许可和借鉴边界
references/social-auto-upload:MIT,HEAD1c66b7d;借鉴 uploader 抽象、统一校验、QR 登录和平台 CLI 参数,不直接复制其当前 Web 层(README 已说明 Web 非主线)。references/social-auto-upload-web-ui:MIT,HEAD85e783c;借鉴 Flask 蓝图拆分、Registry、SSE 登录、串行任务队列、素材中心和批量发布参数。references/MediaPublishPlatform:MIT,HEAD0813236;借鉴统一 BaseFileUploader、批量账号轮换、定时参数和发布记录页面,但不复制其 SQLite/明文 Cookie/全局 CORS。- 任何复制的 MIT 代码必须保留版权/许可证说明;新增代码优先用当前 Go/React 技术栈重写,参考仓库作为
references/只读材料。