| name | zhililong |
| related_skills | ["zhili-illustration"] |
| description | 直隶按察使公众号长文输出技能。基于素材(视频/音频/文字稿)产出 4000-5500 字的中文公众号长文。
触发:用户说"写一篇公众号长文"/"写一篇 4000-5000 字"、粘贴视频链接+"写长文"、已有 transcript_clean.txt+"扩写"。
不适用:短评(zhilicomments)、教程(khazix-writer)、GitHub 项目介绍(zhiligithub)。
|
直隶按察使 · 长文输出(zhililong)
字数判断
| 输入 | 字数 |
|---|
| < 30 分钟视频 | 4000-5000 字 |
| 30-60 分钟视频 | 4500-5500 字 |
| 用户指定 | 以用户为准(低于 4000 字建议不写) |
中文字符计数:re.findall(r'[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]', text) 含 CJK 标点。
⚠️ CSS / stop-slop / renwei / pre-submit 清单 → zhili-shared/references/zhili-style.md。
写作哲学基础(human-writing)
本技能写作基于 human-writing 活人感写作体系,核心是"材料→推进→中文"三关。
⚠️ 硬性前置要求:每次写作前必须先 skill_view(name='human-writing') 加载写作体系,用它的框架指导写作,而不是凭感觉下笔后依赖 renwei 查漏。 renwei 是中文关的自动化检查器,不是写作工具。
材料关:zhililong 篇幅长(4000-5500字),材料是唯一支撑。Step 1 的真实性核对是材料关的核心——不是改错字,是确认每段背后都有可查证的具体素材。用户给素材才能写,用户只给方向就要先研究再下笔。没有材料的段落,宁可砍掉也不能用想象补。
推进关:5节结构是骨架,每个论点的段落内部才是真正的推进。每个新段落必须带来新事实、新动作、新例子或新后果。5个论点之间要层层递进或互为补充,不能是同一个观点换5种说法。反转段要真的反转——颠覆读者预期,不是换个角度重述。
中文关:白话打底。让主语和动作先出现,再接时间、原因、条件。判断可以偏,把依据放在附近。不要用"更深一层""真正的问题"当路标,靠事情自身的逻辑推进。句尾的"呢""吧""了"是手迹,不要全删掉。
zhililong 现有规则(renwei 三原则、5节骨架)是三关在长文语境下的具体落地。
完整工作流(9 步)
0. 写作前:skill_view(name='human-writing') 加载写作体系,用其三关框架指导写作
Step 1:素材接收 + 真实性核对
Step 2:列 5 节骨架(先列骨架再写内容)
Step 3:renwei 改稿(zhili-style.md 第3节)
Step 4:markdown 落稿(必须用 ## 章节语法)
Step 5:HTML 转码(scripts/markdown_to_html.py)
Step 6:renwei 自检全文(zhili-style.md 第4节)
Step 7:配图(zhili-illustration)
Step 8:一键推送草稿(scripts/publish_lanlong.py)
Step 1:素材接收 + 真实性核对
必做:
- 读取
transcript_clean.txt(或视频链接的转写)
- 校对 ASR 常见错("冰箭"→"冰鉴"、"向犹新生"→"向死而生")
- 提取具体人物名、具体场景、具体数字、具体金句(带书名号引用)
反模式:用"古人说"/"有研究表明"等泛指。每段至少 1 个可查证的具体素材。
Step 2:5 节结构骨架
⚠️ 先找说话位置,再列骨架。human-writing 要求在内部回答5件事:谁在说、他凭什么知道、手里有什么材料、他对哪点有判断、读者会追问什么。这5个答案决定了骨架怎么列,不是先有骨架再往里填内容。
先列骨架,再写内容。每节预估字数,控制篇幅:
一、[论点 1 — 反常识切入,300-500 字]
二、[论点 2 — 具体方法论 1,800-1000 字]
三、[论点 3 — 具体方法论 2,800-1000 字]
四、[论点 4 — 具体方法论 3,800-1000 字]
五、[论点 5 — 具体方法论 4 或整合,800-1000 字]
[反转段 — 颠覆前面某个认知,300-500 字]
[行动段 — 给读者一个今天就能做的事,200-300 字]
结构硬约束:
- 论点 1 必须用反常识切入("你以为 X,其实是 Y",不要写成"不是 X 而是 Y"句式)
- 5 个论点必须层层递进或互为补充,不能并列
- 反转段必须真的反转
- 行动段必须今天就能做("今天回家观察一下你爸"而不是"用心观察身边的人")
Step 3:renwei 改稿
⚠️ renwei 是 human-writing"中文关"的自动化检查。没有内化就下笔,5000 字长文一定掉进 AI 套话陷阱。
三原则(human-writing 三关的自检映射):
- 材料关:开头 3 句话有没有具体场景/数字/来源?模型临时编的不算数。
- 推进关:每段比起上一段有没有新东西(新事实/新角度/新后果)?同一观点换说法是 filler。
- 中文关:句尾的"呢""吧""了"保留了吗?语气是"见过事的人在讲",不是"导师在教学生"。
五问自检(写每段前心里过一遍):
- 谁在说?他凭什么知道这件事?
- 手里的材料够不够撑这个段落的结论?
- 这个段落比起上一个段落,有没有带来新东西?
- 判断有没有落在具体事实旁边,让读者知道这是作者的看法?
- 句尾有没有语气词,手迹感够不够?
完整套话清单(11 项,≥3 项命中 → 打回重写)→ zhili-shared/references/zhili-style.md 第 3 节。
Step 4:markdown 落稿
⚠️ 章节标记必须用 ## 语法
✅ 正确:## 一、## 二、## 三、## 反转、## 行动
❌ 错误:文章正文中写 一、二、三 作为纯文本
原因:markdown_to_html.py 将 ## xxx 转换为 <h2>,纯文本 一 会被转换为 <p>,导致 publish_lanlong.py 的 extract_shot_list() 返回 0 shots,配图注入失败。
markdown 规范
- 标题:
# [标题]
- 章节:
## [论点]
- 引用:
> [原话]
- 强调:仅关键词,每节最多 1 处
- 底部:参考资料 + 不涉玄学声明(如题材是玄学/命理类)
双文件模式(必须)
⚠️ markdown_to_html.py 会把所有 ## 都当 H2 处理——包括大纲和参考资料。
拆分两份 markdown:
公众号-[标题]-body.md:仅含 7 节正文(转 HTML 用)
公众号-[标题].md:body.md + 头部元信息 + 大纲 + 尾部参考资料(用户审稿用)
import re
md = open(full_md, encoding="utf-8").read()
body = re.sub(r"## 大纲\n[\s\S]*?(?=## 一、)", "", md)
body = re.sub(r"\n## 参考资料[\s\S]*$", "", body)
open(body_md, "w", encoding="utf-8").write(body)
只对 body 跑转码:python3 scripts/markdown_to_html.py body.md out.html
Step 5:HTML 转码
转换规则:
| markdown | HTML |
|---|
# 标题 | (不写入 HTML,标题传给 draft/add 的 title 字段) |
## 章节 | <h2 style="...">(样式A H2 规范,见 zhili-style.md) |
**重点** | <strong style="color:#e63946;">重点</strong> |
> 引用 | <blockquote style="..."> |
| 普通段落 | <p style="margin:0 0 16px 0;line-height:1.6;"> |
HTML 拼接规范:
blocks = [
'<p style="...">第一段</p>',
'<p style="...">第二段</p>',
]
html_content = ''.join(blocks)
验证:
grep -c '^$' /tmp/article.html
grep -n '\*\*' /tmp/article.html
Step 6:renwei 自检全文
⚠️ 从零写 5000 字 vs 用户给原文让 AI 改:前者清单扫全文,后者只扫动过的句子。
必跑:python3 scripts/post_edit_check.py /tmp/article-body.md
检查项(详见 references/post-edit-checklist.md):
命中率 ≥ 3 → 先打回重写,不要一边改一边扫。
Step 7:配图
封面图(zhili-illustration):
- 尺寸 900×540(微信编辑器推荐)
- 走
zhililong/scripts/cover_pil.py 或 xiaohu-ip-studio 生成底图
正文配图(zhili-illustration):
- 读取 HTML,按
## H2 章节提取 shot list(最多 5 张)
- 调用
xiaohu-ip-studio + mmx-cli 生成图片
- 按
zhili-illustration/references/html-image-injection.md 规范注入 HTML
Step 8:一键推送草稿
python3 scripts/publish_lanlong.py \
--title "文章标题" \
--author "刘生" \
--digest "文章摘要(≤54字节)" \
--html /tmp/article.html \
--cover /tmp/cover.png
python3 scripts/publish_lanlong.py ... --skip-illustration --skip-cover
python3 scripts/publish_lanlong.py ... --delete-first <old_draft_id>
全流程 5 步:配图生成 → 配图上传 mmbiz → 注入 HTML → 封面上传 → 创建草稿
⚠️ WeChat API 关键教训
| 症状 | 根因 | 解决 |
|---|
errcode 40007 + invalid media_id | thumb_media_id 来自 media/upload(临时素材) | 改用 material/add_material?type=image |
| 草稿图片显示 400 | mmbiz URL 截断,缺 ?from=appmsg 后缀 | 用完整 mmbiz URL(157-163字符) |
errcode 40007 + media_id missing | ensure_ascii=True 导致中文被 \uXXXX 转义 | json.dumps(payload, ensure_ascii=False).encode("utf-8") |
Step 9:交付格式
每次产出必须给:
# [文章标题]
**字数**:[N] 中文字符(含标点 [M])
**结构**:[5 节 + 1 反转 + 1 行动]
**自检**:✅ [通过项]
## 大纲
1. ...
**markdown 路径**:`/path/to/公众号-[标题].md`
**HTML 路径**:`/tmp/[标题].html`
**草稿 media_id**:(仅当 Step 8 执行后出现)
凭证配置
凭证在 references/config.md,不输出到对话。
已知限制
| 功能 | 状态 | 解决 |
|---|
| execute_code sandbox 破坏含中文 URL 的 HTML | sandbox 替换含敏感词的整行字符串 | 用 terminal Python 而非 execute_code |
publish_lanlong.py 内置所有 WeChat API 细节 | — | 优先用脚本,不要手搓 inline Python |