279 lines
14 KiB
Markdown
279 lines
14 KiB
Markdown
# 小红书千帆店铺矩阵工具 —— 项目实施计划书
|
||
|
||
版本:v1.0 日期:2026-07-18
|
||
|
||
---
|
||
|
||
## 一、项目背景与目标
|
||
|
||
### 1.1 背景
|
||
运营方需要同时管理多个小红书千帆店铺,人工逐条撰写商品笔记、上传发布效率低,且难以规模化。本项目旨在打造一套"内容工厂 + 分发工具",实现:
|
||
- 店铺与商品信息的集中管理
|
||
- 商品笔记(文案+图片)的批量 AI 生成
|
||
- 多浏览器并行、自动化批量发布
|
||
|
||
### 1.2 目标产出
|
||
1. **本地服务(数据与生成中枢)**:Node.js + SQLite,统一管理数据、代理调用 AI 接口
|
||
2. **网页版管理端**:账号管理、商品管理、笔记审核、模型与提示词配置
|
||
3. **浏览器插件(执行端)**:可在多个浏览器实例中并行运行,自动在千帆发布页完成选品、上传图片、填写文案并发布
|
||
|
||
### 1.3 非目标(本期不做)
|
||
- 不做云端多人协作(如需团队共享,后续可扩展为局域网/云端部署)
|
||
- 不做小红书官方 API 对接(官方未开放笔记发布接口,仍走浏览器自动化路径)
|
||
- 不做多平台(抖音/快手等)适配,本期仅聚焦小红书千帆
|
||
|
||
---
|
||
|
||
## 二、总体架构
|
||
|
||
```
|
||
┌───────────────────────┐
|
||
│ 本地服务 (Local Service) │
|
||
│ Node.js + Express + SQLite │
|
||
│ - 数据存储(店铺/商品/笔记/配置)│
|
||
│ - AI 接口代理(Deepseek/生图) │
|
||
│ - 图片文件管理与去重 │
|
||
│ - 任务队列与认领锁 │
|
||
└───────────┬───────────┘
|
||
HTTP(localhost:3000)
|
||
┌────────────────┴────────────────┐
|
||
│ │
|
||
┌────────▼────────┐ ┌──────────▼──────────┐
|
||
│ 网页版管理端 │ │ 浏览器插件(可多开) │
|
||
│ React + Vite │ │ Manifest V3 │
|
||
│ - 账号/商品/笔记管理│ │ - Content Script 注入 │
|
||
│ - AI 配置/提示词管理│ │ - 任务轮询/认领 │
|
||
└────────────────────┘ │ - 自动化发布执行 │
|
||
└───────────────────────┘
|
||
```
|
||
|
||
**关键设计原则**:本地服务是唯一数据源与状态权威,网页版和插件都是无状态客户端,通过 HTTP API 读写数据,天然支持多浏览器并行而不冲突。
|
||
|
||
---
|
||
|
||
## 三、技术栈选型
|
||
|
||
| 层 | 技术 | 说明 |
|
||
|---|---|---|
|
||
| 本地服务 | Node.js 18+ / Express | 轻量、易打包,开发效率高 |
|
||
| 数据库 | SQLite(better-sqlite3) | 单文件数据库,免安装,适合本地化部署 |
|
||
| 网页版前端 | React + Vite + TailwindCSS | 组件化开发快,生态成熟 |
|
||
| 状态管理 | Zustand 或 React Query | React Query 处理服务端数据缓存更合适 |
|
||
| 插件框架 | Chrome Extension Manifest V3 | Service Worker + Content Script |
|
||
| 图片处理 | Sharp(服务端) | 用于压缩、格式转换、生成缩略图 |
|
||
| 图片去重 | pHash(sharp-phash 或自实现) | 感知哈希,判断生成图片相似度 |
|
||
| 打包分发 | Electron(可选,做成桌面壳) | 让本地服务"点击即启动",非技术用户更友好 |
|
||
| AI 文案 | Deepseek API | 用户自行配置 Key/模型 |
|
||
| AI 生图 | 用户配置的生图模型(如 Agens/其他文生图API) | 服务端统一代理转发,避免 Key 暴露给插件/前端 |
|
||
|
||
---
|
||
|
||
## 四、数据库设计(SQLite)
|
||
|
||
### 4.1 shops(店铺表)
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | TEXT PK | UUID |
|
||
| shop_id | TEXT | 小红书店铺ID,唯一索引 |
|
||
| shop_name | TEXT | 店铺名称 |
|
||
| remark | TEXT | 备注 |
|
||
| created_at | DATETIME | |
|
||
| updated_at | DATETIME | |
|
||
|
||
### 4.2 products(商品表)
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | TEXT PK | UUID |
|
||
| shop_id | TEXT FK | 关联 shops.id |
|
||
| title | TEXT | 商品标题 |
|
||
| status | TEXT | pending / generating / generated |
|
||
| created_at / updated_at | DATETIME | |
|
||
|
||
### 4.3 notes(笔记表,核心表)
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | TEXT PK | UUID |
|
||
| product_id | TEXT FK | 关联 products.id |
|
||
| shop_id | TEXT | 冗余字段,便于按店铺过滤任务 |
|
||
| title | TEXT | 笔记标题 |
|
||
| content | TEXT | 正文 |
|
||
| topics | TEXT(JSON数组) | 热搜话题 |
|
||
| image_prompt | TEXT | 生图提示词 |
|
||
| image_paths | TEXT(JSON数组) | 生成图片相对路径 |
|
||
| status | TEXT | draft(待审核) / approved(已通过) / publishing(发布中) / published(已发布) / rejected / failed |
|
||
| worker_id | TEXT | 认领任务的浏览器实例标识(发布中状态使用) |
|
||
| claimed_at | DATETIME | 认领时间,用于超时释放 |
|
||
| published_at | DATETIME | 实际发布时间 |
|
||
| created_at / updated_at | DATETIME | |
|
||
|
||
### 4.4 configs(配置表,Key-Value)
|
||
| key | value(JSON) |
|
||
|---|---|
|
||
| deepseek_config | { apiKey, baseUrl, model, temperature } |
|
||
| image_config | { provider, apiKey, baseUrl, defaultCount, size } |
|
||
| prompt_templates | { title: "...", content: "...", image: "..." } |
|
||
|
||
### 4.5 图片文件目录规范
|
||
```
|
||
/data/images/{product_id}/{note_id}_{seq}.png
|
||
```
|
||
使用 `product_id` 而非商品标题命名文件夹,避免特殊字符/重名问题;标题作为元数据存于 notes 表。
|
||
|
||
---
|
||
|
||
## 五、本地服务 API 设计
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|---|---|---|
|
||
| GET/POST/PUT/DELETE | `/api/shops` | 店铺 CRUD |
|
||
| POST | `/api/shops/import` | 批量导入店铺(CSV/Excel) |
|
||
| GET | `/api/shops/export` | 导出店铺列表 |
|
||
| GET/POST/PUT/DELETE | `/api/products` | 商品 CRUD |
|
||
| POST | `/api/products/import` | 批量导入商品标题 |
|
||
| POST | `/api/notes/generate` | 批量触发生成任务(文案+图片) |
|
||
| GET | `/api/notes` | 笔记列表,支持按店铺/商品/状态筛选 |
|
||
| POST | `/api/notes/:id/rewrite` | 重新生成单条笔记 |
|
||
| POST | `/api/notes/:id/approve` | 审核通过 |
|
||
| DELETE | `/api/notes/:id` | 删除笔记 |
|
||
| GET | `/api/notes/next?shop_id=` | 插件拉取该店铺下一条待发布任务(内部执行认领事务) |
|
||
| POST | `/api/notes/:id/complete` | 插件回调:发布成功 |
|
||
| POST | `/api/notes/:id/fail` | 插件回调:发布失败,记录原因 |
|
||
| GET | `/api/images/:productId/:filename` | 静态图片资源 |
|
||
| GET/PUT | `/api/configs/:key` | 读写配置(Deepseek/生图/提示词) |
|
||
|
||
**任务认领事务(防并发抢单)**:
|
||
```sql
|
||
UPDATE notes
|
||
SET status = 'publishing', worker_id = ?, claimed_at = CURRENT_TIMESTAMP
|
||
WHERE id = (
|
||
SELECT id FROM notes
|
||
WHERE shop_id = ? AND status = 'approved'
|
||
ORDER BY created_at ASC LIMIT 1
|
||
)
|
||
RETURNING *;
|
||
```
|
||
SQLite 单文件写锁天然保证该操作串行执行,多个浏览器同时请求也不会拿到同一条。同时启动一个定时任务:`publishing` 状态超过 10 分钟未回调,自动释放回 `approved`,避免浏览器崩溃导致任务卡死。
|
||
|
||
---
|
||
|
||
## 六、网页版功能详细设计
|
||
|
||
### 6.1 账号(店铺)管理页
|
||
- 列表字段:店铺ID、店铺名称、备注、创建时间、更新时间、操作
|
||
- 支持搜索(按店铺名/ID模糊匹配)
|
||
- 新增/编辑:弹窗表单
|
||
- 导入:上传 CSV/Excel,字段映射后批量写入,支持重复店铺ID去重提示
|
||
- 导出:一键导出当前列表为 CSV
|
||
|
||
### 6.2 商品管理页
|
||
- 按店铺筛选 + 标题搜索
|
||
- 批量导入商品标题(每行一个,或 CSV 单列)
|
||
- 列表字段:ID、所属店铺、商品标题、状态、更新时间、操作
|
||
- **批量生成笔记**:
|
||
1. 勾选商品 → 点击"批量生成"
|
||
2. 弹窗选择:生成图片张数(默认取全局配置,可覆盖)、使用的提示词模板
|
||
3. 前端调用 `/api/notes/generate`,服务端异步串行处理(避免并发打爆 AI 接口配额),生成完成后笔记进入"待审核"
|
||
4. 页面展示生成进度条(轮询任务状态或用 SSE 推送)
|
||
|
||
### 6.3 笔记审核页(对应"创建笔记功能")
|
||
- 筛选:店铺名称、商品标题、状态
|
||
- 列表字段:店铺名称、标题、生图提示词、正文内容(摘要)、热搜话题、操作
|
||
- 操作:
|
||
- **预览图片**:弹窗展示该笔记生成的所有图片
|
||
- **重写**:重新调用生成接口,覆盖当前文案/图片(保留历史版本可选)
|
||
- **通过**:状态 draft → approved
|
||
- **删除**:软删除或直接物理删除(含清理对应图片文件)
|
||
|
||
### 6.4 Deepseek 配置页
|
||
- 表单:API Key、Base URL、模型名、温度等参数
|
||
- "测试连接"按钮,调用一次简单请求验证配置有效性
|
||
|
||
### 6.5 生图模型配置页
|
||
- 表单:服务商、API Key、Base URL、默认生成张数、图片尺寸
|
||
- 全局默认张数会被批量生成时的临时选择覆盖
|
||
|
||
### 6.6 提示词管理页
|
||
- 三类模板:标题生成提示词、正文内容提示词、小红书生图提示词
|
||
- 支持变量占位符,如 `{商品标题}`、`{店铺名}`,生成时自动替换
|
||
- 可维护多套模板并设置"当前启用"版本
|
||
|
||
---
|
||
|
||
## 七、浏览器插件详细设计
|
||
|
||
### 7.1 插件结构(Manifest V3)
|
||
```
|
||
extension/
|
||
├── manifest.json
|
||
├── background.js // Service Worker,负责与本地服务通信、任务调度
|
||
├── content_scripts/
|
||
│ └── qianfan_publish.js // 注入千帆发布页,执行DOM自动化
|
||
├── popup/
|
||
│ └── popup.html/js // 插件面板:配置 shop_id、启动/暂停、查看进度
|
||
└── options/
|
||
└── options.html/js // 可选:配置本地服务地址(默认 localhost:3000)
|
||
```
|
||
|
||
### 7.2 核心流程
|
||
1. **配置绑定**:用户在插件 popup 中为当前浏览器/账号绑定 `shop_id`(对应网页版店铺管理中的店铺)
|
||
2. **任务轮询**:background.js 定时(如每 15~30 秒,含随机抖动)向本地服务请求 `GET /api/notes/next?shop_id=xxx`
|
||
3. **执行发布**:
|
||
- 若在千帆发布页,content script 收到任务后:
|
||
a. 在商品搜索框输入笔记对应商品标题,触发搜索
|
||
b. 点击对应商品进入发布
|
||
c. 通过 `DataTransfer` 构造 `FileList`,模拟文件选择注入图片
|
||
d. 填写正文、话题(用 React/Vue 受控组件时需触发原生 `input`/`change` 事件,不能只赋值 `.value`)
|
||
e. 点击发布按钮
|
||
4. **回调状态**:
|
||
- 成功:`POST /api/notes/:id/complete`
|
||
- 失败(如商品未找到、上传超时):`POST /api/notes/:id/fail`,附带错误信息,便于人工在网页版排查
|
||
5. **防风控策略**:
|
||
- 每次发布间隔随机 30~90 秒
|
||
- 单账号单日发布上限(可在插件配置中设置,如 20 条/天),达到后自动停止轮询
|
||
- 出现连续失败(如 3 次以上)自动暂停并提示用户人工检查
|
||
|
||
### 7.3 DOM 自动化技术要点
|
||
- 发布页面结构需要人工先用浏览器开发者工具抓取实际选择器(本文档暂不假设具体 DOM,需在开发阶段第三阶段实测确认)
|
||
- 文件上传优先尝试标准 `<input type="file">` + DataTransfer 注入;如遇到自定义上传组件(拖拽区域),需要模拟 `dragenter/dragover/drop` 事件序列
|
||
- 富文本编辑器(正文框)若为 contenteditable,需要用 `document.execCommand` 或直接派发 `InputEvent` 写入内容,并触发对应框架的状态同步
|
||
|
||
---
|
||
|
||
## 八、开发阶段与里程碑
|
||
|
||
| 阶段 | 内容 | 产出物 | 预估周期 |
|
||
|---|---|---|---|
|
||
| 阶段一 | 本地服务骨架 + 数据库表 + 基础CRUD API | 可运行的 Express 服务 | 3-5 天 |
|
||
| 阶段二 | 网页版:账号管理 + 商品管理页面 | 可用的管理界面 | 5-7 天 |
|
||
| 阶段三 | 接入 Deepseek + 生图 API,打通"批量生成笔记"全流程 | 生成功能可用,含去重逻辑 | 5-7 天 |
|
||
| 阶段四 | 笔记审核页 + 提示词/模型配置页 | 网页版功能完整 | 3-4 天 |
|
||
| 阶段五 | 插件基础框架 + 单条笔记手动发布验证千帆DOM结构 | 可发布单条笔记的插件原型 | 5-7 天(含DOM调试,具体视千帆页面复杂度) |
|
||
| 阶段六 | 插件任务轮询 + 认领机制 + 批量发布 + 防风控策略 | 完整插件,支持多浏览器并行 | 5-7 天 |
|
||
| 阶段七 | 联调、异常处理(网络失败/DOM变化容错)、日志与监控 | 稳定可用版本 | 3-5 天 |
|
||
|
||
**总计预估**:约 30-42 个工作日(单人开发,实际视千帆页面自动化难度浮动较大,建议阶段五留足调试缓冲)。
|
||
|
||
---
|
||
|
||
## 九、风险与应对
|
||
|
||
| 风险 | 影响 | 应对措施 |
|
||
|---|---|---|
|
||
| 千帆页面 DOM 结构变化 | 插件自动化失效 | Content script 中的选择器集中管理,便于快速修改;增加"选择器失效告警"机制 |
|
||
| 平台风控(频繁发布被限流/封号) | 店铺受损 | 随机延时、单日上限、失败自动暂停;建议先小规模试运行观察风控阈值 |
|
||
| AI 生成内容质量不稳定 | 笔记需要人工反复重写 | 保留"待审核"环节,人工把关;持续优化提示词模板 |
|
||
| 图片生成重复/相似度高 | 内容同质化,可能被平台判定为重复发布 | pHash 去重 + 提示词中加入随机风格变量 |
|
||
| API Key 泄露 | 账号安全风险 | Key 只存本地服务端,前端和插件不直接持有;本地服务对本机 localhost 开放,不对外暴露端口 |
|
||
| 本地服务未启动导致插件/网页版报错 | 影响使用体验 | 网页版和插件都加入"服务连接状态"检测与友好提示 |
|
||
|
||
---
|
||
|
||
## 十、后续可扩展方向(本期不做,仅记录)
|
||
- 支持云端部署 + 多人协作(需要引入用户权限体系,SQLite 换成 Postgres)
|
||
- 支持发布数据回流(笔记浏览量/互动数据抓取分析)
|
||
- 支持多平台适配(抖音、快手等类似发布场景)
|
||
- Electron 打包成一体化桌面客户端,进一步降低部署门槛
|
||
|
||
---
|
||
|
||
*本计划书为项目启动阶段的设计文档,具体接口字段、页面细节可在开发过程中根据实际情况微调。* |