K12 教育类小红书全流程
Overview
把 K12 教育账号的内容生产固定成一条可复现的流水线:从红狐热榜拉热点,用打分规则筛出"家长会关心"的选题,拆解同类爆款的结构,写出不像 AI 的小红书笔记,经人工审核后出封面,最后以草稿/预览模式收口到发布确认。
本技能的核心价值不在"生成文案",而在卡点:第 5 步和第 7 步必须停下等人,第 1/3/6 步的外部调用失败必须停下报错。宁可中断,也不要静默降级。
全局约束(所有步骤生效,不得绕过)
- 发布默认草稿/预览模式:K12 主号不直发。
xhs_client.py publish默认--mode draft,只在第 7 步用户明确回复"确认发布"后执行,且仍以草稿态进入平台后台,由人工点击最终发布。 - 外部 API 失败即暂停:红狐接口、小红书接口、生图能力任一调用失败(网络错误、非 2xx、返回体缺字段、超时),必须将原始错误写入
runs/<日期>/errors.log,打印失败接口、参数、错误码,然后停止当前步骤并报告。禁止改用记忆里的数据、禁止跳过该步、禁止用近似结果替代。任何情况下不得静默降级。 - 单步产出落地:每步输出写入
runs/<YYYY-MM-DD>/stepN-*.json|md,供下一步读取与事后复盘。命令在当前工作目录执行,产出落在./runs/,不要cd进 skill 目录(否则产出会写进 skill 包)。脚本路径统一用$SKILL指代,见下方路径约定。 - 不编造数据:竞品篇数、点赞收藏、热点 hotCount 一律来自接口返回。取不到就报缺失,不要"估算"。
前置配置
| 变量 | 用途 | 缺失时行为 |
|---|---|---|
REDFOX_API_KEY |
红狐 API 鉴权,作为请求头 REDFOX_API_KEY 的值 |
第 1 步报错暂停,提示 export REDFOX_API_KEY=... |
XHS_API_BASE |
小红书客户端后端地址 | 第 3/7 步报错暂停 |
XHS_API_TOKEN |
小红书客户端令牌 | 同上 |
生图走 WorkBuddy 内置 ImageGen,无需 IMAGE_API_KEY / IMAGE_BASE_URL。若后续改为直连外部生图 API,再补这两个变量,并在此处登记。
可用性自检(第 1 步前执行一次):
[ -n "$REDFOX_API_KEY" ] && echo "redfox ok" || echo "REDFOX_API_KEY 缺失"
[ -n "$XHS_API_BASE" ] && echo "xhs ok" || echo "XHS_API_BASE 缺失(第 3、7 步会暂停)"
脚本退出码约定
两个脚本的退出码就是"能不能进下一步"的判断依据:
| 退出码 | 含义 | 处置 |
|---|---|---|
| 0 | 成功,产出已落盘 | 继续下一步 |
| 2 | 配置缺失 / 接口非 2xx / 网络错误 / 非法 JSON | 暂停本步,把 stderr 原文贴给用户 |
| 3 | 返回 0 条(红狐全空、search 无结果) | 换近义词重试一次,仍空则暂停 |
| 4 | 发布参数不合法(空标题/空正文/无图/图片文件不存在) | 回上一步补齐,不得带病发布 |
| 5 | 试图直发但缺 --allow-direct |
保持草稿态;确需直发须用户明确要求 |
第 1 步的红狐请求用 http.client 直连发送,以保证自定义请求头 REDFOX_API_KEY 的大小写原样送达(urllib 会把头名改写为首字母大写,按自定义头鉴权的接口会认不到)。修改该脚本时不要退回 urllib.request。
路径约定
所有命令在工作目录下执行,先设一次变量,避免 cd 污染产出位置:
export SKILL="$HOME/.workbuddy/skills/k12-xhs-pipeline"
mkdir -p "runs/$(date +%F)"
下文命令中的 $SKILL/scripts/... 即指 skill 内的脚本。若已 cd 到 skill 目录,可简写为 scripts/xhs_client.py,但 --out 路径要改成绝对路径,否则产出会落在 skill 包里。
工作流总览
1 热点搜集 → 2 选题过滤 → 3 竞品拆解 → 4 起草+去味 → ⏸ 5 人工审核 → 6 生图 → ⏸ 7 发布确认
↑ 无"审核通过"不得进入 6 ↑ 无"确认发布"不得 publish
用户视角的五个环节与七步的对应关系:
| 环节 | 对应步骤 | 产出 |
|---|---|---|
| ① 选题 | 第 1–2 步 | step1-hotspots.json、step2-selection.md |
| ② 素材拆解 | 第 3 步 | step3-competitor.md |
| ③ 内容生成 | 第 4–5 步(含强制人工审核) | step4-draft.md |
| ④ 配图生成 | 第 6 步 | runs/<日期>/cover-*.png |
| ⑤ 发布跳转 | 第 7 步(CLI 或图形化发布台) | 草稿进入平台后台,人工点发布 |
一键启动(图形化发布台)
bash "$HOME/.workbuddy/skills/k12-xhs-pipeline/start.sh"
一条命令完成:依赖检查 → 首次自动 npm install → 启动本地服务(仅监听 127.0.0.1:7788)→ 自动打开页面。Ctrl-C 停止。
- 换端口:
PORT=8080 bash start.sh - 指定回执产出目录:
bash start.sh /path/to/工作目录(默认当前目录的runs/studio/,不会写进 skill 包) - 依赖 node ≥ 18 与本机 Chrome/Edge;
node_modules不随 skill 包分发,首次运行自动安装
环境要求与首次运行
| 项 | 要求 | 说明 |
|---|---|---|
| Node.js | ≥ 18 | 发布台服务与浏览器驱动 |
| 浏览器 | 本机已装 Chrome 或 Edge | 不下载新浏览器;Windows / macOS / Linux 常见安装路径均自动探测,找不到时用 XHS_BROWSER_PATH=/path/to/chrome 指定 |
| 网络 | 首次运行需可访问 npm registry | 只装 playwright-core 一个包(约 10MB),不下载浏览器内核 |
| 草稿 | 首次运行前把 publish_studio/draft.example.json 复制为 draft.json |
不复制也可以,页面可空白填写 |
自检(不开窗口,验证浏览器能起来):
cd "$HOME/.workbuddy/skills/k12-xhs-pipeline/publish_studio" && node driver.mjs --check
# {"status":"check_ok","browser":"..."} 即正常;失败会给出退出码 2 与原因
第 1 步 热点搜集
调用 scripts/redfox_fetch.py,它内部打两个接口再合并:
- 接口 A(平台热榜):
GET https://redfox.hk/story/api/hotSpot/getListByPlatform,参数platform=6(小红书)、startDate/endDate取当天日期YYYY-MM-DD。 - 接口 B(关键词热榜):
POST https://redfox.hk/story/api/hotSpot/getListByPlatformWithKeyword,body 中platforms为[2,5,7,8,9,10],keywords为下方 K12 场景词数组。
两个请求都带请求头 REDFOX_API_KEY: $REDFOX_API_KEY。
python3 "$SKILL/scripts/redfox_fetch.py" \
--start-date "$(date +%F)" --end-date "$(date +%F)" \
--out "runs/$(date +%F)/step1-hotspots.json"
默认 K12 场景词(脚本内 DEFAULT_KEYWORDS,可用 --keywords 覆盖):
小升初 中考 高考 幼升小 分班考 月考 期中考 期末考 单元测
作业 暑假作业 寒假作业 预习 复习 错题本 刷题 教辅 学区 择校
家长焦虑 亲子沟通 青春期 偏科 厌学 专注力 阅读习惯 计算能力
英语启蒙 数学思维 作文 识字 拼音 小四门 理化生 政史地
处理规则:两接口结果按 id(缺失时用 title)去重合并 → 按 hotCount 降序 → 输出统一结构:
{
"generatedAt": "2026-10-27",
"sources": {"platform": "ok", "keyword": "ok"},
"count": 42,
"items": [{"rank": 1, "id": "...", "title": "...", "hotCount": 12345, "platform": 6, "source": "platform|keyword", "url": "..."}]
}
判断依据:count == 0 视为失败(热榜不该全天为空),按全局约束第 2 条暂停并报告,不要用昨天数据顶上。
第 2 步 K12 选题过滤
读取 references/k12-selection-rules.md,按其中打分模板逐条给候选热点打分(三条核心规则 + 五项加减分维度),写出 step2-selection.md。
三条核心规则速记:
- 刚需干货优先:知识点速记、答题技巧、错题整理、升学备考、教辅测评这类"家长会存下来反复看"的内容优先。
- "不讲教学讲教育":把学科问题翻译成家长能观察到的现象("孩子作业写到 11 点")+ 可落地建议("先做 20 分钟数学再做抄写")。纯讲知识点的选题降权。
- 场景化关键词拦截:命中月考、期中、期末、国庆作业、预习清单、偏科、厌学等时效性/情绪化场景词时,除非能给出非时效的通用解法,否则直接淘汰。
判断依据:保留总分前 5–8 条进入下一步;不足 5 条时如实说明原因(今日热榜与 K12 相关性弱),不得为凑数放宽拦截规则。每条保留:选题标题、来源热点、总分、命中规则、一句话切入角度。
第 3 步 竞品搜索与拆解
对第 2 步每个选题执行搜索(取前 10–15 篇):
python3 "$SKILL/scripts/xhs_client.py" search "关键词" --sort "最多收藏" --type "图文" --json
再对其中 3–5 篇高互动笔记取正文与标签:
python3 "$SKILL/scripts/xhs_client.py" detail "<note_id>" --json
拆解三件事,输出 step3-competitor.md 中"选题 + 拆解结论"的合并素材:
- 标题公式:
人群 + 学段痛点 + 方法 + 结果,例:"小学三年级|计算总出错|每天 10 分钟这个方法|期末少丢 8 分"。记录实际出现的变体(如"错题本用法"替代"方法")。 - 正文结构:痛点开头 → 方法拆解 → 实操步骤/案例 → 总结提醒。记录每段大致句数与是否用序号、是否emoji分段。
- 封面类型:大字标题卡 / 手写笔记实拍 / 对比图(前→后)/ 书单或清单拼图。同时记录封面主色与字数。
判断依据:同一选题下 3 篇以上结构高度雷同时,标注"该角度已饱和",在第 4 步换切入角度而不是照抄。搜索返回 <3 篇视为样本不足,换更宽的近义词重搜一次,仍不足则在报告中标注"低竞争蓝海/或词太窄需换词"。
第 4 步 起草 + 去 AI 味
基于第 2 步角度与第 3 步拆解结论写作,产出 step4-draft.md:
- 3 条备选标题:分别走"痛点直击""结果承诺(不违规)""反差/自嘲"三种路子,均含学段或人群词,长度 20 字内。
- 正文:痛点开头(1–2 句,用家长原话式表达)→ 方法拆解(3–5 点,每点一句结论 + 一句解释)→ 实操步骤或真实案例 → 收尾提醒(不含"赶紧收藏""最后机会"式硬催)。段落短,一句一段为主。
- #话题标签:5–8 个,
学段词 + 场景词 + 方法词 + 泛流量词组合,避免全堆大词。
政策解读类选题(小升初/中考/高考政策扫盲、划片、报名、材料)额外要求:每个具体信息点必须带来源与年份,文末加"以当地教育部门当年公告为准";划片范围、报名时间、材料清单、录取顺序四项拿不到官方原文就不写,改用"通用准备思路 + 常见误区",并向用户索取文件。不得凭往年经验或外市做法推断。细则见 references/compliance.md 第九节。
生成后调用 /humanizer-zh 处理正文,传入要求原话:
> 去除 AI 写作痕迹,保留核心观点和可落地步骤,保留小红书原生短段落和 emoji。
并补充约束:不要强行改成书面语,不要加"首先/其次/综上所述",不要提升术语密度;保留原有信息量与步骤顺序,只改语气和句式。
判断依据:/humanizer-zh 不可用时按全局约束第 2 条暂停,提示安装,不许用"我手动改一下"替代。去味后正文与初稿的步骤条数必须一致,少一步视为改坏,回退重做。
第 5 步 人工审核(强制暂停)
打印以下三块内容,然后停止执行、等待用户回复:
- 待审稿全文:标题 3 条 + 正文 + 标签,原样打印,不做摘要。
- 合规检查清单(逐条对照
references/compliance.md,标 ✅/⚠️/❌):
- 绝对化用语:最、第一、唯一、顶级、必备、100%
- 保提分承诺:保过、保提分、百分百提高、稳上重点、一次见效
- 虚假承诺:包会、7 天逆袭、押题必中
- 违规导流:微信/QQ 号、二维码、"私信领资料"、"评论区扣1"、外部链接
- 教育资质相关:不得暗示在职教师身份、不得承诺"内部名额" - 改稿建议(可选):指出哪句最可能被限流,给替换写法。
判断依据:只有用户回复"审核通过"(或同义的明确放行)才进入第 6 步。回复修改意见则回到第 4 步改稿并重新走第 5 步。回复含糊("再看看""差不多")按未通过处理,再问一次。没有明确确认,不允许进入生图环节。
第 6 步 生图
前置检查:确认第 5 步已通过、文案已定稿。为废弃草稿反复出图是明确禁止的——每次只针对定稿版本出图。
封面 prompt 模板(按选题替换标题):
K12教育风格小红书封面,3:4,大字标题,奶油底色/水彩手绘,标题为「<定稿标题>」,安全区内文字可读
调用 image-generator,尺寸 --size "1024x1536"(3:4)。多张知识卡片时用 guizang-social-card 排版,按 1080x1440 切图。
判断依据:
- 封面文字必须是定稿标题原文,一个字不改;出图后逐一核对标题是否可读、有无错字、有无被裁切。错字或裁切直接重出,不要"凑合用"。
- image-generator / guizang-social-card 未安装时按全局约束第 2 条暂停并提示安装。
- 产出 runs/<日期>/cover-*.png,在报告中列出图片路径与对应标题。
第 7 步 发布确认(强制护栏)
先打印结构化预览,再等确认,最后才 publish。
预览格式(逐项打印,不得省略正文全文):
──────── 发布预览 ────────
账号:<K12 主号名称>
模式:草稿(默认,不直发)
标题:<定稿标题>
正文:
<正文全文,原样,保留换行与 emoji>
图片:
1. <path/cover-1.png>
2. <path/cover-2.png>
标签:#小学三年级 #错题本 #数学思维
────────────────────────
等用户回复"确认发布"后执行:
python3 "$SKILL/scripts/xhs_client.py" publish "<标题>" "<正文>" "图1,图2" --tags "标签1,标签2" --mode draft
判断依据:
- 任何非"确认发布"的回复(包括"好""可以""稍等""再改改")都视为取消,回到对应步骤,不得自行解释为同意。
- 预览与定稿不一致(标题/正文/图片任一有出入)立即停下重打预览。
- 不允许跳过预览直接 publish。不允许把 --mode 改成 publish 绕过草稿态,除非用户当次明确要求直发并二次确认。
- 发布失败按全局约束第 2 条记录并暂停,不得换账号或换接口重试。
路径 B:图形化发布台(推荐)
skill 自带 publish_studio/(本地服务 + 浏览器自动化驱动),提供按钮式流程:页面预览 → 点按钮 → 弹出浏览器 → 扫码登录 → 自动填充图文 → 人工点发布。
bash "$HOME/.workbuddy/skills/k12-xhs-pipeline/start.sh" # 一键启动,见上方「一键启动」
# 或手动:cd "$SKILL/publish_studio" && node server.mjs
- 依赖:
npm i playwright-core(免下载浏览器,直接驱动本机 Chrome/Edge);登录态持久化在profile/,首次扫码,之后免登录 - 草稿来源:
publish_studio/draft.json(首次从draft.example.json复制;可由流水线写入,也可在页面上直接编辑后保存)。图片路径支持相对写法,按草稿文件所在目录解析 - 标题上限 20 字、正文上限 1000 字、至少 1 张图——超限会被驱动直接拒绝,不提交
- 铁律:
driver.mjs不包含任何点击「发布」的代码。填充完成后停在发布页,发布/存草稿由人点击。监控到发布成功后写runs/studio/published.json - 风控提示:浏览器自动化可能触发平台风控,建议低频使用;首次运行若表单选择器与页面不匹配,驱动会明确报错并给出调试提示,不得静默降级
资源
start.sh:一键启动图形化发布台(依赖检查 + 自动装依赖 + 起服务 + 开页面)。scripts/redfox_fetch.py:红狐双接口拉取 + 合并去重 + hotCount 降序 + JSON 输出。--base可指向本地 mock 做自测,默认仍为https://redfox.hk/story/api/hotSpot。scripts/xhs_client.py:search/detail/publish三个子命令,publish默认草稿态。references/k12-selection-rules.md:三条核心规则 + 打分模板(第 2 步读取)。references/compliance.md:K12 合规红线清单 + 审核确认话术(第 5 步读取)。publish_studio/:图形化发布台(server.mjs本地服务、driver.mjs自动化驱动、index.html页面、draft.json当前草稿、make_placeholder.py占位封面生成器)。铁律不变:driver.mjs不含任何点击「发布」的代码。
常见失败与处置
| 现象 | 原因 | 处置 |
|---|---|---|
| 红狐返回 401/403 | key 失效或未带在请求头 | 暂停,打印状态码与请求头名,提示更新 REDFOX_API_KEY |
红狐返回体无 hotCount 字段 |
字段名变更 | 暂停,打印原始响应前 500 字符,让人判断映射关系 |
| search 返回空 | 词太窄或接口未登录 | 换近义词重试一次,仍空则暂停并报告 |
| 用户说"直接发吧" | 想跳过预览 | 仍先打预览,明确要求回复"确认发布" |
| 生图文字糊/错字 | 模型对中文长标题不稳 | 缩短标题至 12 字内重出,不放大字号硬撑 |