# Soia Media Publish Rednote Card

> 把成文草稿改写成 rednote（小红书）笔记：生成吸睛标题（可带 emoji）、3–5 段短文、话题标签和配图建议；获客户当次授权时可代其在创作服务平台网页端完成发布。不接平台 API、不用第三方逆向包。Triggers：「发成小红书」「小红书笔记」「改成 rednote」「rednote 这篇」「帮我发到小红书」

- Skill: `soia-team/soia-media-publish-rednote-card` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add soia-team/soia-media-publish-rednote-card`
- Raw SKILL.md: https://api.skillmd.com/api/skills/soia-team/soia-media-publish-rednote-card/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: soia-team (https://skillmd.com/u/soia-team)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/soia-team/soia-media-publish-rednote-card

---


# soia-media-publish-rednote-card

把 `compose` 产出的成文草稿改写成适合 rednote（小红书）的笔记文案。默认在回复中交付 Markdown
文本供客户自行发布；客户当次明确授权时，也可由 Agent 驱动**客户已登录的浏览器**在创作服务平台
网页端完成整套发布（见「网页端发布实操」）。本 skill 不调用 rednote 私有 API、不使用第三方逆向
上传包、不修改原稿。

## 客户可读说明

### 这个技能可以做什么

从文章中提炼一个明确的分享角度，组织成适合移动端快速阅读的笔记：一个有信息承诺的标题、3–5 段短文、相关话题标签，以及与内容匹配的配图建议。

| 客户想要 | 技能会做 | 客户能看到 |
|---|---|---|
| 把文章发成小红书笔记 | 提炼角度、重写标题和短段落、补充标签 | 一份可复制的 rednote Markdown 文案 |
| 需要视觉素材方向 | 给出封面/配图的主体、构图、文字和比例建议 | 可执行的配图建议；需要时可衔接 `soia-media-generate-article-image` |
| 自己发布 | 只生成文本与配图建议 | 可直接复制的文案，发布动作由客户完成 |
| **代为发布**（需当次授权） | 在客户已登录的浏览器里传图、填文、加话题、挂 Red Skill 组件，停在发布前请客户确认 | 每步截图与最终状态；客户说「发布」后才点，发布后回执带笔记管理页核实结果 |

### 客户如何使用

1. 说明“发成小红书”“小红书笔记”或“rednote 这篇”，并提供成文草稿、文件内容或路径。
2. 如有要求，一并说明目标读者、账号口吻、标题禁用词、是否突出方法/清单/故事，以及想要的配图风格。
3. Agent 先确定单一分享角度，再输出标题、正文、标签和配图建议；默认不覆盖原稿，客户指定路径时才另存。
4. 客户人工复制文案、准备图片并发布到 rednote；本 skill 不代替平台后台操作。

### 依赖与安装

安装（推荐：装整个领域插件，一次装好本仓全部技能）：

```bash
claude plugin marketplace add soia-team/soia-open-skills
```

```bash
claude plugin install soia-media-content@soia
```

只要这一个技能时，可用 npx 路线。注意技能会落进共享真源 `~/.agents/skills`；若同时装了插件，同一技能会出现两份索引且各自漂移，建议二选一：

```bash
npx skills add soia-team/soia-open-media-content-skills -g -a '*' -s soia-media-publish-rednote-card -y
```

- 改写流程是纯 LLM，无 scripts、无私有配置、无账号凭据、无 rednote API 依赖。
- `soia-media-generate-article-image` 是可选衔接 skill：需要生成封面或正文位图时，先安装并运行它。
- `soia-media-compose-article-draft` 是常见上游产物，但不是安装级强依赖；也可以直接提供任意成文草稿。
- **代为发布**需要宿主具备浏览器操作能力（如 Claude in Chrome 一类的浏览器工具），且客户浏览器
  已登录小红书创作服务平台。凭据始终留在客户浏览器里，本技能不读取、不导出、不存储 cookie。
- 没有浏览器能力或客户未授权时，退回默认形态：只产出文本与配图建议。

**WorkBuddy** 的装载单位是角色化专家而不是插件，`npx skills add -a '*'` 覆盖不到它，需要单独安装，见 [docs/install/workbuddy.md](https://github.com/soia-team/soia-open-skills/blob/main/docs/install/workbuddy.md)。

### 私密信息与中间数据

- **不读取、不导出、不存储账号凭据**。代为发布时始终使用客户浏览器已有的登录态，cookie、token
  和会话只留在浏览器里；不落盘、不回显、不写进回执或日志。
- 客户未登录或登录态失效时，如实告知并停下，请客户自行登录，不代填账号密码。
- 发布过程中的页面截图只用于向客户展示当前状态，不保存到仓库或知识库；截图里若出现账号信息、
  私信内容或其它无关个人数据，不转述、不摘录。
- 配图与草稿属可重建的中间产物，放系统临时目录或客户指定路径；不进仓库，也不写入客户未指定的位置。
- 代为发布用到的临时本地服务、注入脚本等仅存在于当次运行，用完即停，不留常驻进程。

### 日志与完成回执

每次执行都要回报实际处理范围、标题/段落/标签数量和发布边界，**不把“已生成”说成“已发布”，
也不把“已点发布”说成“已确认发布成功”**。最低格式：

```markdown
完成：已将 <输入范围> 改写为 rednote 笔记文本，未调用平台 API。

