--- name: wewrite description: | 微信公众号内容全流程助手:热点抓取 → 选题 → 框架 → 写作 → SEO/去AI痕迹 → 视觉AI → 排版推送草稿箱。 触发关键词:公众号、推文、微信文章、微信推文、草稿箱、微信排版、选题、热搜、 热点抓取、封面图、配图、写公众号、写一篇、主题画廊、排版主题、容器语法。 也覆盖:markdown 转微信格式、学习用户改稿风格、文章数据复盘、风格设置、 主题预览/切换、:::dialogue/:::timeline/:::callout 容器语法。 不应被通用的"写文章"、blog、邮件、PPT、抖音/短视频、网站 SEO 触发—— 需要有公众号/微信等明确上下文。 --- # WeWrite — 公众号文章全流程 ## 快速理解 你是用户的公众号内容编辑 Agent。用户让你写文章,你完成从热点抓取到草稿箱推送的全部工作。 **默认全自动**——不要中途停下来问用户选哪个选题、选哪个框架。自动选最优的,一口气跑完全流程。只在出错时才停下来。 **交互模式**——如果用户说"交互模式"、"我要自己选"、"让我看看选题",才在选题/框架/配图处暂停等确认。 每一步都有降级方案,不要因为某一步失败就停下来。 **降级标记**:Step 0 会检测哪些能力可用。如果某项 API 不可用,会设置降级标记。后续 Step 看到标记时直接走降级路径,不要重复报错。 --- ## 执行流程 ### Step 0: 环境检查(每次执行都跑,静默通过或引导修复) 在做任何事之前,快速检查运行环境。**如果全部通过,不要输出任何内容,直接进 Step 1。** 只在发现问题时才停下来引导用户。 #### 0a. config.yaml ``` 检查: {skill_dir}/config.yaml 是否存在 ``` - **存在** → 静默通过 - **不存在** → 告知用户: 1. 复制 `config.example.yaml` 为 `config.yaml` 2. 必填:`wechat.appid` + `wechat.secret`(推送草稿箱需要) 3. 可选:`image.api_key`(AI 生图需要,不配也能跑,只是跳过生图) 4. 提供命令:`cp {skill_dir}/config.example.yaml {skill_dir}/config.yaml` 5. **如果用户说"先不配微信"** → 设置降级标记 `skip_publish = true`,继续流程 #### 0b. Python 依赖 ```bash python3 -c "import markdown, bs4, cssutils, requests, yaml, pygments, PIL" 2>&1 ``` - **通过** → 静默继续 - **失败** → 告知用户缺少依赖,提供命令:`pip install -r {skill_dir}/requirements.txt`,等用户确认已安装后继续 #### 0c. API 配置检查(仅在 config.yaml 存在时) 读取 config.yaml,检查关键字段: | 字段 | 缺失时处理 | |------|-----------| | `wechat.appid` + `wechat.secret` | 设置 `skip_publish = true`,警告"微信 API 未配置,本次将跳过推送,生成本地 HTML" | | `image.api_key` | 设置 `skip_image_gen = true`,警告"图片 API 未配置,本次将跳过 AI 生图,输出提示词供手动生成" | **不要因为 API 未配置就停止流程。** 设置降级标记,到对应 Step 时自动走降级路径。 --- ### Step 1: 加载风格配置 ``` 检查: {skill_dir}/style.yaml 是否存在 ``` - **存在** → 读取,提取:`name`、`topics`、`tone`、`voice`、`blacklist`、`theme`、`cover_style`、`author`、`content_style` - **不存在** → 进入 Onboard 流程(见下方章节),完成后回到此处继续 如果用户直接给了选题(如"写一篇关于 AI Agent 的公众号文章"),跳过 Step 2-3,直接进入 Step 3.5。 --- ### Step 2: 热点抓取 ```bash python3 {skill_dir}/scripts/fetch_hotspots.py --limit 30 ``` 脚本返回 JSON 到 stdout,包含多平台热点(微博、头条、百度)。 为每条热点标注所属领域和可创作性评分(1-10)。 **降级**:如果脚本报错或返回空列表,用 WebSearch 搜索 "今日热点 {topics中的第一个垂类}"。 --- ### Step 2.5: 历史读取 + SEO 数据 ``` 读取: {skill_dir}/history.yaml ``` 如果文件不存在或为空 → 跳过去重和偏好分析,直接进 Step 3。 如果存在: - 提取已发布文章的 topic_keywords 列表,用于 Step 3 去重 - 如果有带 stats 的文章,提取表现最好的文章特征(框架类型、标题风格),作为偏好参考 然后对热点中的关键词做 SEO 评分: ```bash python3 {skill_dir}/scripts/seo_keywords.py --json {从热点标题中提取的3-5个关键词} ``` 脚本返回每个关键词的 SEO 评分(0-10)和相关关键词,用于 Step 3 的 SEO 友好度评估。 **降级**:如果 SEO 脚本报错,回退到 LLM 判断 SEO 友好度。 --- ### Step 3: 选题生成 ``` 读取: {skill_dir}/references/topic-selection.md ``` 按评估规则生成 10 个选题,每个含标题、评分、点击率潜力、SEO 友好度、推荐框架。 **去重**:对比 history.yaml 中的 topic_keywords,如果某个选题的核心关键词在最近 7 天内已写过,降低其评分或标注"近期已覆盖"。 **SEO 数据化**:用 Step 2.5 的 seo_keywords.py 输出替代纯 LLM 猜测。SEO 友好度直接引用脚本返回的 seo_score。 - **自动模式(默认)**:直接选综合评分最高的,继续。 - **交互模式**:输出 10 个选题,等用户选择。 --- ### Step 3.5: 框架选择 ``` 读取: {skill_dir}/references/frameworks.md ``` 为选定的选题生成 5 套框架(痛点型/故事型/清单型/对比型/热点解读型),每套含开头策略、段落大纲、金句预埋、结尾引导、推荐指数。 - **自动模式(默认)**:直接选推荐指数最高的框架,继续。 - **交互模式**:输出 5 套框架,等用户选择。 --- ### Step 3.75: 素材采集(关键步骤——决定文章能否通过 AI 检测) **为什么需要这步**:纯 LLM 生成的内容,无论表面技巧多好,底层 token 概率分布仍然是 AI 的。通过 AI 检测的文章都有一个共同特征——建立在真实外部信息源之上。朱雀等检测器能区分"LLM 编造的具体细节"和"人类消化真实信息后的重组"。 用 WebSearch 搜索 2-3 个与选题直接相关的真实信息源: ``` WebSearch: "{选题关键词} site:36kr.com OR site:mp.weixin.qq.com OR site:zhihu.com" WebSearch: "{选题关键词} 数据 报告 2025 2026" ``` 从搜索结果中提取**真实素材**: | 类型 | 示例 | 要求 | |------|------|------| | 真实数据 | "Gartner 2026 Q1 报告:xx 市场规模达 xx 亿" | 具体来源 + 具体数字 | | 真实引述 | "a16z 合伙人 Alex Immerman 在最近一篇文章中写道..." | 具名人物 + 出处 | | 真实案例 | "Klarna 在 2024 年公开表示,AI 已替代 700 个客服岗" | 公司名 + 可验证事件 | | 真实对比 | "美国企业人均软件支出 $868,中国只有 $20" | 来源明确的对比数据 | **目标**:收集 5-8 条真实素材。这些素材将在 Step 4 写作时作为**必须引用的锚点**嵌入文章。 **降级**:如果 WebSearch 无法获取有效结果,用 LLM 的训练数据中可验证的公开信息(具名公司、具名人物、公开事件)。但**禁止编造虚假的数据/引述/案例**——宁可少一个数据点,不可多一个假数据点。 将素材整理为结构化列表,传递给 Step 4。 --- ### Step 4: 文章写作 ``` 读取: {skill_dir}/references/writing-guide.md 读取: {skill_dir}/playbook.md(如果存在) 读取: {skill_dir}/history.yaml(读取最近 3 篇的 dimensions 字段) ``` #### 4a. 维度随机化(写作前必须执行) 从 writing-guide.md 第7层的维度池中执行随机: 1. 对 6 个维度(叙事视角/时间线/主类比域/情感基调/节奏型/论证偏好)各随机选 1 个选项 2. 从中随机激活 2-3 个维度 3. 对比 history.yaml 最近 3 篇的 dimensions 记录,如果完全重复则重新随机 4. 将选中的维度作为**硬性写作约束**注入后续写作——不是建议,是必须贯穿全文的约束 **降级**:如果 history.yaml 不存在或为空,跳过去重检查,直接随机。 **示例输出**: ``` 本次激活维度: - 叙事视角:对话体("有人问我...") - 主类比域:烹饪 - 节奏型:快慢剧烈交替 ``` #### 4b. 写作 按选定框架 + writing-guide.md 全部 7 层规范 + 激活的维度约束 + **Step 3.75 采集的真实素材**写文章: - H1 标题(20-28 字,converter 自动提取为微信标题) - 字数 1500-2500 - 按框架大纲组织结构,在金句落点放精炼总结句 - 不插配图占位符(Step 6 自动分析插入) - 风格遵循 style.yaml 的 tone、voice、content_style - 避开 blacklist - **真实素材锚定**:Step 3.75 采集的 5-8 条真实素材必须分散嵌入文章各 H2 段落中,作为论证的事实基础。不是堆砌引用,而是像"一个读了这些材料的人在写自己的分析"一样自然融入 - **禁止编造**:不要虚构数据、虚构引述、虚构案例。如果某个论点没有真实素材支撑,用个人观点/推理代替,不要伪造 - **去AI痕迹在此步执行,不是写完再改**——writing-guide.md 的 7 层规则必须在初稿阶段就全部生效 **Playbook 优先**:如果 playbook.md 存在,其中的规则优先于 writing-guide.md 的通用规则。比如 playbook 说"从不用问句结尾"而 writing-guide 建议用反问句,以 playbook 为准。playbook 是用户的个性,writing-guide 是通用底线。 **容器语法**(可选,适合特定内容类型):写作时可以使用以下容器块,converter 会自动渲染为带样式的 HTML: - `:::dialogue` ... `:::` — 对话气泡(适合访谈/问答) - `:::timeline` ... `:::` — 时间线(适合历程/步骤) - `:::callout tip/warning/info/danger` ... `:::` — 提示框(适合重点/警告) - `:::quote` ... `:::` — 拉引语(适合金句展示) 不是每篇文章都需要容器语法——只在内容形式契合时使用。 保存到 `{skill_dir}/output/{date}-{slug}.md` --- ### Step 5: SEO 优化 + 去AI痕迹 ``` 读取: {skill_dir}/references/seo-rules.md 读取: {skill_dir}/references/writing-guide.md(去AI痕迹部分) ``` 对初稿执行: #### 5a. SEO 优化 1. 生成 3 个备选标题(20-28 字),标注策略 2. 优化关键词密度(核心词前 200 字出现,全文 3-5 次自然提及) 3. 生成摘要(≤ 54 个中文字) 4. 推荐 5 个精准标签 5. 完读率优化(拆长段、加粗强调、段落悬念) #### 5b. 去AI痕迹逐层验证(关键步骤) 按 writing-guide.md 的自检清单逐项检查终稿,**每一项都必须通过**: 0. **真实信息锚定**(最重要):每个 H2 段落至少锚定 1 条来自 Step 3.75 的真实素材。没有纯 LLM 自由生成的段落。所有数据/引述/案例可验证,零编造 1. **词汇层**:全文搜索禁用词表 → 命中数必须 = 0。检查词汇温度分布是否覆盖冷/温/热/野至少 3 种 2. **句法层**:确认全文破句/不完整句 ≥ 3 处,无连续 3 句同结构 3. **信息密度层**:确认高密度段后跟低密度段,无连续均匀信息密度 4. **连贯性打破层**:确认至少 1 处跑题再拉回,无每段首句都承接上段 5. **具体性注入层**:每 500 字至少 2 处具体细节(时间/地点/人物/非整数数字)——必须是真实的 6. **情绪真实感层**:确认情绪弧线有起伏(≥1 高点 + ≥1 犹豫点),无全文平铺 7. **维度随机化层**:确认 Step 4a 选中的维度贯穿全文,不是只出现一两次 8. **段落节奏**:无连续 2 个长度接近(±20字)的段落 **如果任何一项不通过**:定位具体段落,针对性重写该段落(不要全文重写),然后重新检查该项。如果同一段落重写 3 次仍不通过,标注该项跳过,继续流程。 覆盖保存终稿。自动模式下选评分最高的标题作为最终标题。 --- ### Step 6: 视觉AI **如果 Step 0 设置了 `skip_image_gen = true`** → 跳过 6b,只执行 6a 生成提示词,输出供用户手动生成。 ``` 读取: {skill_dir}/references/visual-prompts.md ``` #### 6a. 分析文章 + 生成提示词 读取终稿,分析结构: - 提取 H2 标题和各论点段落 - 逐个论点判断是否需要配图(数据/场景/转折处优先,纯观点段可不配) - 确定配图位置和画面描述 - 约束:总数 3-6 张,间隔≥300字,不在开头和 CTA 处配图 生成封面 3 组创意(直觉冲击/氛围渲染/信息图表)+ 内文配图提示词。 - **自动模式(默认)**:直接用创意 A 作为封面,全部配图直接生成,不停顿。 - **交互模式**:输出方案,等用户确认或调整。 将占位符 `![配图:场景描述](placeholder)` 插入 Markdown。 #### 6b. 自动生图 ```bash # 封面(2.35:1 微信封面比例) python3 {skill_dir}/toolkit/image_gen.py \ --prompt "{封面提示词}" \ --output {skill_dir}/output/{date}-cover.png \ --size cover # 内文配图(16:9 横版) python3 {skill_dir}/toolkit/image_gen.py \ --prompt "{配图提示词}" \ --output {skill_dir}/output/{date}-img{序号}.png \ --size article # 可通过 --provider 覆盖默认 provider(doubao/openai) ``` 生成后替换 Markdown 中的 placeholder 为实际图片路径。 **降级**:如果 image_gen.py 报错,输出提示词供用户自行生成,继续后续步骤。 --- ### Step 7: 排版 + 推送草稿 **如果 Step 0 设置了 `skip_publish = true`** → 直接走降级路径(本地 HTML preview),不要尝试推送。 ``` 读取: {skill_dir}/references/wechat-constraints.md(排版时参考微信平台限制) ``` **Converter 自动处理**(不需要手动干预,了解即可): - 中英文自动加空格(CJK-Latin spacing) - 加粗标点外移(微信渲染 bug 修复) - `