# 小红书内容自动化运营

当前主流程使用本地 PostgreSQL，飞书多维表格仅作为历史测试数据保留，不再是运行依赖。

## PostgreSQL 后台

已在本机 Docker 的 `miluai-postgres` 实例中创建独立数据库 `xhs_automation`（`localhost:5432`），不会修改已有的 `miluai` 数据库。表结构见 [`schema.sql`](schema.sql)，数据库访问封装见 [`db.py`](db.py)。

默认连接串：

```bash
export XHS_DATABASE_URL='postgresql://postgres:password@127.0.0.1:5432/xhs_automation'
```

初始化或重建表结构：

```bash
.review-venv/bin/python xhs_flow.py init-db
```

历史飞书多维表格元数据：

- Base：[小红书内容自动化运营](https://hcn6rw0ti77t.feishu.cn/base/LoQdbNhQsaGqPus0VZ5c17OKngc)
- 商品池：`tblzLE5BDZvv8CEj`
- 内容任务：`tblkLERXnCTq2SkY`
- 素材库：`tblfkqnYQz6kE9Ek`
- 发布记录：`tblyKc3KrYF3cHOF`
- 模特库：`tblrDCJeGbOkEU3K`
- 姿势库：`tblxBxt5HGRbGxqw`
- 场景库：`tblJePb8IjxxdaT2`

审核入口：使用项目内的独立审核页，不再把多维表格当作前台审核界面。页面会把 6 张图按发布顺序大图展示，并提供标题、正文、检查项、复制按钮和通过/驳回操作；审核结果会回写「内容任务」的 `内容状态` 与 `审核意见`。多维表格的「内容审核画册」视图（`vewmWsxGob`）保留为后台兜底查看。

资产浏览入口：模特画册（`vewcJYSDpe`）、姿势画册（`vewxAy8scB`）、场景画册（`vewzShkt4D`）、素材画册（`vewE4gGeTZ`）。

## 本地配置

飞书 Base token 只在需要兼容历史数据时使用，不参与当前 PostgreSQL 主流程。将 token 放入环境变量，不要写入代码或提交到仓库：

```bash
export FEISHU_BASE_TOKEN='你的 Base token'
```

历史表名、表 ID 和字段映射见 [`config/feishu-base.json`](config/feishu-base.json)。

## 启动审核页

在项目目录执行：

```bash
XHS_DATABASE_URL="$XHS_DATABASE_URL" REVIEW_HOST=0.0.0.0 REVIEW_PORT=5178 REVIEW_PUBLIC_URL='https://xhs.opennj.cn/review.html' .review-venv/bin/python review_server.py
```

服务启动时会自动识别本机局域网 IP，并生成 `outputs/review-qr.png`。终端会打印可扫码地址；手机与电脑连接同一 Wi-Fi 后即可打开审核页。页面仅监听本机/局域网，不包含公网发布能力。

也可以只在电脑本机使用：

```bash
XHS_DATABASE_URL="$XHS_DATABASE_URL" REVIEW_HOST=127.0.0.1 REVIEW_PORT=5178 .review-venv/bin/python review_server.py
```

当前页面任务由 PostgreSQL 的 `content_tasks` 和 `content_images` 提供，不需要修改代码中的记录 ID。

## 一键进入内容流程

本地图片可以直接进入流程：

```bash
REVIEW_PUBLIC_HOST=192.168.129.145 \\
XHS_DATABASE_URL="$XHS_DATABASE_URL" \\
.review-venv/bin/python xhs_flow.py ingest ./商品照片.jpg \\
  --product-name '商品名称' \\
  --user-id '审核人的 open_id'
```

默认只对飞书通知执行 `dry-run`，会打印将要发送的消息而不会实际发出。确认收件人、消息内容和发送身份后，增加 `--send` 才会发送。数据库任务仍会正常创建。

要让“在飞书里发一张照片”自动触发流程，需要先在飞书开发者后台启用应用事件 `im.message.receive_v1`，并给机器人开通 `im:message.p2p_msg:readonly`（读取私聊图片）权限，然后运行：

```bash
.review-venv/bin/python feishu_listener.py \\
  --sender-id '你的 open_id' \\
  --notify-user-id '审核人的 open_id'
```

监听器只处理用户发送的独立图片，会下载图片并调用 `xhs_flow.py ingest`。当前版本使用已有本地生图素材完成可重复测试。审核通过会写入 `outputs/publish_queue.jsonl` 和 PostgreSQL 发布队列，驳回会写入 `outputs/rework_queue.jsonl`。

## 小红书图文发布器

图文发布器复用 `/Users/shulei/git/SKILL开发` 的可见 Chrome/CDP 设计，但按实测图文页面使用多图上传控件、标题输入框和 Tiptap 正文编辑器。先安装依赖：

```bash
.review-venv/bin/pip install -r requirements-review.txt
```

审核通过后先只准备页面并截图，不会点击发布：

```bash
.review-venv/bin/python xhs_publisher.py xhs-任务ID
```

只有明确需要真实提交时才同时传入 `--publish --confirm-publish`。遇到登录、验证码或页面状态不明确时，程序会暂停并保留浏览器现场。

审核通过后的队列也可以由 worker 消费。默认只准备页面并将队列项标记为暂停；生产环境明确授权后再加 `--execute`：

```bash
.review-venv/bin/python publish_worker.py --execute
```

## 数据流

`图片输入 -> products -> content_tasks -> content_images -> reviews -> publish_queue`

每次驳回会保留审核记录，并由 `xhs-flow rework <task_id> --feedback '...'` 创建下一版任务。飞书通知是可选的消息出口；审核页面、任务数据和状态都由本地 PostgreSQL 负责。