日志摘要：
- started: <输入来源、目标读者与分享角度>
- processed: <标题 1 个、正文 3–5 段、标签数量、配图建议数量>
- created/updated: <回复文本或客户指定的输出位置>
- skipped/failed: <未处理内容及原因；没有则写“无”>

验证：
- <标题吸引力与事实一致性、段落数量、标签相关性、配图建议核对结果>

问题与下一步：
- 请客户人工复制文案并准备图片后发布；<其它问题，没有则写“无”>
```

代为发布时追加：

```markdown
发布回执：
- 授权：<客户原话> | 原创声明：<已开/未开，未开时说明原因>
- 配图：<张数 / 尺寸 / 注入方式>
- 话题：<数量>，逐个下拉确认，编辑器内均为蓝色
- 组件：Red Skill 已挂 <技能名> / 未挂
- 核实：笔记管理页可见 <标题>，<发布时间>（不以 published=true 为准）
```

## 改写规则

### 1. 先定一个分享角度

- 从原稿中选一个读者能立即理解的角度：解决一个问题、避开一个坑、复盘一个经历或给出一套方法。
- 标题、正文、标签和配图必须围绕同一个角度；不要把整篇文章压缩成互不相关的观点清单。
- 保留原稿事实、限定条件和可核验的来源；不新增未经输入支持的数字、案例、引用或效果承诺。
- 如果原稿有多个同等重要的主题，先询问客户选择；低风险时选择最清晰的主线，并在回执中说明。

### 2. 标题

- 生成 1 个主标题，必要时可附 2 个备选标题供客户选择；主标题要有具体信息承诺或场景冲突，避免空泛的“干货分享”。
- 可使用少量与语义相关的 emoji，但不能用 emoji 代替关键词，也不能堆叠感叹号、夸张收益或虚假权威。
- 标题准确反映正文，不标题党式承诺正文没有提供的结果；遵守客户提供的平台禁用词和品牌限制。

### 3. 正文与标签

- 正文保持 3–5 段短文，每段只表达一个信息点；开头尽快交代场景/痛点，中间给方法或证据，结尾收束并引导互动。
- 使用移动端易读的短句、适度换行和具体例子；保留必要的专业词，但解释第一次出现的术语。
- 话题标签放在正文后，通常给 5–10 个与主题直接相关的标签；从宽主题逐步收窄到具体问题，不添加无关热门标签蹭流量。
- 如用户未提供账号口吻，采用真诚、具体、可验证的分享语气；不冒充个人经历，不声称亲自使用过未提供的产品或方法。

### 4. 配图建议

- 至少给出 1 条封面建议，说明画面主体、构图、主色、文字层级和推荐比例；可按 1:1 小红书方图场景提出建议。
- 文章有步骤、对比或清单时，可补充 1–3 张内页卡片建议，写明每张卡片承载的单一信息。
- 建议中的标题、数字和来源必须与文案一致；不把未经验证的事实放到图片文字里。
- 客户需要实际图片时，说明可以把建议交给 `soia-media-generate-article-image`，但不要声称图片已生成、上传或发布。

### 5. 长文形态（正文超 1000 字时）

小红书图文笔记正文上限 1000 字。原稿超限时**不要硬删成摘要完事**，按长文形态处理，两条路线二选一：

**路线一（首选·小红书端）：官方「写长文」**。以下平台能力来自 2026-08-08 客户全流程实测：

| 环节 | 实测结论 |
|---|---|
| 入口 | 创作服务平台 → 发布笔记 → 第三个 tab「写长文」（URL target=article）；「新的创作」或「导入链接」 |
| 编辑器 | 富文本：H1/H2、有序/无序列表、引用、划线、插图、表情；实时字数与自动保存 |
| 一键排版 | 粘贴全文后点「一键排版」自动分页成文字卡（实测 1180 字 → 5 张，可逐张预览） |
| 模板族 | 清晰明朗（黑/白/米）、黑白极简、理性现代、素雅底纹（粉/米/绿/蓝可换色）、文艺清新（可自动生成插画封面）、平实叙事 |
| 字数徽章 | 「全文N字｜阅读需X分钟」平台自动生成，不需要也不应该自己画 |
| 封面 | 「封面设置」tab 单独调 |
| 标题上限 | 长文发布页标题 20 字（实测 20/20 顶格） |
| 正文描述 | 发布页另有 ≤1000 字笔记描述框，与长文内容分开 |
| 长文合集 | 加入/创建长文合集：名称 ≤20、简介 ≤100、封面必填（png/jpg ≤5M，推荐 3:4）；支持笔记间快速切换连续阅读 |
| 添加组件 | 与图文笔记同款，Red Skill 组件可挂 |
| 关联活动 | 官方活动列表可关联（带档期） |
| 更多设置 | 允许合拍、允许正文复制、公开可见、定时发布 |
| 草稿 | 「暂存离开」进草稿箱；平台自动保存 |

执行要点：

- 全文在 vault 定稿并核对后才粘贴进平台编辑器；平台上只排版不改稿，改稿回真源。
- 标题按 ≤20 字拟；描述框放钩子+导读+互动问题，不复制长文开头。
- 一键排版后选模板（同一合集模板保持一致）；讲到技能的长文可挂 Red Skill 组件；关联活动仅在档期与内容相关时挂。
- 发布前停在提交页等客户当次确认（沿用本技能既有授权规则）。

**路线二（跨平台复用才用）：自产文字卡**。仅当同一长文还要发公众号/X 需要同一套卡，或品牌统一系列时才走；小红书单端发布不再用此路线：

- **全文逐字上卡**：把原稿按知识单元拆成 4–8 张文字卡（封面卡 + 内容卡 + 结语卡），图片承载全文；正文只放钩子、导读（全文讲了哪几件事）与互动问题。
- **封面卡带字数徽章**：「全文约 N 字｜阅读需 X 分钟」——知识区验证过的点开样式；N 与 X 按原稿实数计算，不虚标。
- **卡面样式与产图**：走 `soia-media-generate-article-image`，deck 先行（00-series-bible 统一基座 → 逐卡 prompt → 落盘后生图）；观点/随笔类可用纸质衬线风与品牌深色卡区分。逐卡验字——文字卡整卡都是逐字内容，验收成本按全文字数计。
- 原稿里损坏或不规范的标点（如 ASCII 直引号）上卡时可规范为中文引号，属排版修复；除此之外不改原文一个字。

## 网页端发布实操

**只走官方创作服务平台网页端，用客户自己已登录的浏览器。** 以下每条都由 2026-08-06 首次真实
发布验证过，不是设想。

### 执行前置

必须有客户**当次**的明确授权（「帮我发」「开始发布吧」）。「写一篇小红书」只是要文案，不是要
发布。最后点「发布」前把最终状态截图给客户，等一句确认再点——客户不在电脑旁时，这句确认可以
在聊天里给，但不能省略。

### 五步流程

1. **切 tab**：发布页默认落在「上传视频」，必须先点「上传图文」，否则找不到图片上传控件。
2. **传图**：见下方「传图」。
3. **填标题与正文**：标题框与正文框分开点击定位；正文可一次性输入多段，换行会保留。
4. **加话题**：见下方「话题标签必须逐个确认」。
5. **挂 Red Skill 组件**：「添加组件 → 添加 Red Skill」下拉里选「我发布的 → <技能名>」，
   内容讲场景、卡片管转化，是同平台闭环。

### 传图：宿主 file_upload 不可用时的解法

宿主的文件上传工具可能不可用（2026-08-06 实测 Claude in Chrome 的 `file_upload` 报
`paths: expected array, received undefined`，四种参数写法全失败）。备用路径按下面顺序，**前两条
已验证走不通，不要重复踩**：

| 方案 | 结果 |
|---|---|
| 本地 HTTP 服务器 + 页面 `fetch` | ❌ Chrome 的 Private Network Access 封死 HTTPS 页面访问 localhost；加 `Access-Control-Allow-Private-Network: true` 标准应答头也不放行，请求根本不发出（服务器日志零记录） |
| base64 分片注入 | ❌ 三张 2160×2880 的图约 1.29M base64 字符，代价过高 |
| 合成键盘事件 Cmd+V | ❌ 扩展注入的合成键不携带系统剪贴板图像数据，页面收不到 paste 载荷（2026-08-08 实测） |
| osascript 盲打系统键盘驱动原生文件框 | ❌ **禁用**——激活的可能是客户的另一个 Chrome 窗口，按键会打进客户正在编辑的页面（2026-08-08 实际风险事件）；且原生对话框开着时会挂起该 tab 的 JS 执行 |
| **SVG foreignObject + canvas** | ✅ 图有 HTML 源码时的**标准姿势**（见下方代码） |
| **系统剪贴板 + Clipboard API** | ✅ **纯位图（imagegen 直出 PNG/JPG 等无 HTML 源）的标准姿势**（见下方代码；2026-08-08 实测 5 张一次成功） |

**纯位图路线**——逐张「osascript 只写剪贴板（无键盘事件，安全）→ 页面读取」，最后一次性注入：

```bash
# 每张执行（JPEG 可先压到 ~350KB，剪贴板转 PNG 后约 1.3MB，平台可收）
osascript -e 'set the clipboard to (read (POSIX file "/abs/path/N.jpg") as JPEG picture)'
```

```javascript
// 每张执行：读剪贴板存入 window.__files[N]（页面须处于聚焦标签；无需任何权限弹窗，实测直读成功）
const items = await navigator.clipboard.read();
for (const it of items) for (const t of it.types) if (t.startsWith('image/')) {
  const b = await it.getType(t);
  window.__files = window.__files || [];
  window.__files[N] = new File([b], 'N.png', {type: t});
}
// 全部就绪后一次注入（input 选 accept 含 png 且 multiple 的那个）
const dt = new DataTransfer();
window.__files.filter(Boolean).forEach(f => dt.items.add(f));
const input = [...document.querySelectorAll('input[type=file]')].find(i => i.multiple && /png/.test(i.accept));
input.files = dt.files;
input.dispatchEvent(new Event('change', {bubbles: true}));
```

注意：`navigator.clipboard.read()` 抛 `NotAllowedError: Document is not focused` 时先激活该标签页再读；新图追加在已有图之后，替换场景是「先传新、后删旧」，删除靠悬停缩略图点右上 ×（每删一张网格前移，重复同一位置即可）。

**剪贴板竞态（2026-08-08 实际事故）**：系统剪贴板是全局共享的——流水线执行期间若有其他自动化任务并行（codex 出图任务验证时会动剪贴板），「写入→页面读取」之间会被插队，实发时一张 codex 截图顶替了判定矩阵图混进笔记，靠客户人工发现替换。两条硬规则：
1. **串行化**：执行剪贴板传图前确认无并行的 codex/自动化任务在跑（`pgrep -f 'codex exec'` 为空），期间不派新任务。
2. **逐张读后核验**：读回的 File 用 `createImageBitmap` 比对宽高与来源图一致（如 1080×1440）才落位；不符即重写剪贴板重读，不带病注入。

**发布后必须验证正式链接（客户铁律，2026-08-08 定）**：控制台「更新成功/已提交」≠ 用户拿到。回执必须附「正式链接验证」：打开笔记的对外链接（或搜索入口）确认新内容真实可见；平台在审核期时如实写「已提交，线上仍旧版，过审后切换」，禁止宣称已生效。

配图若由 `soia-media-generate-article-image` 的 `html_render` 路径产出，**HTML 源码本身就在手上**，
可以把它送进页面现场渲染，传输量从 MB 级降到几 KB，且保住 2x 清晰度：

```javascript
// 1) 把 HTML+CSS 包进 SVG 的 foreignObject，用 data: URL 载入 Image
//    SVG 画布设 2x 尺寸，内部 div 用 transform:scale(2) 保清晰
const svg = '<svg xmlns="http://www.w3.org/2000/svg" width="2160" height="2880">'
  + '<foreignObject width="100%" height="100%">'
  + '<div xmlns="http://www.w3.org/1999/xhtml" style="transform:scale(2);transform-origin:0 0;width:1080px;height:1440px">'
  + '<style>' + css + '</style>' + bodyHtml + '</div></foreignObject></svg>';
