soia-media-publish-rednote-card
把 compose 产出的成文草稿改写成适合 rednote(小红书)的笔记文案。默认在回复中交付 Markdown
文本供客户自行发布;客户当次明确授权时,也可由 Agent 驱动客户已登录的浏览器在创作服务平台
网页端完成整套发布(见「网页端发布实操」)。本 skill 不调用 rednote 私有 API、不使用第三方逆向
上传包、不修改原稿。
客户可读说明
这个技能可以做什么
从文章中提炼一个明确的分享角度,组织成适合移动端快速阅读的笔记:一个有信息承诺的标题、3–5 段短文、相关话题标签,以及与内容匹配的配图建议。
| 客户想要 | 技能会做 | 客户能看到 |
|---|---|---|
| 把文章发成小红书笔记 | 提炼角度、重写标题和短段落、补充标签 | 一份可复制的 rednote Markdown 文案 |
| 需要视觉素材方向 | 给出封面/配图的主体、构图、文字和比例建议 | 可执行的配图建议;需要时可衔接 soia-media-generate-article-image |
| 自己发布 | 只生成文本与配图建议 | 可直接复制的文案,发布动作由客户完成 |
| 代为发布(需当次授权) | 在客户已登录的浏览器里传图、填文、加话题、挂 Red Skill 组件,停在发布前请客户确认 | 每步截图与最终状态;客户说「发布」后才点,发布后回执带笔记管理页核实结果 |
客户如何使用
- 说明“发成小红书”“小红书笔记”或“rednote 这篇”,并提供成文草稿、文件内容或路径。
- 如有要求,一并说明目标读者、账号口吻、标题禁用词、是否突出方法/清单/故事,以及想要的配图风格。
- Agent 先确定单一分享角度,再输出标题、正文、标签和配图建议;默认不覆盖原稿,客户指定路径时才另存。
- 客户人工复制文案、准备图片并发布到 rednote;本 skill 不代替平台后台操作。
依赖与安装
安装(推荐:装整个领域插件,一次装好本仓全部技能):
claude plugin marketplace add soia-team/soia-open-skills
claude plugin install soia-media-content@soia
只要这一个技能时,可用 npx 路线。注意技能会落进共享真源 ~/.agents/skills;若同时装了插件,同一技能会出现两份索引且各自漂移,建议二选一:
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。
私密信息与中间数据
- 不读取、不导出、不存储账号凭据。代为发布时始终使用客户浏览器已有的登录态,cookie、token 和会话只留在浏览器里;不落盘、不回显、不写进回执或日志。
- 客户未登录或登录态失效时,如实告知并停下,请客户自行登录,不代填账号密码。
- 发布过程中的页面截图只用于向客户展示当前状态,不保存到仓库或知识库;截图里若出现账号信息、 私信内容或其它无关个人数据,不转述、不摘录。
- 配图与草稿属可重建的中间产物,放系统临时目录或客户指定路径;不进仓库,也不写入客户未指定的位置。
- 代为发布用到的临时本地服务、注入脚本等仅存在于当次运行,用完即停,不留常驻进程。
日志与完成回执
每次执行都要回报实际处理范围、标题/段落/标签数量和发布边界,不把“已生成”说成“已发布”, 也不把“已点发布”说成“已确认发布成功”。最低格式:
完成:已将 <输入范围> 改写为 rednote 笔记文本,未调用平台 API。
日志摘要:
- started: <输入来源、目标读者与分享角度>
- processed: <标题 1 个、正文 3–5 段、标签数量、配图建议数量>
- created/updated: <回复文本或客户指定的输出位置>
- skipped/failed: <未处理内容及原因;没有则写“无”>
验证:
- <标题吸引力与事实一致性、段落数量、标签相关性、配图建议核对结果>
问题与下一步:
- 请客户人工复制文案并准备图片后发布;<其它问题,没有则写“无”>
代为发布时追加:
发布回执:
- 授权:<客户原话> | 原创声明:<已开/未开,未开时说明原因>
- 配图:<张数 / 尺寸 / 注入方式>
- 话题:<数量>,逐个下拉确认,编辑器内均为蓝色
- 组件: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 首次真实 发布验证过,不是设想。
执行前置
必须有客户当次的明确授权(「帮我发」「开始发布吧」)。「写一篇小红书」只是要文案,不是要 发布。最后点「发布」前把最终状态截图给客户,等一句确认再点——客户不在电脑旁时,这句确认可以 在聊天里给,但不能省略。
五步流程
- 切 tab:发布页默认落在「上传视频」,必须先点「上传图文」,否则找不到图片上传控件。
- 传图:见下方「传图」。
- 填标题与正文:标题框与正文框分开点击定位;正文可一次性输入多段,换行会保留。
- 加话题:见下方「话题标签必须逐个确认」。
- 挂 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 只写剪贴板(无键盘事件,安全)→ 页面读取」,最后一次性注入:
# 每张执行(JPEG 可先压到 ~350KB,剪贴板转 PNG 后约 1.3MB,平台可收)
osascript -e 'set the clipboard to (read (POSIX file "/abs/path/N.jpg") as JPEG picture)'
// 每张执行:读剪贴板存入 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 截图顶替了判定矩阵图混进笔记,靠客户人工发现替换。两条硬规则:
- 串行化:执行剪贴板传图前确认无并行的 codex/自动化任务在跑(
pgrep -f 'codex exec'为空),期间不派新任务。 - 逐张读后核验:读回的 File 用
createImageBitmap比对宽高与来源图一致(如 1080×1440)才落位;不符即重写剪贴板重读,不带病注入。
发布后必须验证正式链接(客户铁律,2026-08-08 定):控制台「更新成功/已提交」≠ 用户拿到。回执必须附「正式链接验证」:打开笔记的对外链接(或搜索入口)确认新内容真实可见;平台在审核期时如实写「已提交,线上仍旧版,过审后切换」,禁止宣称已生效。
配图若由 soia-media-generate-article-image 的 html_render 路径产出,HTML 源码本身就在手上,
可以把它送进页面现场渲染,传输量从 MB 级降到几 KB,且保住 2x 清晰度:
// 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:
## 标题
<吸睛标题,可带少量 emoji>
## 正文
<第 1 段>
<第 2 段>
<第 3–5 段>
## 话题标签
#主题标签 #具体问题 #方法标签
## 配图建议
- 封面:<主体 / 构图 / 配色 / 文字 / 比例>
- 内页 1:<单一信息点;没有则省略>
列表之外可附事实取舍、禁用词或配图衔接说明。客户未指定落盘位置时,只产出回复文本;指定位置时再写入独立草稿文件,绝不覆盖源文件。不要输出“已发布”的假链接或 API 结果。
前向测试
- 未获当次授权时只产出文本,不打开发布页、不进行任何页面写入
- 传图后页面预览出现对应张数;话题标签在编辑器内均为蓝色(纯文本为未生效)
- 客户未就原创声明表态时,开关保持关闭,且不勾选任何协议
- 发布后以笔记管理页的条目为准核实,
published=true不作为成功判据