Files
TrueGrowth/vendor/social-auto-upload/docs/superpowers/specs/2026-03-25-browser-cli-unification-design.md
Jammy 52636c91ae
Some checks failed
CI / main (push) Has been cancelled
CI / release-e2e (push) Has been cancelled
Track bundled vendor runtime sources
2026-07-07 10:05:50 +08:00

408 lines
9.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 浏览器平台 CLI 统一与小红书 Skill 设计
日期2026-03-25
## 概要
这份设计处理三个浏览器自动化平台的主线接口统一:
- 抖音
- 快手
- 小红书
目标不是重写 uploader也不是再抽一层复杂框架而是把当前已经存在但不一致的 CLI、skill、文档、示例收口成一套统一契约。
这次设计同时解决两个现实问题:
1. 小红书虽然已经有可用的浏览器 uploader但还没有接入 `sau` CLI也没有对应 skill。
2. 抖音、快手当前的 CLI 契约还带着历史字段,比如视频没有单独 `--desc`,而图文正文命名和视频描述语义混杂,不利于三家浏览器平台形成稳定统一的主线接口。
这次统一后的对外入口固定为:
- `sau douyin ...`
- `sau kuaishou ...`
- `sau xiaohongshu ...`
并让三家浏览器平台的视频、图文上传都遵循统一的主线参数模型:
- 视频:`title + desc + tags`
- 图文:`title + note + tags`
## 目标
- 给小红书补齐主线 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 接口
也就是说,当前三家浏览器平台的主线能力并不统一,尤其是:
- 视频描述没有统一暴露为 `desc`
- 图文正文是否应该沿用 `note` 语义没有统一
## 统一后的 CLI 设计
### 支持的平台
- `douyin`
- `kuaishou`
- `xiaohongshu`
### 支持的动作
每个平台统一支持:
- `login`
- `check`
- `upload-video`
- `upload-note`
### 统一后的上传参数模型
#### 视频上传
```bash
sau <platform> upload-video \
--account <account_name> \
--file <video-path> \
--title "<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>" \
[--note "<content>"] \
[--tags tag1,tag2] \
[--schedule "YYYY-MM-DD HH:MM"]
```
统一规则:
- `--images` 必填
- `--title` 必填
- `--note` 选填
- `--tags` 选填
- `--schedule` 选填
明确决定:
- 图文主线正文统一叫 `note`
- 视频主线描述统一叫 `desc`
- 文档、skill、示例统一使用
- 视频:`--title + --desc + --tags`
- 图文:`--title + --note + --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`
- `note`
- `tags`
- `publish_date`
- `publish_strategy`
- `debug`
- `headless`
这里明确保留 `note`,因为它更符合图文正文语义,不应强行复用视频里的 `description / desc` 命名。
## 与现有 uploader 的映射
### 抖音
- 视频上传继续复用 `DouYinVideo`
- 给抖音视频补齐 `desc` 输入映射
- 图文上传改为显式接收 `title + note + tags`
- `note` 在 CLI 层映射到抖音图文正文输入区
### 快手
- 视频上传继续复用 `KSVideo`
- 给快手视频补齐 `desc` 输入映射
- 图文上传改为显式接收 `title + note + tags`
### 小红书
- 登录、校验直接接 `xiaohongshu_setup` / `cookie_auth`
- 视频上传复用 `XiaoHongShuVideo`
- 图文上传复用 `XiaoHongShuNote`
- 因为小红书 uploader 已经支持 `title + desc + tags`CLI 层把 `note` 稳定映射到图文正文即可
## 兼容与迁移策略
这次采用“直接统一,不保留旧的模糊公开契约”的策略。
具体表现:
- `README.md`
- `docs/CLI.md`
- `docs/install.md`
- `docs/update.md`
- `skills/douyin-upload/...`
- `skills/kuaishou-upload/...`
- 新增 `skills/xiaohongshu-upload/...`
- `scripts/examples/...`
都会在同一轮里切换到新契约,避免出现:
- 一部分文档把图文正文写成 `--note`
- 一部分文档把图文正文写成 `--desc`
这样做的代价是旧示例命令会失效,但换来的是主线契约彻底统一:
- 视频永远是 `desc`
- 图文永远是 `note`
## 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`
- 图文上传统一字段:
- `title`
- `note`
- `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 --note --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`
- 图文:`title + note + tags`
- 小红书补齐 CLI 与 skill
- 抖音、快手补齐 `desc` 能力,并统一图文正文字段为 `note`
- 实现保持轻量,不做过度封装