const img = new Image();
img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);
await img.decode();

// 2) canvas 渲染取 blob（纯内联 SVG 不会污染 canvas，toBlob 可用）
const c = document.createElement('canvas'); c.width = 2160; c.height = 2880;
c.getContext('2d').drawImage(img, 0, 0, 2160, 2880);
const blob = await new Promise(r => c.toBlob(r, 'image/png'));

// 3) 构造 File 注入 input，并派发 change 让前端框架感知
const dt = new DataTransfer();
dt.items.add(new File([blob], '1-cover.png', {type: 'image/png'}));
const input = document.querySelector('input[type=file]');   // accept=".jpg,.jpeg,.png,.webp" multiple
input.files = dt.files;
input.dispatchEvent(new Event('change', {bubbles: true}));
```

**注入器不返回 Promise 结果时**：部分宿主的 JS 执行工具不 await 异步返回值（拿到空对象）。
改成两步——先把结果写进 `window.__r`，再单独读一次该变量。

### 话题标签必须逐个确认

连续输入 `#A #B #C` 只有**最后一个**生效，前面全部退化成纯文本（空格还会被吃掉）。正确做法：
输入一个 `#关键词` → 等下拉出现 → **点选其中一项** → 再输入下一个。

验收标志：生效的标签在编辑器里是**蓝色**，纯文本是黑色。发布前逐个核对颜色。
下拉里带浏览量，可据此在近义标签中选流量更大的那个。

