From 64d0236f5fd5dab5f2e39bc6fcd34e5be14e5ca1 Mon Sep 17 00:00:00 2001 From: home-dev-pookz Date: Wed, 25 Mar 2026 14:23:03 +0800 Subject: [PATCH] docs: add browser cli unification design --- ...26-03-25-browser-cli-unification-design.md | 394 ++++++++++++++++++ 1 file changed, 394 insertions(+) create mode 100644 docs/superpowers/specs/2026-03-25-browser-cli-unification-design.md diff --git a/docs/superpowers/specs/2026-03-25-browser-cli-unification-design.md b/docs/superpowers/specs/2026-03-25-browser-cli-unification-design.md new file mode 100644 index 0000000..3a46c34 --- /dev/null +++ b/docs/superpowers/specs/2026-03-25-browser-cli-unification-design.md @@ -0,0 +1,394 @@ +# 浏览器平台 CLI 统一与小红书 Skill 设计 + +日期:2026-03-25 + +## 概要 + +这份设计处理三个浏览器自动化平台的主线接口统一: + +- 抖音 +- 快手 +- 小红书 + +目标不是重写 uploader,也不是再抽一层复杂框架,而是把当前已经存在但不一致的 CLI、skill、文档、示例收口成一套统一契约。 + +这次设计同时解决两个现实问题: + +1. 小红书虽然已经有可用的浏览器 uploader,但还没有接入 `sau` CLI,也没有对应 skill。 +2. 抖音、快手当前的 CLI 契约还带着历史字段,比如图文使用 `--note`,视频没有单独 `--desc`,这和当前小红书 uploader 已经支持的 `title + desc + tags` 形态不一致。 + +这次统一后的对外入口固定为: + +- `sau douyin ...` +- `sau kuaishou ...` +- `sau xiaohongshu ...` + +并让三家浏览器平台的视频、图文上传都遵循同一套元数据参数模型。 + +## 目标 + +- 给小红书补齐主线 CLI: + - `login` + - `check` + - `upload-video` + - `upload-note` +- 统一抖音、快手、小红书三家浏览器平台的 CLI 上传参数模型 +- 补齐小红书 skill、示例脚本、README、CLI 文档、安装/更新文档 +- 修正抖音、快手现有 CLI 契约里缺失的 `desc` 能力 +- 保持现有 uploader 主体逻辑不大改,不做过度封装 + +## 非目标 + +- 这次不重构 uploader 架构 +- 这次不改 Web 旧路径 +- 这次不改 Bilibili 的上传契约 +- 这次不做浏览器集成测试 +- 这次不保留公开的 `--note` 主契约 + +## 当前项目基础 + +### 已有能力 + +- 抖音、快手已经接入 `sau_cli.py` +- Bilibili 已经接入 CLI 和 skill +- 小红书已经具备: + - 登录 + - cookie 校验 + - 视频上传 + - 图文上传 + - 定时发布 +- 小红书 uploader 内部已经支持: + - 视频:`title + desc + tags` + - 图文:`title + desc + tags` + - 图文里的 `desc` 可选 + +### 当前不一致点 + +- 抖音视频 CLI:`--title`、`--tags`,没有 `--desc` +- 快手视频 CLI:`--title`、`--tags`,没有 `--desc` +- 抖音图文 CLI:`--note`、`--tags` +- 快手图文 CLI:`--note`、`--tags` +- 小红书还没有 CLI/skill 接口 + +也就是说,当前三家浏览器平台的主线能力并不统一,特别是“图文正文”和“视频描述”字段暴露方式不一致。 + +## 统一后的 CLI 设计 + +### 支持的平台 + +- `douyin` +- `kuaishou` +- `xiaohongshu` + +### 支持的动作 + +每个平台统一支持: + +- `login` +- `check` +- `upload-video` +- `upload-note` + +### 统一后的上传参数模型 + +#### 视频上传 + +```bash +sau upload-video \ + --account \ + --file \ + --title "" \ + [--desc "<description>"] \ + [--tags tag1,tag2] \ + [--schedule "YYYY-MM-DD HH:MM"] \ + [平台特有参数...] +``` + +统一规则: + +- `--title` 必填 +- `--desc` 选填 +- `--tags` 选填 +- `--schedule` 选填 + +平台特有参数: + +- 抖音: + - `--thumbnail` + - `--product-link` + - `--product-title` +- 快手: + - `--thumbnail` +- 小红书: + - `--thumbnail` + +#### 图文上传 + +```bash +sau <platform> upload-note \ + --account <account_name> \ + --images <image-1> [image-2 ...] \ + --title "<title>" \ + [--desc "<description>"] \ + [--tags tag1,tag2] \ + [--schedule "YYYY-MM-DD HH:MM"] +``` + +统一规则: + +- `--images` 必填 +- `--title` 必填 +- `--desc` 选填 +- `--tags` 选填 +- `--schedule` 选填 + +明确决定: + +- 公开 CLI 契约中不再保留 `--note` +- 文档、skill、示例统一使用 `--title + --desc + --tags` + +## 数据模型设计 + +为了让 CLI 层和 uploader 层映射清晰,每个平台都保持各自的 request dataclass,但字段命名统一。 + +### 视频请求对象 + +统一字段: + +- `account_name` +- `video_file` +- `title` +- `description` +- `tags` +- `publish_date` +- `publish_strategy` +- `debug` +- `headless` + +平台特有字段保留: + +- 抖音: + - `thumbnail_file` + - `product_link` + - `product_title` +- 快手: + - `thumbnail_file` +- 小红书: + - `thumbnail_file` + +### 图文请求对象 + +统一字段: + +- `account_name` +- `image_files` +- `title` +- `description` +- `tags` +- `publish_date` +- `publish_strategy` +- `debug` +- `headless` + +不再让图文 request 只存一个模糊的 `note` 字段。 + +## 与现有 uploader 的映射 + +### 抖音 + +- 视频上传继续复用 `DouYinVideo` +- 给抖音视频补齐 `desc` 输入映射 +- 图文上传改为显式接收 `title + desc + tags` +- 原来的 `note` 语义拆开: + - `title` 用于标题 + - `desc` 用于正文 + +### 快手 + +- 视频上传继续复用 `KSVideo` +- 给快手视频补齐 `desc` 输入映射 +- 图文上传改为显式接收 `title + desc + tags` + +### 小红书 + +- 登录、校验直接接 `xiaohongshu_setup` / `cookie_auth` +- 视频上传复用 `XiaoHongShuVideo` +- 图文上传复用 `XiaoHongShuNote` +- 因为小红书 uploader 已经支持 `title + desc + tags`,CLI 只需要做稳定映射 + +## 兼容与迁移策略 + +这次采用“直接统一,不保留公开旧契约”的策略。 + +具体表现: + +- `README.md` +- `docs/CLI.md` +- `docs/install.md` +- `docs/update.md` +- `skills/douyin-upload/...` +- `skills/kuaishou-upload/...` +- 新增 `skills/xiaohongshu-upload/...` +- `scripts/examples/...` + +都会在同一轮里切换到新契约,避免出现: + +- 一部分文档写 `--note` +- 一部分文档写 `--title --desc` + +这样做的代价是旧示例命令会失效,但换来的是主线契约彻底统一。 + +## Skill 设计 + +新增: + +- `skills/xiaohongshu-upload/SKILL.md` +- `skills/xiaohongshu-upload/references/cli-contract.md` +- `skills/xiaohongshu-upload/references/runtime-requirements.md` +- `skills/xiaohongshu-upload/references/troubleshooting.md` +- `skills/xiaohongshu-upload/scripts/examples/xiaohongshu_commands.ps1` +- `skills/xiaohongshu-upload/scripts/examples/xiaohongshu_commands.sh` +- `skills/xiaohongshu-upload/scripts/examples/xiaohongshu_cli_template.py` + +并同步更新: + +- `skills/douyin-upload/SKILL.md` +- `skills/douyin-upload/references/cli-contract.md` +- `skills/kuaishou-upload/SKILL.md` +- `skills/kuaishou-upload/references/cli-contract.md` + +skill 原则继续保持: + +- 优先走 `sau` +- agent 不要先读 uploader 源码 +- CLI 失败时再看 troubleshooting +- 登录二维码图片优先直接展示给用户扫码 + +## 文档设计 + +至少更新: + +- `README.md` +- `docs/CLI.md` +- `docs/install.md` +- `docs/update.md` + +统一后的表达口径: + +- 三家浏览器平台都已经接入 CLI +- 三家浏览器平台都已经接入 skill +- 图文和视频上传都遵循统一字段: + - `title` + - `desc` + - `tags` +- `account_name` 是用户自定义账号名,不是固定只能叫 `creator` +- 一个 `account_name` 对应一个账号文件,可多账号隔离并发 + +## Example 设计 + +examples 保留两类路径: + +1. CLI 主线示例 +2. 历史直连 uploader 示例 + +小红书需要补到和其他平台同等级的主线表达里: + +- `examples/get_xiaohongshu_cookie.py` +- `examples/upload_video_to_xiaohongshu.py` +- 如有必要,补一份更贴近 CLI 契约的调用示例 + +README 和 docs 中要明确说明: + +- 推荐优先使用 `sau xiaohongshu ...` +- 历史直连 uploader 示例只是调试入口 + +## 错误处理 + +### 参数级错误 + +由 CLI parser 负责: + +- 文件不存在 +- 时间格式非法 +- 缺少 `--title` +- 缺少 `--images` + +### 业务级错误 + +由 uploader 和现有校验负责: + +- cookie 不存在 +- cookie 已失效 +- 上传失败 +- 页面结构异常 + +### 二维码口径 + +三家浏览器平台统一保留这条说明: + +- 如果登录流程生成了本地二维码图片,agent 应优先直接展示/发送图片给用户扫码,而不是只返回路径 + +## 测试策略 + +这次只做最小但有价值的 CLI 级验证,不做浏览器集成测试。 + +至少补这些测试: + +- parser 能识别 `xiaohongshu` +- 三个平台新契约能正确解析: + - `upload-video --title --desc --tags` + - `upload-note --images --title --desc --tags` +- dispatch 能正确把参数转成对应 request +- 小红书 `login/check/upload-video/upload-note` 分支能被正确路由 + +保留现有: + +- `tests/test_xiaohongshu_uploader.py` + +## 文件影响范围 + +### 必改 + +- `sau_cli.py` +- `README.md` +- `docs/CLI.md` +- `docs/install.md` +- `docs/update.md` + +### 新增 + +- `skills/xiaohongshu-upload/` 全套文件 +- 对应 CLI 单测文件 + +### 同步修改 + +- `skills/douyin-upload/...` +- `skills/kuaishou-upload/...` +- `examples/get_xiaohongshu_cookie.py` +- `examples/upload_video_to_xiaohongshu.py` + +## 推荐实现顺序 + +1. 先改 `sau_cli.py` 和 request 模型 +2. 接上小红书 CLI 路由 +3. 给抖音、快手补 `desc` / 图文新字段映射 +4. 补 CLI 单测 +5. 新增小红书 skill +6. 更新抖音、快手 skill 契约 +7. 更新 README / CLI / install / update 文档 +8. 更新 examples + +## 最终结论 + +- 三家浏览器平台统一成同一套 CLI 动作: + - `login` + - `check` + - `upload-video` + - `upload-note` +- 三家浏览器平台统一成同一套主线元数据模型: + - `title` + - `desc` + - `tags` +- 小红书补齐 CLI 与 skill +- 抖音、快手补齐 `desc` 能力,移除公开的 `--note` 主契约 +- 实现保持轻量,不做过度封装