xiaohongshufabu/计划书.md
2026-07-21 21:17:20 +08:00

279 lines
14 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 小红书千帆店铺矩阵工具 —— 项目实施计划书
版本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 | 轻量、易打包,开发效率高 |
| 数据库 | SQLitebetter-sqlite3 | 单文件数据库,免安装,适合本地化部署 |
| 网页版前端 | React + Vite + TailwindCSS | 组件化开发快,生态成熟 |
| 状态管理 | Zustand 或 React Query | React Query 处理服务端数据缓存更合适 |
| 插件框架 | Chrome Extension Manifest V3 | Service Worker + Content Script |
| 图片处理 | Sharp服务端 | 用于压缩、格式转换、生成缩略图 |
| 图片去重 | pHashsharp-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 打包成一体化桌面客户端,进一步降低部署门槛
---
*本计划书为项目启动阶段的设计文档,具体接口字段、页面细节可在开发过程中根据实际情况微调。*