### 原创声明要单独授权

打开「原创声明」开关会弹出协议窗，需要勾选并同意《原创声明须知》。这属于**替客户接受协议条款**，
必须单独征得客户同意，不能因为「已授权发布」就顺手勾。客户未表态时保持关闭，发布不受影响。

### 发布后必须核实

URL 出现 `published=true` **不等于发布成功**，且发布过程可能在草稿箱留下自动存档残留（显示
「草稿箱(1)」属正常）。必须去**笔记管理**页确认笔记条目真实存在，再报告结果。

## 不使用第三方发布工具

社区有一批小红书 MCP / CLI（浏览器自动化或 `x-s`/`x-t` 签名逆向），**本技能不使用**：

- 多数要求交出 cookie 登录态给第三方进程；本技能的原则是凭据留在客户浏览器里。
- 头部项目自己的 issue 里记录着「小红书封号策略持续收紧，大量第三方工具账号被封」，
  并在讨论增加鼠标轨迹模拟等反检测手段——即当前行为会被平台识别。
- 官方只有 Skill 上传 CLI（`redskillhub-upload`），**没有发笔记的官方 API 或 MCP**；
  开放平台的内容接口面向企业/服务商，个人创作者拿不到。

驱动客户自己已登录的浏览器走官方网页端，与自动化脚本的区别在于：凭据不外流、走的是官方界面、
每一步可见可停、发布由客户拍板。这条边界不因工具方便而放宽。

## 输出格式

默认输出为 Markdown：

```markdown
## 标题
<吸睛标题，可带少量 emoji>

## 正文
<第 1 段>

<第 2 段>

<第 3–5 段>

## 话题标签
#主题标签 #具体问题 #方法标签

## 配图建议
- 封面：<主体 / 构图 / 配色 / 文字 / 比例>
- 内页 1：<单一信息点；没有则省略>
```

列表之外可附事实取舍、禁用词或配图衔接说明。客户未指定落盘位置时，只产出回复文本；指定位置时再写入独立草稿文件，绝不覆盖源文件。不要输出“已发布”的假链接或 API 结果。

## 前向测试

- 未获当次授权时只产出文本，不打开发布页、不进行任何页面写入
- 传图后页面预览出现对应张数；话题标签在编辑器内均为蓝色（纯文本为未生效）
- 客户未就原创声明表态时，开关保持关闭，且不勾选任何协议
- 发布后以笔记管理页的条目为准核实，`published=true` 不作为成功判据

