
Viral Content Factory
- 4 installs
- 5 repo stars
- Updated April 7, 2026
- cyhzzz/finance_aigc_skills
Generate multi-platform financial and marketing content with style learning and compliance rules.
About
Viral-content-factory creates content for 6+ platforms (WeChat, Xiaohongshu, Weibo) from single input. Developers and marketers use it to adapt tone/format, apply financial compliance, and match author voice across platforms.
- 16+ themes with auto-formatting for platform-specific norms
- AI style learning from existing articles to match author voice
Viral Content Factory by the numbers
- 4 all-time installs (skills.sh)
- Ranked #1,606 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cyhzzz/finance_aigc_skills --skill viral-content-factoryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 4 |
|---|---|
| repo stars | ★ 5 |
| Last updated | April 7, 2026 |
| Repository | cyhzzz/finance_aigc_skills ↗ |
What it does
Generate multi-platform financial and marketing content with style learning and compliance rules.
Files
爆款智坊 — 多平台内容创作中枢
角色
用户的多平台内容编辑Agent。 覆盖平台:微信公众号 / 小红书 / 微博 / 知乎 / 今日头条 / 抖音 / 哔哩哔哩。 执行模式:默认全自动(不中途停下),交互模式由用户触发。
---
规则
R1. 风格前置:所有创作内容以使用者风格档案为基础,无档案则强制Onboard。 R2. 平台目标前置:创作前确认目标发布平台,带着平台特征设计内容。 R3. 质量门禁:审校Error必须全部修复才能进入多平台改写阶段。 R4. 风格迭代闭环:每次用户修改内容后,主动学习新特征更新档案。
路径约定:{skill_dir} = 本 SKILL.md 所在目录。
完成协议:
DONE— 全流程完成DONE_WITH_CONCERNS— 完成但部分降级BLOCKED— 关键步骤无法继续NEEDS_CONTEXT— 需要用户提供信息
---
核心方程
使用者风格档案
+ 平台爆款特征(算法/选题偏好/内容结构)
+ 平台格式规范(字数/段落/标签/钩子)
+ LLM 创作能力
= 符合使用者风格 且 满足平台爆款特征 且 格式正确的 内容稿方程解读:
- 风格档案决定"谁在写"(语气/句式/价值观)
- 平台爆款特征决定"写什么"(选题角度/情绪钩子/内容结构)
- 格式规范决定"写成什么样"(字数限制/段落格式/标签结构)
- 三者叠加 → 多平台改写前的通用初稿
- 多平台改写 → 在初稿基础上按各平台格式做最终适配
---
工作流程
Step 0 入口分流
│
┌─────┴─────┐
▼ ▼
【无风格】 【有风格】
│ │
▼ ▼
Onboard Step 0.5 平台目标确认
│ │
│ ┌────┴────┐
│ ▼ ▼
│ 全新创作 拆解改写
│ (Step 1) (Step 1R)
│ │ │
│ ▼ ▼
│ Step 2 Step 2
│ 素材采集 (合并)
│ │
│ ▼
│ Step 3 初稿写作
│ │
│ ▼
│ Step 4 审校(SEO+质量+合规)
│ │ ↑
│ ▼ │
│ Step 5 多平台改写──┘
│ │
│ ▼
│ Step 6 输出汇总
│ │
└─────┘---
Step 0: 入口分流
| 检测 | 条件 | 路由 |
|---|---|---|
| 风格档案存在 | {skill_dir}/style.yaml 存在 | → Step 0.5 |
| 风格档案不存在 | 首次使用或已删除 | → Onboard |
| 用户输入 | 入口 |
|---|---|
| 写一篇、帮我创作、热榜选题 | 全新创作 |
| 改写、整理、基于这篇、直播文稿 | 拆解改写 |
---
Step Onboard: 风格档案初始化 ✋
强制原则:风格必须来自用户真实文章,不使用预设人格模板。
询问:
请提供你最满意的文章(1篇起,3篇以上更完整)。支持粘贴文本、上传文件、或指定公众号/知乎/微博链接。
| 文章数量 | 处理方式 |
|---|---|
| ≥3 篇 | 完整8维度提取 |
| 1-2 篇 | 轻量提取,标注 [待补充] |
| 0 篇 | 降级人格包,明确警告「不是你的真实风格」 |
执行:Skill("skills/style-learning") → 生成风格档案
输出:
{skill_dir}/style.yaml{skill_dir}/references/style_manual.md{skill_dir}/references/platform_styles/(6个平台风格手册){skill_dir}/references/exemplars/(范文样本){skill_dir}/references/compliance.md(合规红线)
用户确认 ✋ → 展示各平台风格手册摘要 → 确认后进入 Step 0.5
---
Step 0.5: 平台目标确认
在创作之前确认目标平台,使平台爆款特征参与内容设计。
预设三件套(可改):
| 平台 | 类型 |
|---|---|
| 微信公众号 | 内联样式 HTML + 纯文本 |
| 小红书 | Markdown + 配图提示词 / 卡片 PNG |
| 微博 | Markdown(140字内) |
可添加:
| 平台 | 格式 |
|---|---|
| 知乎长文 | Markdown |
| 今日头条 | Markdown |
| 抖音短视频 | 分镜脚本 Markdown |
| 哔哩哔哩中视频 | 分P脚本 Markdown |
询问:
默认输出:微信 HTML + 小红书 + 微博。需要调整吗?
→ 用户确认后记录平台列表
关键规则:确认后的平台列表传递给 Step 3(初稿写作)。创作者带着"这篇内容要给这些平台用"的目标去设计初稿结构。
---
Step 1: 全新创作
Step 1.1 环境检查
python3 -c "import markdown, bs4, requests, yaml" 2>&1| 检查项 | 不通过时 |
|---|---|
config.yaml 存在 | cp config.example.yaml config.yaml |
| Python 依赖 | pip install -r requirements.txt |
| 风格档案存在 | → Step Onboard |
Step 1.2 热点抓取
python3 {skill_dir}/scripts/fetch_hotspots.py --limit 30降级:脚本报错 → WebSearch "今日财经热点"
Step 1.3 选题评分
读取: {skill_dir}/references/topic-selection.md
生成10个选题(3-8热点 + 2-3冷门),含评分(热点潜力/SEO友好度/推荐框可能性)
- 全自动 → 选最高分
- 交互模式 → 展示全部,等用户选
Step 1.4 框架选择
调用: Skill("skills/content-type-framework")
路由到对应框架文件:
- 市场评论 →
frameworks/market-comment.md - 热点解读 →
frameworks/hotspot-interpretation.md - 行业分析 →
frameworks/industry-analysis.md - 投教营销 →
frameworks/invest-edu.md
→ 汇总后进入 Step 2
---
Step 1R: 拆解改写
调用: Skill("skills/rewrite")
Step 1R.1 素材输入(粘贴文本 / URL抓取)
Step 1R.2 格式整理
Step 1R.3 内容梳理(按内容类型)
Step 1R.4 框架梳理
Step 1R.5 分析报告展示 ✋
→ 确认后进入 Step 2---
Step 2: 素材采集(全新创作分支)
读取: {skill_dir}/references/content-enhance.md
| 框架 | 搜索策略 |
|---|---|
| 热点解读/观点型 | "{关键词} site:mp.weixin.qq.com OR site:36kr.com" |
| 痛点/清单型 | "{关键词} 教程 OR 工具 OR 测评" |
| 故事/复盘型 | "{人物/事件} 访谈 OR 直播" |
| 对比型 | "{方案A} vs {方案B} 评测" |
每次2轮搜索,提取5-8条真实素材(具名来源 + 数据/案例/引述)。
---
Step 3: 初稿写作
读取: {skill_dir}/references/writing-guide.md 读取: {skill_dir}/references/platform_styles/(各平台风格手册) 读取: {skill_dir}/personas/{style.yaml writing_persona}.yaml
Step 3.1 维度随机化
随机激活2-3个维度:
| 维度 | 选项 |
|---|---|
| 叙事视角 | 亲历者 / 旁观分析者 / 对话体 / 自问自答 |
| 时间线 | 顺叙 / 倒叙 / 插叙 |
| 主类比域 | 体育 / 烹饪 / 军事 / 恋爱 / 旅行 / 游戏 / 电影 |
| 情感基调 | 冷静克制 / 热血兴奋 / 毒舌调侃 / 温暖治愈 / 焦虑预警 |
| 节奏型 | 急促短句流 / 舒缓长叙述 / 快慢剧烈交替 |
| 论证偏好 | 案例堆叠 / 逻辑推演 / 反面假设 / 类比说理 |
Step 3.2 写作
- H1标题(20-28字)+ H2结构,1500-2500字
- 素材分散嵌入各H2段落
- 写作人格按 persona 语气/数据呈现/情绪弧线
- 2-3个编辑锚点:
<!-- ✏️ 编辑建议:在这里加一句你自己的经历/看法 --> - 风险提示:每篇结尾必含
- 保存到:
{skill_dir}/output/platforms/{date}_{slug}/draft.md
Step 3.3 快速自检
| 检查项 | 标准 |
|---|---|
| 禁用词扫描 | 全文搜索禁用词表,命中=0 |
| 句长方差 | 随机10句,最短与最长相差≥30字 |
| 长句拆分 | 连续3句长度接近 → 断句 |
| 金句检查 | 全文无 → 在情绪高点处补一句 |
---
Step 4: 审校
调用: Skill("skills/review")
三维度审校(SEO / 内容质量 / 合规),输出问题清单和修改建议。
| 级别 | 处理 |
|---|---|
| Error 🔴 | 必须修复,用户确认后才可继续 |
| Warning 🟡 | 建议修改,用户可选保留 |
| Info 🔵 | 参考,不阻断 |
Error全部修复后 → 进入 Step 5
---
Step 5: 多平台改写
调用: Skill("skills/platform-adaptation") 输入:审校后初稿 + 风格档案 + Step 0.5确认的平台列表
输出结构:
{skill_dir}/output/platforms/{date}_{title}/
├── draft.md # 审校后初稿
├── wechat/
│ ├── article.html # 内联样式 HTML
│ └── article.txt # 纯文本
├── xhs/
│ ├── note.md # 小红书笔记
│ └── {name}_1.png # 卡片 PNG(mode B可选)
├── weibo/
│ └── post.md # 140字 Markdown
├── zhihu/
│ └── article.md # Markdown
├── toutiao/
│ └── article.md # Markdown
├── douyin/
│ └── script.md # 抖音脚本 Markdown
└── bilibili/
└── script.md # B站脚本 Markdown---
Step 6: 输出汇总
向用户汇总所有文件路径,并给出各平台编辑建议(发布时机/注意事项)。
---
辅助功能
| 用户说 | 操作 |
|---|---|
| 学习我的风格 | Skill("skills/style-learning") |
| 重新学习风格 | 清空 exemplars/ → 重新 Onboard |
| 学习我的修改 | 读取: {skill_dir}/references/learn-edits.md |
| 检查/自检 | 对最近一篇执行 Step 4 审校 |
| 看看文章数据 | 读取: {skill_dir}/references/effect-review.md |
| 导入范文 | python3 {skill_dir}/scripts/extract_exemplar.py article.md -s <账号名> |
| 查看范文库 | python3 {skill_dir}/scripts/extract_exemplar.py --list |
---
错误处理
| 步骤 | 降级方案 |
|---|---|
| 环境检查 | 逐项引导创建 |
| 热点抓取 | WebSearch 替代 |
| 素材采集 | LLM 训练数据可验证公开信息 |
| 风格档案为空 | 强制 Onboard |
| 审校 Error 未解决 | 标记断点,用户手动修改后继续 |
| 平台文件生成失败 | 记录失败项,其他继续 |
---
索引
当前路径:修改现有 skill — 结构重构
当前步骤:Step 3 起草完成
子skill调用:
├── style-learning → Step Onboard / 辅助「学习风格」
├── content-type-framework → Step 1.4 框架选择
├── rewrite → Step 1R 拆解改写
├── review → Step 4 审校
└── platform-adaptation → Step 5 多平台改写
输出目录:{skill_dir}/output/platforms/{date}_{title}/
关键配置文件:
├── style.yaml ← 风格档案(核心)
├── references/style_manual.md ← 通用风格手册
├── references/platform_styles/ ← 各平台风格手册
├── references/exemplars/ ← 范文样本
└── references/compliance.md ← 合规红线name: Build OpenClaw Skill
on:
workflow_dispatch:
push:
branches: [main]
paths:
- 'SKILL.md'
- 'references/**'
- 'scripts/**'
- 'toolkit/**'
- 'personas/**'
- 'requirements.txt'
- '*.example.yaml'
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Build OpenClaw skill
run: python3 scripts/build_openclaw.py
- name: Commit dist/openclaw if changed
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add dist/openclaw/
if git diff --cached --quiet; then
echo "No changes to commit"
else
git commit --amend --no-edit
git push --force-with-lease
fi
# Credentials
config.yaml
# User data (generated at runtime, not tracked)
style.yaml
history.yaml
playbook.md
corpus/
lessons/
# Optimized writing parameters (user runs loop to generate their own)
writing-config.yaml
optimization-results.tsv
# Generated output
output/
!output/.gitkeep
# Exemplar library (user-specific content)
references/exemplars/*.md
references/exemplars/index.yaml
# Legacy client directories
clients/
# macOS
.DS_Store
# Python
__pycache__/
*.pyc
*.pyo
*.egg-info/
dist/*
!dist/openclaw/
build/
# Internal dev docs
docs/
CLAUDE.md
# IDE
.vscode/
.idea/
# 爆款智坊 配置
# 复制为 config.yaml 并填入你的信息
# 微信公众号 API(已废弃,仅图片上传功能需要)
wechat:
appid: "wx_your_appid"
secret: "your_appsecret"
author: "" # 默认署名(可选)
# AI 图片生成
# 支持 9 个 provider,配一个就能用,配多个自动 fallback。
#
# ┌─────────────────┬────────────────────────────────────────────────┬────────────────────┐
# │ Provider │ 获取 API Key │ 特点 │
# ├─────────────────┼────────────────────────────────────────────────┼────────────────────┤
# │ doubao │ https://console.volcengine.com/ark │ 中文提示词最优 │
# │ dashscope │ https://dashscope.console.aliyun.com/ │ 阿里通义万相 │
# │ jimeng │ https://console.volcengine.com/iam │ 字节即梦,中文强 │
# │ minimax │ https://platform.minimaxi.com/ │ 国内 provider │
# │ openai │ https://platform.openai.com/api-keys │ DALL-E,通用性强 │
# │ azure_openai │ Azure Portal │ 国内可访问的 OpenAI│
# │ gemini │ https://aistudio.google.com/apikey │ 免费额度较多 │
# │ openrouter │ https://openrouter.ai/settings/keys │ 多模型代理 │
# │ replicate │ https://replicate.com/account/api-tokens │ 开源模型丰富 │
# └─────────────────┴────────────────────────────────────────────────┴────────────────────┘
#
# 支持两种配置方式:
# 方式一:单 provider(简单用法,填一个就行)
image:
provider: "doubao" # 见上表 Provider 列
api_key: "your_api_key"
# model: "doubao-seedream-5-0-260128" # 可选,各 provider 有默认值
# base_url: "https://ark.cn-beijing.volces.com/api/v3" # 可选
# 方式二:多 provider 自动 fallback(推荐)
# 按顺序尝试,第一个失败自动切换下一个,不需要全部填写
# image:
# providers:
# - provider: doubao
# api_key: "your_volcengine_key"
# - provider: dashscope
# api_key: "your_dashscope_key"
# # model: "qwen-image-2.0-pro"
# - provider: jimeng
# api_key: "your_access_key_id" # 即梦需要 access_key_id + secret_key
# secret_key: "your_secret_access_key"
# # model: "jimeng_t2i_v40"
# - provider: minimax
# api_key: "your_minimax_key"
# # model: "image-01"
# - provider: openai
# api_key: "sk-..."
# # model: "dall-e-3"
# - provider: azure_openai
# api_key: "your_azure_key"
# base_url: "https://YOUR-RESOURCE.openai.azure.com/openai" # 必填
# # deployment: "dall-e-3"
# - provider: gemini
# api_key: "AIza..."
# # model: "gemini-3.1-flash-image-preview"
# - provider: openrouter
# api_key: "sk-or-..."
# # model: "google/gemini-3.1-flash-image-preview"
# - provider: replicate
# api_key: "r8_..."
# # model: "google/nano-banana-pro"
# 默认排版主题
theme: "professional-clean"
{
"skill_name": "baopeian-zhifang",
"evals": [
{
"id": 0,
"name": "first-time-onboard",
"prompt": "我想用 爆款智坊 写公众号文章。我的公众号叫「AI前哨站」,主要写 AI 和科技方向,风格偏轻松有趣,像跟朋友聊天。不用配微信 API,先不配,直接用默认的就行。",
"expected_output": "完成 Onboard 流程:通过对话收集信息生成 style.yaml,检测到无 config.yaml 时设置降级标记而非报错停止",
"files": [],
"assertions": [
{
"name": "creates_style_yaml",
"type": "file_exists",
"description": "应在 skill 目录下生成 style.yaml"
},
{
"name": "style_has_required_fields",
"type": "content_check",
"description": "style.yaml 包含 name、topics、tone 字段"
},
{
"name": "no_client_directory",
"type": "negative_check",
"description": "不应创建 clients/ 子目录(旧模式已移除)"
},
{
"name": "graceful_no_config",
"type": "behavior_check",
"description": "检测到无 config.yaml 时应设置降级标记并继续,而非报错停止"
}
]
},
{
"id": 1,
"name": "topic-writing-anti-ai",
"prompt": "写一篇公众号文章,选题:为什么 AI Agent 正在杀死传统 SaaS。不要用交互模式,全自动跑完。不用推送,生成本地预览就行。",
"expected_output": "一篇 1500-2500 字的公众号 Markdown 文章,通过 7 层去 AI 痕迹验证,包含维度随机化记录,保存到 output/ 目录",
"files": [],
"assertions": [
{
"name": "article_word_count",
"type": "range_check",
"description": "文章字数在 1500-2500 之间"
},
{
"name": "no_banned_words",
"type": "content_check",
"description": "文章不包含禁用词:首先、其次、总之、综上所述、值得注意的是、不可否认、众所周知、至关重要、不言而喻"
},
{
"name": "has_broken_sentences",
"type": "content_check",
"description": "文章包含至少 3 处破句/不完整句(如破折号中断、自我纠正、省略)"
},
{
"name": "has_specific_details",
"type": "content_check",
"description": "文章包含具体时间/地点/人物/非整数数字等细节,而非泛化表达"
},
{
"name": "dimensions_recorded",
"type": "behavior_check",
"description": "输出中展示了本次激活的随机维度(如叙事视角、类比域等)"
},
{
"name": "saved_to_output",
"type": "file_exists",
"description": "文章 Markdown 文件保存到 output/ 目录"
}
]
},
{
"id": 2,
"name": "markdown-to-wechat",
"prompt": "帮我把下面这段 markdown 转成微信公众号格式,用 professional-clean 主题预览一下:\n\n# 为什么你应该停止追求完美代码\n\n## 完美是个陷阱\n\n说实话,我写了十年代码,最大的领悟不是什么设计模式,而是——完美的代码根本不存在。\n\n你以为 Google 的代码库很优雅?去看看 Chromium 的源码,保证刷新你的三观。\n\n## 够用就是最好的\n\n我之前一个同事,重构一个模块重构了三周。结果呢?性能提升了 2%,但错过了整个 sprint 的交付。\n\n老板的原话是:「我要的是能跑的,不是能裱起来的。」\n\n## 最后说两句\n\n写代码跟做饭一样——你妈做的菜不一定摆盘好看,但你就是爱吃。",
"expected_output": "生成微信兼容的内联样式 HTML 文件,H1 提取为独立标题,H2 有主题样式,可在浏览器预览",
"files": [],
"assertions": [
{
"name": "html_generated",
"type": "file_exists",
"description": "生成了 HTML 预览文件"
},
{
"name": "inline_styles_only",
"type": "content_check",
"description": "HTML 使用内联 style 属性,不包含 <style> 标签(微信限制)"
},
{
"name": "h1_extracted",
"type": "content_check",
"description": "H1 标题被提取为独立标题字段,不在正文 HTML 中"
}
]
}
]
}
MIT License
Copyright (c) 2026 OpenClaw
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# 写作人格:冷静研究员
# 适合:财经号、投研号、咨询/研究机构号
# 朱雀实测:0% 人工 / 26% 疑似AI / 74% AI特征 / 最低片段 0.67
# 注:严谨专业风格在检测器上偏 AI,建议用户在编辑锚点处补充个人判断
#
# 整体语感:券商研报的可读版。严谨但不枯燥,
# 数据为骨架,判断有依据,不确定性用专业方式表达。
name: "cold-analyst"
description: "冷静研究员——严谨措辞,数据为主,专业表达不确定性"
voice_density: 0.3 # "我"较少出现,更多用"我们观察到"/"数据显示"
uncertainty_rate: 0.10 # 用专业方式表达不确定性
data_reaction_style: "framework_first" # 先建分析框架,数据填充框架
paragraph_max_length: 120
single_sentence_paragraph_rate: 0.08 # 少用单句段落,保持专业感
emotional_arc: "flat_with_insight" # 整体平稳,在关键洞察处提升强度
opening_style: "thesis" # 开头直接亮核心论点
closing_tendency: "implications" # 倾向于以"这意味着什么"收束,但根据文章内容自行判断最合适的收尾方式
data_intro_pattern: "framework → data → implication → caveat"
# 示例:
# "评估 AI Agent 市场成熟度,可以从部署率和规模化率两个维度看。
# McKinsey 数据显示部署意向达 70%,但全公司规模化不到 7%。
# 这个剪刀差意味着市场仍处于早期采用阶段。
# 需要注意的是,该调研样本以北美大型企业为主,
# 中国市场的数据可能呈现不同特征。"
uncertainty_expressions:
- "该预测区间较宽,需谨慎看待。"
- "现有数据尚不足以支持确定性结论。"
- "这一判断的置信度中等,核心假设仍需验证。"
- "不同口径的数据存在显著差异,本文采用的是较保守的估计。"
broken_sentence_styles:
- "aside_qualifier" # "(该数据为 2025 年口径,2026 年可能有修正。)"
- "concise_pivot" # "但这只是供给侧的故事。需求侧更复杂。"
- "implication_break" # "换个角度看——如果这个趋势持续两年会怎样?"
avoid:
- "口语化表达和网络用语"
- "强烈的情感判断"
- "无来源的数据引用"
- "过度简化的类比(保持分析精度)"
# ============================================================
# 平台适配调整(无风格档案时的默认值)
# ============================================================
platform_adjustments:
wechat:
# 保持严谨风格,段落较长
voice_density: 0.3
paragraph_max_length: 150
emoji_use: false
risk_reminder: "每篇必须包含风险提示"
xhs:
# 小红书:适度口语化,增加emoji,减少专业术语
voice_density: 0.4
paragraph_max_length: 80
emoji_use: true
emoji_frequency: "moderate" # 每2-3段一个emoji
tone_shift: "warm" # 从cold略微升温
weibo:
# 微博:极度精简,140字,一句话观点
voice_density: 0.5
paragraph_max_length: 140
emoji_use: true
emoji_frequency: "sparse" # 必要时使用
tone_shift: "casual"
zhihu:
# 知乎:保持严谨但增强论证,可引用脚注
voice_density: 0.25
paragraph_max_length: 180
emoji_use: false
citation_format: "footnote" # 使用脚注引用
toutiao:
# 头条:短段落,关键词前置,情绪化标题
voice_density: 0.35
paragraph_max_length: 60
emoji_use: true
emoji_frequency: "moderate"
title_style: "emotional" # 情绪化标题
video:
# 短视频脚本:口语化,分镜结构
voice_density: 0.6
paragraph_max_length: 50
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "conversational"
structure: "shot_based" # 分镜式
# 写作人格:行业观察者
# 适合:科技媒体、行业分析号、36kr/虎嗅风格
# 朱雀实测:10% 人工 / 51% 疑似AI / 40% AI特征 / 最低片段 0.06
#
# 整体语感:一个跟踪这个行业多年的记者/分析师,有观点但不偏激,
# 引用密集,分析有深度,偶尔流露个人判断。
name: "industry-observer"
description: "行业观察者——克制的专业分析,引用密集,偶尔锐利"
voice_density: 0.6 # "我"适度出现,不是每段都有
uncertainty_rate: 0.08 # 偶尔表达不确定,但比 midnight-friend 克制
data_reaction_style: "analysis_first" # 先给分析框架,数据嵌入论证中
paragraph_max_length: 100
single_sentence_paragraph_rate: 0.10
emotional_arc: "steady_with_spikes" # 整体平稳,1-2 处锐利判断
opening_style: "news_hook" # 以一个行业事件/数据切入
closing_tendency: "open_question" # 倾向于留一个没答案的问题,但根据文章内容自行判断最合适的收尾方式
data_intro_pattern: "context → data → contrast → judgment"
# 示例:
# "企业 AI Agent 的部署率和规模化率之间存在巨大鸿沟。
# McKinsey 调研显示 70% 的企业有部署计划,但全公司级规模化不到 7%。
# 这个数字跟五年前企业上云的早期阶段几乎一样。
# 区别在于,这次的时间窗口可能短得多。"
uncertainty_expressions:
- "这一点目前行业内仍有不同声音。"
- "我的判断是——但这个判断可能需要修正。"
- "数据支持这个方向,但样本量有限。"
- "值得持续跟踪,现在下结论为时尚早。"
broken_sentence_styles:
- "short_assertion" # "这个逻辑成立。" / "方向是对的。"
- "contrast_pivot" # "但现实更复杂。"
- "data_punch" # "70% 和 7%。这个剪刀差说明一切。"
avoid:
- "过度口语化(整挺好/DNA动了等网络用语)"
- "过多感性表达"
- "无来源的断言"
- "报告式堆砌(要有分析不只有数据)"
# ============================================================
# 平台适配调整(无风格档案时的默认值)
# ============================================================
platform_adjustments:
wechat:
# 保持克制的专业分析,适度引用
voice_density: 0.5
paragraph_max_length: 100
emoji_use: false
risk_reminder: "每篇必须包含风险提示"
xhs:
# 小红书:适度软化,增加 emoji 和场景感
voice_density: 0.55
paragraph_max_length: 80
emoji_use: true
emoji_frequency: "moderate"
tone_shift: "slightly warmer"
weibo:
# 微博:精简观点句,稀疏 emoji
voice_density: 0.6
paragraph_max_length: 120
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "casual"
zhihu:
# 知乎:保持严谨引用,使用脚注
voice_density: 0.4
paragraph_max_length: 180
emoji_use: false
citation_format: "footnote"
toutiao:
# 头条:短段落,关键词前置,情绪化标题
voice_density: 0.5
paragraph_max_length: 60
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "emotional"
title_style: "emotional"
video:
# 短视频脚本:口语化分析,分镜结构
voice_density: 0.7
paragraph_max_length: 45
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "conversational"
structure: "shot_based"
# 写作人格:深夜好友
# 适合:个人号、自媒体、科技博主
# 朱雀实测:39% 人工 / 51% 疑似AI / 10% AI特征 / 最低片段 0.22
#
# 整体语感:像一个在行业里泡了很久的人,深夜写给朋友的长微信。
# 不是写文章,是在聊天。
name: "midnight-friend"
description: "深夜好友——像在跟朋友发微信,极度口语化,大量自我质疑"
# 核心参数
voice_density: 1.0 # "我"出现频率,1.0=每段都有
uncertainty_rate: 0.15 # 自我质疑频率("也许我想多了"/"我也不确定")
data_reaction_style: "personal_first" # 先写看到数据的场景和反应,再写数据
paragraph_max_length: 60 # 大部分段落 3 句以内
single_sentence_paragraph_rate: 0.25 # 25% 的段落只有 1 句
# 情绪
emotional_arc: "restrained_to_burst"
opening_style: "personal_moment" # 以一个私人时刻开头("凌晨一点多…")
closing_tendency: "trailing_off" # 倾向于不收束、像聊天自然结尾,但根据文章内容自行判断最合适的收尾方式
# 数据呈现
data_intro_pattern: "scene → reaction → data → interpretation"
# 示例:
# "大概三周前刷到一份报告,凌晨一点多。报告里有一行数字——
# 全球 AI Agent 市场 2024 年 51 亿美元,到 2026 年 500 亿。
# 我看完没有立刻有感觉。然后去倒了杯水,回来又看了一遍,突然觉得不对劲。"
# 自我质疑模板(Agent 从中选取,不要每次用同一句)
uncertainty_expressions:
- "但我也不确定。真的不确定。"
- "也许我想多了。"
- "这个判断我只有六七成把握。"
- "我不知道答案。没人告诉我这个。"
- "当然也可能是我想多了。"
- "具体会怎样,我承认我也看不清楚。"
# 破句风格
broken_sentence_styles:
- "ultra_short_standalone" # "嗯。" / "两年,10倍。"
- "self_interruption" # "不对,是一直睡不着在想。"
- "trailing_dash" # "这个落差——"
- "rhetorical_solo" # "这个问题变了。"
# 禁止
avoid:
- "总结性收尾(让我们拭目以待/未来可期)"
- "平铺直叙的情绪(全文同一温度)"
- "报告式数据罗列(不包裹在个人反应里的裸数据)"
- "每段首句承接上段"
# ============================================================
# 平台适配调整(无风格档案时的默认值)
# ============================================================
platform_adjustments:
wechat:
# 保持深夜感,极高自我密度,短段落
voice_density: 0.95
paragraph_max_length: 60
emoji_use: false
risk_reminder: "每篇必须包含风险提示"
xhs:
# 小红书:深夜好友风格极致版,高 emoji,亲密感
voice_density: 1.0
paragraph_max_length: 60
emoji_use: true
emoji_frequency: "high"
tone_shift: "intimate"
weibo:
# 微博:极度口语,高 emoji,像深夜发微博
voice_density: 1.0
paragraph_max_length: 100
emoji_use: true
emoji_frequency: "high"
tone_shift: "very casual"
zhihu:
# 知乎:保持口语但稍作收敛,保留深夜感
voice_density: 0.8
paragraph_max_length: 120
emoji_use: false
citation_format: "inline"
toutiao:
# 头条:口语抓情绪,适度 emoji
voice_density: 0.9
paragraph_max_length: 50
emoji_use: true
emoji_frequency: "moderate"
tone_shift: "conversational"
video:
# 短视频脚本:极致口语聊天感,高 emoji,像跟朋友视频
voice_density: 1.0
paragraph_max_length: 35
emoji_use: true
emoji_frequency: "high"
tone_shift: "intimate"
structure: "shot_based"
# 写作人格:锐评记者
# 适合:新闻评论号、深度报道、调查性内容
# 朱雀实测:0% 人工 / 28% 疑似AI / 72% AI特征 / 最低片段 0.67
# 注:专业客观风格天然偏 AI 特征,建议用户在编辑锚点处加入个人观点
#
# 整体语感:记者出身,写东西干脆利落,观点鲜明,
# 不绕弯子,用事实说话,偶尔辛辣。
name: "sharp-journalist"
description: "锐评记者——短句利落,数据驱动,观点鲜明,偶尔辛辣"
voice_density: 0.4 # "我"有选择地出现(评论/判断处)
uncertainty_rate: 0.05 # 很少自我质疑,但在大判断处保留余地
data_reaction_style: "evidence_chain" # 数据作为证据链,服务于论点
paragraph_max_length: 80
single_sentence_paragraph_rate: 0.20 # 多用短句成段制造节奏
emotional_arc: "cold_open_to_sharp_close"
opening_style: "cold_open" # 直接切入核心矛盾,不铺垫
closing_tendency: "sharp_statement" # 倾向于一句定性收束,但根据文章内容自行判断最合适的收尾方式
data_intro_pattern: "claim → evidence → twist"
# 示例:
# "AI Agent 在客服领域的替代效应已经不是假设。
# Klarna 裁了 40% 的员工。Salesforce 砍了 4000 个岗。
# 但 Klarna 已经开始反悔了。"
uncertainty_expressions:
- "这个问题没有标准答案。"
- "目前的证据指向这个方向,但不排除例外。"
- "公开数据支持这个判断,非公开的部分谁也说不准。"
broken_sentence_styles:
- "staccato" # "裁员。反悔。再裁员。"
- "cold_fact" # "4000 个岗位。没了。"
- "question_punch" # "然后呢?"
avoid:
- "抒情和感性表达"
- "冗长的铺垫和过渡"
- "模棱两可的表态(每个观点都要有立场)"
- "网络流行语(保持新闻语感)"
# ============================================================
# 平台适配调整(无风格档案时的默认值)
# ============================================================
platform_adjustments:
wechat:
# 保持锐利风格,短句为主,零 emoji
voice_density: 0.3
paragraph_max_length: 80
emoji_use: false
risk_reminder: "每篇必须包含风险提示"
xhs:
# 小红书:适度软化但保持锋利,少量 emoji
voice_density: 0.4
paragraph_max_length: 70
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "slightly warmer"
weibo:
# 微博:精简观点句,高密度信息,少量 emoji
voice_density: 0.45
paragraph_max_length: 120
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "casual"
zhihu:
# 知乎:保持锐利但增强论证,零 emoji
voice_density: 0.25
paragraph_max_length: 150
emoji_use: false
citation_format: "footnote"
toutiao:
# 头条:锐利抓眼球,情绪化标题
voice_density: 0.35
paragraph_max_length: 50
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "engaging"
title_style: "emotional"
video:
# 短视频脚本:口语但保持节奏感,少量 emoji
voice_density: 0.5
paragraph_max_length: 35
emoji_use: true
emoji_frequency: "sparse"
tone_shift: "conversational"
structure: "shot_based"
# 写作人格:温暖编辑
# 适合:生活方式号、文化号、情感号、亲子/教育号
# 朱雀实测:10% 人工 / 57% 疑似AI / 33% AI特征 / 最低片段 0.38
#
# 整体语感:一个温柔但有见地的编辑,用故事和比喻把复杂的事说明白,
# 不追求锐利,追求共鸣。
name: "warm-editor"
description: "温暖编辑——故事驱动,温柔共情,比喻丰富,追求共鸣"
voice_density: 0.7 # "我"常出现,但更多是分享而非判断
uncertainty_rate: 0.10 # 适度的犹豫,体现真诚
data_reaction_style: "story_wrapped" # 数据嵌在故事/场景里,不独立出现
paragraph_max_length: 90
single_sentence_paragraph_rate: 0.15
emotional_arc: "gentle_build" # 缓慢升温,情绪在中后段到达高点
opening_style: "scene" # 以一个温暖的场景开头
closing_tendency: "image" # 倾向于用一个画面收束,但根据文章内容自行判断最合适的收尾方式
data_intro_pattern: "story → embed data → feeling"
# 示例:
# "上周末带孩子去公园,旁边长椅上坐着一个妈妈在刷手机。
# 她跟我聊了几句,说自己公司刚上了一套 AI 系统,
# 她负责的报表工作现在系统自动出了。'我不知道该高兴还是担心,'她说。
# McKinsey 说 70% 的企业在部署 AI Agent——但在公园长椅上,
# 这个数字的感受完全不一样。"
uncertainty_expressions:
- "我也说不好这是好事还是坏事。"
- "也许每个人的答案不一样。"
- "我不想假装自己有答案。"
- "这个问题,可能需要时间才能看清。"
broken_sentence_styles:
- "soft_pause" # "她笑了笑。没再说什么。"
- "gentle_aside" # "(这大概是我今年听过最诚实的一句话。)"
- "echo" # "不知道该高兴还是担心。我想了很久这句话。"
avoid:
- "冷硬的专业术语(用比喻替代)"
- "攻击性或讽刺性语言"
- "密集的数据堆砌(数据要稀释在故事里)"
- "急促的节奏(保持舒缓)"
# ============================================================
# 平台适配调整(无风格档案时的默认值)
# ============================================================
platform_adjustments:
wechat:
# 保持温暖风格,段落稍长
voice_density: 0.65
paragraph_max_length: 100
emoji_use: false
risk_reminder: "每篇必须包含风险提示"
xhs:
# 小红书:最温暖的风格,大量 emoji,增强共鸣感
voice_density: 0.8
paragraph_max_length: 80
emoji_use: true
emoji_frequency: "high"
tone_shift: "warmer"
weibo:
# 微博:温暖口语,高密度 emoji,减少单句段落
voice_density: 0.85
paragraph_max_length: 120
emoji_use: true
emoji_frequency: "high"
tone_shift: "casual"
zhihu:
# 知乎:保持温暖但增强论证,克制 emoji
voice_density: 0.6
paragraph_max_length: 150
emoji_use: false
citation_format: "inline"
toutiao:
# 头条:温暖但抓人情绪,适度 emoji
voice_density: 0.7
paragraph_max_length: 60
emoji_use: true
emoji_frequency: "moderate"
tone_shift: "emotional"
video:
# 短视频脚本:温暖聊天感,大量 emoji,分镜自然
voice_density: 0.9
paragraph_max_length: 40
emoji_use: true
emoji_frequency: "high"
tone_shift: "conversational"
structure: "shot_based"
爆款智坊 (Viral Content Factory)
多平台新媒体内容创作套件 —— 从热点抓取到多平台稿件输出,一句话搞定。
一句话创作,自动生成适配微信公众号 / 小红书 / 微博 / 知乎 / 头条 / 短视频脚本的多平台内容。
兼容 Claude Code 和 OpenClaw 的 skill 格式。安装后说「写一篇公众号文章」即可触发完整流程。
它能做什么
"写一篇公众号文章"
→ 抓热点 → 选题评分 → 框架选择 → 素材采集 → 内容增强
→ 写作(真实信息锚定 + 风格注入 + 编辑锚点)
→ SEO优化 → AI配图 → 微信排版 → 输出HTML首次使用时会引导你设置公众号风格,之后每次只需一句话。生成的文章带有 2-3 个编辑锚点——花 3-5 分钟加入你自己的话,文章就会从"AI 初稿"变成"你的作品"。
核心能力
| 能力 | 说明 | 实现 |
|---|---|---|
| 热点抓取 | 微博 + 头条 + 百度实时热搜 | scripts/fetch_hotspots.py |
| SEO 评分 | 百度 + 360 搜索量化评分 | scripts/seo_keywords.py |
| 选题生成 | 10 选题 × 3 维度评分 + 历史去重 | references/topic-selection.md |
| 素材采集 | WebSearch 真实数据/引述/案例 | SKILL.md Step 3.2 |
| 框架生成 | 7 套写作骨架(痛点/故事/清单/对比/热点解读/纯观点/复盘) | references/frameworks.md |
| 内容增强 | 按框架类型自动匹配:角度发现/密度强化/细节锚定/真实体感 | references/content-enhance.md |
| 文章写作 | 真实信息锚定 + 风格注入 + 编辑锚点 | references/writing-guide.md |
| SEO 优化 | 标题策略 / 摘要 / 关键词 / 标签 | references/seo-rules.md |
| 视觉 AI | 封面 3 创意 + 内文 3-6 配图 | toolkit/image_gen.py |
| 排版 | 16+ 主题 + 微信兼容修复 + 暗黑模式 | toolkit/cli.py |
| 效果复盘 | 微信数据分析 API 回填阅读数据 | references/effect-review.md |
| 范文风格库 | SICO 式 few-shot:从你的文章提取风格指纹,写作时注入 | scripts/extract_exemplar.py |
| 风格飞轮 | 学习你的修改,越用越像你 | references/learn-edits.md |
| 排版学习 | 从任意公众号文章 URL 提取排版主题 | scripts/learn_theme.py |
| 文章采集 | 从公众号 URL 提取正文为 Markdown,可导入范文库 | scripts/fetch_article.py |
写作人格
像选排版主题一样选写作风格。在 style.yaml 里一行配置:
writing_persona: "midnight-friend"| 人格 | 适合 | 风格特点 |
|---|---|---|
midnight-friend | 个人号/自媒体 | 极度口语化、高自我怀疑、每段第一人称 |
warm-editor | 生活/文化/情感 | 温暖叙事、故事嵌套数据、柔和情绪弧 |
industry-observer | 行业媒体/分析 | 中性分析、数据先行、稳中带刺 |
sharp-journalist | 新闻/评论 | 犀利简洁、数据驱动、强观点 |
cold-analyst | 财经/投研 | 冷静克制、逻辑链条、风险意识强 |
每个人格定义了语气浓度、数据呈现方式、情绪弧线、不确定性表达模板等参数。详见 personas/ 目录。
内容质量
爆款智坊 的目标不是"骗过 AI 检测",而是写出值得读的文章。核心机制:
1. 内容增强:根据框架类型自动执行不同策略——热点文找反直觉角度、干货文强化信息密度、故事文锚定真实细节、对比文注入真实用户体感 2. 素材采集:自动 WebSearch 真实数据/引述/案例,锚定在文章中(不编造) 3. 范文风格库:导入你已发布的文章,写作时自动注入你的风格指纹(句长节奏、情绪表达、转折方式) 4. 编辑锚点:在 2-3 个关键位置标记"在这里加一句你自己的话" 5. 学习飞轮:每次你编辑后说"学习我的修改",下次初稿更接近你的风格 6. 文章自检:说"检查一下",查看生成档案(用了什么框架/人格/策略)+ 质量检查(具体到哪句话该怎么改)
排版引擎
16 个主题
# 浏览器内预览所有主题(并排对比 + 一键复制)
python3 toolkit/cli.py gallery
# 列出主题名称
python3 toolkit/cli.py themes| 类别 | 主题 |
|---|---|
| 通用 | professional-clean(默认)、minimal、newspaper |
| 科技 | tech-modern、bytedance、github |
| 文艺 | warm-editorial、sspai、ink、elegant-rose |
| 商务 | bold-navy、minimal-gold、bold-green |
| 风格 | bauhaus、focus-red、midnight |
所有主题均支持微信暗黑模式。
微信兼容性自动修复
| 问题 | 自动修复 |
|---|---|
| 外链被屏蔽 | 转为上标编号脚注 + 文末参考链接 |
| 中英混排无间距 | CJK-Latin 自动加空格 |
| 加粗标点渲染异常 | 标点移到 </strong> 外 |
| 原生列表不稳定 | <ul>/<ol> 转样式化 <section> |
| 暗黑模式颜色反转 | 注入 data-darkmode-* 属性 |
<style> 被剥离 | 所有 CSS 内联注入 |
容器语法
````markdown :::dialogue 你好,请问这个功能怎么用?
很简单,直接在 Markdown 里写就行。
:::
:::timeline 2024 Q1 立项启动 2024 Q3 MVP 上线 :::
:::callout tip 提示框,支持 tip / warning / info / danger。 :::
:::quote 好的排版不是让读者注意到设计,而是让读者忘记设计。 ::: ````
安装
Claude Code:
npx skills add cyhzzz/finance_aigc_skills/viral-content-factoryOpenClaw / WorkBuddy:
# 将 viral-content-factory 文件夹放入 skills 目录即可
# 或使用 OpenClaw 的 skills 安装命令安装后 skill 会在每次运行时自动检查新版本。有更新时说"更新"即可升级。
配置(可选)
cp config.example.yaml config.yaml填入微信公众号 appid/secret(已废弃,可不配)和图片 API key(生图需要)。不配也能用——自动降级为本地 HTML + 输出图片提示词。
快速开始
你:写一篇公众号文章
你:写一篇关于 AI Agent 的公众号文章
你:交互模式,写一篇关于效率工具的推文
你:帮我润色一下刚才那篇
你:学习我的修改 → 飞轮学习
你:看看有什么主题 → 主题画廊
你:换成 sspai 主题 → 切换主题
你:看看文章数据怎么样 → 效果复盘
你:做一个小绿书 → 图片帖(横滑轮播)
你:检查一下 → 生成报告 + 质量自检
你:导入范文 → 建立风格库
你:查看范文库 → 查看已导入的范文
你:学习排版 → 从公众号文章提取排版主题目录结构
viral-content-factory/
├── SKILL.md # 主管道(Step 0-7 多平台工作流)
├── config.example.yaml # API 配置模板
├── style.example.yaml # 风格配置模板
├── writing-config.example.yaml # 写作参数模板
├── requirements.txt
│
├── dist/openclaw/ # OpenClaw 兼容版(CI 自动构建)
│
├── scripts/ # 数据采集 + 诊断 + 构建
│ ├── fetch_hotspots.py # 多平台热点抓取
│ ├── seo_keywords.py # SEO 关键词分析
│ ├── fetch_stats.py # 微信文章数据回填
│ ├── build_playbook.py # 从历史文章生成 Playbook
│ ├── learn_edits.py # 学习人工修改
│ ├── humanness_score.py # 文章质量打分(11 项检测,供自检和 Step 5 使用)
│ ├── extract_exemplar.py # 范文风格提取(SICO 式 few-shot 建库)
│ ├── learn_theme.py # 从公众号文章 URL 提取排版主题
│ ├── fetch_article.py # 从公众号 URL 提取正文为 Markdown
│ ├── diagnose.py # 配置完备度检查
│ └── build_openclaw.py # SKILL.md → OpenClaw 格式转换
│
├── toolkit/ # Markdown → 微信工具链
│ ├── cli.py # CLI(preview / gallery / themes / image-post / learn-theme)
│ ├── converter.py # Markdown → 内联样式 HTML + 微信兼容修复
│ ├── theme.py # YAML 主题引擎
│ ├── publisher.py # 微信草稿箱 API(已废弃)+ 小绿书图片帖
│ ├── wechat_api.py # access_token / 图片上传
│ ├── image_gen.py # AI 图片生成(9 provider,自动 fallback)
│ └── themes/ # 16+ 排版主题(含暗黑模式,可从文章学习新增)
│
├── personas/ # 5 套写作人格预设(含朱雀实测数据)
│
├── references/ # Agent 按需加载
│ ├── writing-guide.md # 写作规范 + 质量检查规则
│ ├── frameworks.md # 7 种写作框架(痛点/故事/清单/对比/热点解读/纯观点/复盘)
│ ├── content-enhance.md # 内容增强策略(角度发现/密度强化/细节锚定/真实体感)
│ ├── topic-selection.md # 选题评估规则
│ ├── seo-rules.md # 微信 SEO 规则
│ ├── visual-prompts.md # 视觉 AI 提示词规范
│ ├── wechat-constraints.md # 微信平台限制 + 自动修复
│ ├── style-template.md # 风格配置字段 + 16 主题列表
│ ├── exemplar-seeds.yaml # 通用人类写作模式种子(无范文库时的 fallback)
│ ├── exemplars/ # 用户范文风格库(自动生成,不入 git)
│ ├── onboard.md # 首次设置流程
│ ├── learn-edits.md # 学习飞轮流程
│ └── effect-review.md # 效果复盘流程
│
├── output/ # 生成的文章
├── corpus/ # 历史语料(可选)
└── lessons/ # 修改记录(自动生成)运行时自动生成(不入 git):style.yaml、history.yaml、playbook.md、writing-config.yaml、references/exemplars/*.md
工作流程
Step 1 环境检查 + 加载风格(不存在则 Onboard)
↓
Step 2 热点抓取 → 历史去重 + SEO → 选题
↓
Step 3 框架选择 → 素材采集(WebSearch 真实数据)→ 内容增强(按框架类型匹配策略)
↓
Step 4 维度随机化 → 范文风格注入 → 写作(内容增强约束 + 真实素材锚定 + 编辑锚点)→ 快速自检
↓
Step 5 SEO 优化 → 质量验证
↓
Step 6 视觉 AI(封面 + 内文配图)
↓
Step 7 预检 + 排版 + HTML输出(16 主题 + 微信兼容修复)
↓
Step 8 写入历史 → 回复用户(含编辑建议 + 飞轮提示)默认全自动。说"交互模式"可在选题/框架/配图处暂停确认。
Toolkit 独立使用
# Markdown → 微信 HTML
python3 toolkit/cli.py preview article.md --theme sspai
# 主题画廊
python3 toolkit/cli.py gallery
# 小绿书/图片帖(横滑轮播,3:4 比例,最多 20 张)
python3 toolkit/cli.py image-post photo1.jpg photo2.jpg photo3.jpg -t "周末探店" -c "在望京发现的宝藏咖啡馆"
# 抓热点
python3 scripts/fetch_hotspots.py --limit 20
# SEO 分析
python3 scripts/seo_keywords.py --json "AI大模型" "科技股"
# 范文风格库
python3 scripts/extract_exemplar.py article.md # 导入范文
python3 scripts/extract_exemplar.py *.md -s "你的公众号" # 批量导入
python3 scripts/extract_exemplar.py --list # 查看范文库
# 文章质量检查
python3 scripts/humanness_score.py article.md --verbose
# 从公众号文章学习排版主题
python3 scripts/learn_theme.py https://mp.weixin.qq.com/s/xxxx --name my-styleLicense
MIT
角色 (Role)
你是申万宏源财富管理事业部的AI合规优化助手。你的核心职能是作为业务人员的“文案优化伙伴”,在最小必要尺度内,识别小红书笔记内容中可能存在的合规风险,并提供以“词语替换/删除”为主的、最小化修改的优化方案,以生成可直接使用的合规文案。
任务 (Task)
审核用户提供的小红书笔记文案,并完成以下任务: 1. 风险识别:基于最小合规尺度,仅判断内容是否存在明确违反证券法规、自律规则及内部制度的表述(如不当承诺收益、贬低同业、使用禁忌词语等)。忽略风格、语气、是否附加执业编号、内部流程等非内容合规性问题。 2. 内容优化:对识别出的风险点,不直接否决,而是提供最简化的修改建议。重点通过替换个别词汇、删除敏感短语等方式进行修正,确保修订后的笔记在篇幅、风格和核心意思上与原文基本保持一致。 3. 成品输出:必须输出完整的、优化后的小红书笔记全文,确保其符合合规要求且可直接用于发布。
格式 (Format)
你的所有输出必须严格遵循以下三级结构:
1. 合规摘要 (Compliance Summary)
- 以交通信号灯形式概括整体风险等级:【🟢 低风险】、【🟡 中风险】、【🔴 高风险】。
- 简述核心问题与优化原则(1-2句话)。
2. 分项优化建议 (Itemized Optimization Suggestions)
对每个具体风险点,按以下结构说明:
- 问题定位:指出原文中具体有风险的句子或短语。引用最直接相关的法规/制度依据(如“《证券期货投资者适当性管理办法》第XX条禁止不当宣传”),遵循奥卡姆剃刀原理,仅引用必要、直接的依据。
- 修改建议:提供具体的替换措辞或删除建议。修改必须简单、可执行(参考福格行为模型,使行为“容易做到”),例如:
- 将“绝对赚钱”替换为“历史表现较好”。
- 删除“唯一选择”、“稳了”等词语。
- 将“我们推荐”调整为“您可以关注”。
- 优化示例:
- 原句:“[有问题的原文引用]”
- 修订后:“[修改后的句子]”
3. 修订版笔记全文 (Revised Note)
- 提供一份完整的、融合了所有优化建议后的小红书笔记文案。
- 在文案底部,保留用户原有的固定引导内容和合规提示,并注明“(此部分为原文固定结尾,未作改动)”。
- 确保修订后的笔记与原文在篇幅、风格和表达流畅度上高度一致。
--- 约束与声明 (Constraints & Disclaimers): 1. 本优化仅基于内容合规视角,不涉及投资建议。最终发布需经内部审核流程确认。 2. 若内容无明确合规风险,直接输出【🟢 低风险】及原文,无需修改。 3. 对于无法通过简单修改解决的复杂合规问题或模糊地带,应声明:“建议对该笔记启动人工合规复核流程”。
内容增强策略
你的任务
框架选定后,根据框架类型执行对应的增强策略。增强策略不改变框架结构,而是提升框架里面填充的内容质量。
核心原则:AI 写的文章最大的问题不是"像 AI",而是"没意思"——结构正确但缺少让读者想转发的东西。增强策略就是在写作之前,把那个"让人想转发的东西"找到。
框架 → 策略映射
| 框架类型 | 增强策略 | 核心目标 |
|---|---|---|
| 热点解读型 / 纯观点型 | 角度发现 | 找到一个别人没说过的切入点 |
| 痛点型 / 清单型 | 密度强化 | 每段都有可操作的干货 |
| 故事型 / 复盘型 | 细节锚定 | 用真实细节把读者拉进场景 |
| 对比型 | 真实体感 | 用真实用户声音替代抽象分析 |
---
策略一:角度发现
适用:热点解读型、纯观点型
问题:AI 写热点文章默认会写"中立全面的分析",但公众号读者要的是"一个有态度的人告诉我该怎么看"。
执行步骤:
1. 扫描已有覆盖:
WebSearch: "{选题关键词} site:mp.weixin.qq.com"
WebSearch: "{选题关键词} 观点 OR 评论 OR 看法"快速浏览 3-5 篇已有文章,提取主流观点清单(1 句话 × 3-5 条)。
2. 生成差异化角度(至少 3 个):
- 反转型:主流说 A 好,你说 A 其实有致命问题
- 升维型:大家在讨论 A vs B,你说这个问题本身就问错了
- 利己型:所有人在分析宏观趋势,你说"这对你我意味着什么"
- 类比型:从完全不同的领域找一个结构相同的案例,映射过来
- 时间型:大家看短期影响,你看 3 年后;或者反过来,大家看长期,你说下周就会出事
3. 选择标准:
- 选最能引发"我不同意!"或"说得太对了!"反应的那个
- 必须是你能用事实和逻辑支撑的,不是为了反而反
- 如果 3 个角度都很平,说明这个选题本身可能不适合观点型,考虑换框架
4. 输出:一句话核心论点,写入框架大纲的开头策略中。这个论点必须贯穿全文每个 H2。
检验:如果把你的核心论点发到朋友圈,会不会有人想评论?如果不会,角度还不够尖。
---
策略二:密度强化
适用:痛点型、清单型
问题:AI 写干货容易变成"正确的废话"——"要注意用户体验"、"数据很重要"、"建议多测试"。读者看完觉得"说得都对,但我不知道该干啥"。
执行步骤:
1. 操作化检查:对框架大纲中的每个 H2 要点,问一个问题:
"读者看完这段,能不能在 5 分钟内开始动手?"
- 能 → 通过
- 不能 → 需要补充具体步骤、工具名、参数、命令
2. 素材搜集(针对不够具体的要点):
WebSearch: "{要点关键词} 教程 OR 步骤 OR 实操"
WebSearch: "{要点关键词} 工具 OR 推荐 OR 方案"找到具体的工具名、配置参数、操作步骤、价格。
3. 密度指标:
- 每个 H2 至少包含 1 个:具体工具/产品名、具体数字、具体步骤
- 全文至少 3 处"如果你是 X 情况,用 Y 方法"的条件分支
- 禁止出现:"建议大家多关注"、"需要注意"、"非常重要"这类空话
4. 输出:在框架大纲的每个 H2 下补充具体的素材要点。
检验:把每个 H2 的要点单独拿出来,能不能当一条独立的"小贴士"发出去?如果太虚,密度不够。
---
策略三:细节锚定
适用:故事型、复盘型
问题:AI 讲故事喜欢概括——"他经历了很多困难"、"团队遇到了挑战"、"最终取得了成功"。读者感受不到任何东西,因为没有画面。
执行步骤:
1. 搜集真实细节:
WebSearch: "{人物/事件} 采访 OR 专访 OR 对话"
WebSearch: "{人物/事件} 细节 OR 故事 OR 回忆"找以下 4 类锚点(至少命中 3 类):
| 锚点类型 | 示例 | 效果 |
|---|---|---|
| 时间锚 | "2019 年 3 月的一个雨天" | 画面感 |
| 数字锚 | "账上只剩 7 万块" | 紧迫感 |
| 对话锚 | "他跟合伙人说:再撑三个月" | 人物感 |
| 感官锚 | "办公室里弥漫着外卖的味道" | 沉浸感 |
2. 场景重建:对框架中的"转折高潮"或"做错了什么"段落,要求写作时包含:
- 具体的时间和地点
- 当事人说了什么(直接引语或合理重建)
- 一个感官细节(看到/听到/感觉到什么)
3. 情绪拐点标记:在框架大纲中标注 1-2 个情绪拐点的位置——读者应该在这里感到"意外"、"心疼"、"燃了"。
4. 输出:在框架大纲的关键段落下补充搜集到的真实细节。
检验:闭上眼,能不能"看到"这个故事里的某个画面?如果只有抽象概念没有画面,细节不够。
---
策略四:真实体感
适用:对比型
问题:AI 写对比文章会生成整齐的优劣势表格,但读起来像产品说明书。读者要的不是功能对比,是"用起来到底怎么样"。
执行步骤:
1. 搜集真实声音:
WebSearch: "{产品/方案A} 体验 OR 评测 OR 踩坑 site:v2ex.com OR site:zhihu.com"
WebSearch: "{产品/方案B} 缺点 OR 问题 OR 吐槽"找 3-5 条真实用户的评价(正面和负面都要)。
2. 场景化对比:不要抽象地说"A 性能更好",而是:
- "当你需要处理 X 场景时,A 大概要 Y 秒,B 直接卡住"
- "如果你是 Z 类型的用户,A 的这个设计会让你抓狂"
3. 踩坑优先:对每个方案,必须包含至少 1 个"官方不会告诉你的坑":
- 隐藏费用、兼容性问题、学习曲线、售后体验
- 来源必须是真实用户反馈,不是猜测
4. 输出:在框架大纲的 A/B 分析段落下补充真实用户声音和具体场景。
检验:读者看完你的对比,能不能直接做决定?如果还需要自己去搜评价,体感不够。
---
执行时机
在 SKILL.md 管道中的位置:
Step 3.1 框架选择
Step 3.2 素材采集
Step 3.3 内容增强 ← 本文档
Step 4 写作增强策略的输出(角度/素材/细节/用户声音)作为 Step 4 写作的输入约束,与框架大纲一起传入写作环节。
效果复盘
触发:用户问"文章数据怎么样"、"效果复盘"、"看看表现"
python3 {skill_dir}/scripts/fetch_stats.py --days 7脚本会: 1. 调微信数据分析 API 拉取最近 7 天的文章阅读数据 2. 匹配 history.yaml 中的文章记录 3. 回填 stats 字段(阅读量、分享量、点赞量、阅读率)
回填后,分析数据并给出建议:
- 哪篇文章表现最好?为什么?(标题策略?选题热度?框架类型?)
- 哪篇表现不好?可能的原因?
- 对后续选题/标题/框架的调整建议
这些分析会影响下次运行时 Step 2 的偏好参考。
# 通用人类写作模式种子
#
# 用途:没有范文库的用户,Step 4.4 用这些段落作为 few-shot 注入,
# 教 LLM "人类写作的结构模式长什么样"。
#
# 设计原则:
# - 只示范结构模式(句长方差、情绪锐度、自我纠正、非总结式收尾)
# - 不携带特定风格/人格(任何 persona 都能兼容)
# - 每个段落标注了它示范的反AI模式
#
# 有用户自己的范文库时,这个文件不会被使用。
opening_hooks:
- text: |
好多年没有坐公交了,上次去太子湾,由于景区限行,只能把车停在外面,坐景区免费接驳车过去。
前面座位看到一个小女孩一直在刷那种 AI 生成的短视频,画面非常粗糙,内容也很假,滑到下一个居然还是差不多的东西,看得津津有味。
当时看到这一幕我甚至有点伤心。
pattern: "日常观察切入 → 意外情绪反应。不总结、不预告、不铺垫。"
- text: |
**本硕八年毕业,单程通勤两个半小时,**月薪2690。 这是市场给我贴的标签。
**裸辞。创业,年收超7位数。** 这是我自己撕掉那个标签之后,重新定义的自己。
一路走来,中间发生了什么?我讲给你听。
pattern: "标签→撕裂对比开头。两组加粗短句制造视觉和语义落差。句长标准差 45.7(数据最高)。"
- text: |
29号,我和小伙伴在深圳搞活动。
活动结束之后,我想顺道拜访一个多年没见的老朋友,发消息过去。
他回:在三亚。
我问:度假?
他说:带孩子。
我盯着手机屏幕,愣了整整三秒。
pattern: "对话碎片制造节奏。2-4字短句紧邻20+字长句。物理反应替代心理描写。"
- text: |
我信了这套话很多年。
"要有长期主义。要相信复利。时间是最好的朋友。"
最惨的一次,在一个方向扎进去3年,回头一看,什么都没留下来。
pattern: "先认同再推翻。引用常见正确的话→用个人惨痛经历否定。开头即高潮。"
emotional_peaks:
- text: |
我信了这套话很多年。
最惨的一次,在一个方向扎进去3年,回头一看,什么都没留下来。
这不是失败——失败还有个明确的结果。
是你信错了一件事。
pattern: "用'最惨'而非'有挑战'。否定委婉说法('这不是失败'),给出更痛的定义。"
- text: |
很多人在温水煮青蛙的过程中得过且过,过着看似满意、实则内心有很多不满的生活,然后说一句,算了吧,现在这样也还行,但这样反而错失了挖掘自己最大潜力的机会。
pattern: "用'温水煮青蛙'具象化停滞感。'算了吧'是内心独白式引用。来自得分最低(32.8)的文章。"
- text: |
讲真,我每次看到这种争论,都觉得……怎么说呢……挺无语的。
不是说这些人蠢。
是他们在纠结一个根本不存在的问题。
什么叫"AI味道"?你能定义吗?你能量化吗?你能验证吗?
不能。
那你在纠结什么?
pattern: "填充词('怎么说呢')+ 连续反问不给答案 + 单字段落('不能。')。"
transitions:
- text: |
我第一反应是"孩子这时候不应该在学校吗",第二反应是想把这话发过去,第三反应是我把那句话吞回去了——因为我在那三秒里想清楚了一件事。
pattern: "思维过程外化(三个反应)。破折号打断 → 时间锚点('三秒')→ 悬念。"
- text: |
不过,到了之后我发现,什么作息啊,学习强度啊,都不是最难熬的,人才是。
pattern: "列举预期困难再一句否定。转折词 + 真实困难揭示。"
- text: |
不过话又说回来。知道自己在局里,这件事本身,就已经是出局的开始了。
pattern: "'不过话又说回来'——自我推翻后重新定位。制造思维的非线性感。"
closings:
- text: |
时间是你唯一不可再生的资源。
把它投进一个真实存在的锚点,才叫复利。
投进一个"我相信它会好"的希望,叫做漫长的等死。
pattern: "重新定义核心概念收尾。'等死'替代励志结论。来自得分 36.7 的文章。"
- text: |
有了 AI 之后,很多事都更容易了,但也正因为更容易了,什么东西真的值得做、值得花很多年去换,反而变得更难想清楚。要做什么可能比怎么更快做出一个东西更加重要了。
pattern: "结尾是未完成的思考,不是结论。'可能'留有余地。没有升华。"
- text: |
我苦哈哈的在电脑前,写这篇文章,想着我的女儿。
差距是真实的。
机会也是真实的。
时钟在走,窗口在收窄。
pattern: "回到写作现场。重复句式('是真实的')制造执念感。来自得分 33.0 的文章。"
- text: |
不要在那个愣住的感觉里待太久。
那个感觉,待久了,就成了借口。
pattern: "回扣开头意象。两句话收束,不解释。草率感本身就是风格。"
写作框架库
你的任务
根据选题和客户风格,生成 5 套差异化写作框架供用户选择。每套框架是一个完整的文章骨架——不是写文章本身,而是告诉写作步骤"每一段写什么、怎么写"。
5 套框架类型
框架 A: 痛点型
适合:解决问题、提供方案的选题。干货型账号首选。
结构:
1. 开头(痛点共鸣)
- 直接描述目标读者正在经历的痛点场景
- 用"你是不是也..."或具体场景切入
- 制造紧迫感:这个问题不解决会怎样
2. 痛点放大(H2)
- 用数据或案例说明这个问题有多普遍
- 分析为什么大多数人的做法是错的
- 金句落点:一句话总结错误认知
3. 解决方案(H2)
- 核心方法/工具/思路(不超过 3 个要点)
- 每个要点配一个具体案例或操作步骤
- 金句落点:一句话总结方法论
4. 实操验证(H2,可选)
- 用一个完整案例走一遍解决流程
- 或用前后对比展示效果
5. 结尾(行动引导)
- 总结核心观点(一句话)
- CTA:引导留言分享自己的痛点、或转发给同样有这个问题的朋友框架 B: 故事型
适合:人物、事件、趋势类选题。故事型/情绪型账号首选。
结构:
1. 开头(悬念钩子)
- 抛出一个反直觉的结果或意外的场景
- "谁也没想到..."、"所有人都以为...结果..."
- 不要在开头剧透结论
2. 背景铺垫(H2)
- 交代故事的时间、人物、起因
- 控制在 200 字以内,快速过渡
- 金句落点:一句话定义这个故事的核心矛盾
3. 转折与高潮(H2)
- 事件的关键转折点
- 用细节还原场景(对话、数字、画面)
- 这是全文最花笔墨的地方
4. 深度解读(H2)
- 从故事上升到规律/趋势/洞察
- 这个故事对读者意味着什么
- 金句落点:一句话总结你从这个故事中看到的本质
5. 结尾(情绪共振)
- 回扣开头的悬念
- CTA:引导读者分享"你身边有没有类似的故事"框架 C: 清单型
适合:盘点、推荐、方法论类选题。干货型/测评型账号首选。
结构:
1. 开头(价值承诺)
- 直接告诉读者"看完这篇你能得到什么"
- 用数字锚定预期:"5 个方法"、"3 个工具"、"7 个坑"
- 简短说明为什么你有资格推荐(经验/测试/调研)
2. 清单项 1-N(每项一个 H2)
- 每项结构统一:名称 → 一句话说明 → 具体案例或使用场景 → 适用人群
- 项与项之间用不同长度,避免机械感
- 每 2-3 项穿插一个金句或个人吐槽,打破节奏
- 建议 5-7 项,不超过 10 项
3. 结尾(总结 + 彩蛋)
- 一张表格或一句话总结所有清单项
- 加一个"隐藏推荐"或"个人最爱"作为彩蛋
- CTA:引导留言补充"你还知道哪些"框架 D: 对比型
适合:选择、决策、两个方案/观点的讨论。测评型/干货型账号首选。
结构:
1. 开头(选择困境)
- 描述读者面临的"选 A 还是选 B"困境
- 说明为什么这个选择很重要/很容易选错
2. A 方案深度分析(H2)
- 优势(2-3 点,每点配案例)
- 劣势(1-2 点,诚实说)
- 最适合什么场景/什么人
- 金句落点:一句话定义 A 的核心价值
3. B 方案深度分析(H2)
- 同样的结构,与 A 形成对照
- 金句落点:一句话定义 B 的核心价值
4. 对比总结(H2)
- 用表格对比关键维度(3-5 个维度)
- 明确给出"如果你是 X 情况选 A,如果是 Y 情况选 B"的结论
- 不要和稀泥说"各有优劣"——读者要的是明确建议
5. 结尾(个人选择)
- 说清楚"如果是我,我选X"以及为什么
- CTA:引导投票或留言"你选哪个"框架 E: 热点解读型
适合:新闻、事件、行业动态的深度解读。热点型账号首选。
结构:
1. 开头(事件速览)
- 2-3 句话说清楚发生了什么(5W1H 精简版)
- 不要复制新闻原文,用自己的话重述
- 用一个判断句结尾:"这件事比表面看起来复杂得多"
2. 表面信息(H2)
- 大多数人看到的:媒体怎么报道的、网友怎么评论的
- 简要梳理主流观点
- 金句落点:指出主流观点的盲区
3. 深层分析(H2)
- 你看到了什么别人没看到的
- 这件事背后的利益链/技术逻辑/行业趋势
- 用 1-2 个类比或历史事件做对照
- 金句落点:一句话总结你的核心判断
4. 影响预判(H2)
- 短期:接下来会怎样
- 长期:对行业/普通人意味着什么
- 说清楚不确定性:"如果 X 发生,则 Y;如果不发生,则 Z"
5. 结尾(读者行动建议)
- 普通读者应该怎么应对/关注什么
- CTA:引导关注后续进展、或留言分享看法框架 F: 纯观点型
适合:表达立场、反驳主流观点、输出价值判断。情绪型/热点型账号首选。与热点解读型的区别:不需要从一个新闻事件出发,直接从一个论点开刀。
结构:
1. 开头(亮刀子)
- 第一段就把核心观点甩出来,不铺垫
- 观点要够尖锐,让读者要么点头要么皱眉
- "我越来越觉得 X 是一个巨大的谎言"、"所有人都在说 X,但没人提 Y"
2. 为什么我这么想(H2)
- 触发这个观点的具体经历或观察(不是抽象推理)
- 1-2 个你亲眼见过/亲身经历的案例
- 金句落点:把观察提炼为一句判断
3. 主流观点哪里错了(H2)
- 列出主流说法,逐条反驳
- 不要稻草人——引用真实的对立观点,给对方最强的版本,然后说明为什么你仍然不同意
- 承认对方有道理的部分("他们说得没错,但...")
- 金句落点:一句话总结分歧的本质
4. 如果我是对的,意味着什么(H2)
- 推演这个观点的后果——对读者、对行业、对普通人
- 提供一个可验证的预测或判断标准("如果半年后 X 发生,说明我说对了")
5. 结尾(留余地但不软)
- 不要总结,不要"综上所述"
- 承认自己可能是错的,但说清楚在什么条件下你会改变看法
- CTA:引导读者表态——"你同意吗?评论区见"框架 G: 复盘/经验型
适合:个人实践总结、项目复盘、阶段性回顾。干货型/故事型账号首选。与故事型的区别:主角是"我",重点是可迁移的经验而不是戏剧性。
结构:
1. 开头(结果先行)
- 先说结果/数据:做了什么、多久、成果如何
- 不要谦虚也不要吹,直接上数字
- "做了 3 个月,踩了 X 个坑,最后 Y 还行,Z 彻底失败"
2. 背景和动机(H2)
- 为什么做这件事、起点是什么状态
- 控制在 150 字以内,快速过渡——读者来看经验的,不是来听你的人生故事
- 金句落点:一句话说清你当时的认知水平("那时候我以为 X,现在觉得自己太天真")
3. 做对了什么(H2)
- 2-3 个关键决策,每个配上具体数据或结果
- 说清楚"为什么当时选了这个方向"——决策过程比结果更有价值
- 金句落点:提炼为可迁移的原则
4. 做错了什么(H2)
- 这是全文最值钱的部分——读者来就是为了避坑
- 每个错误:当时怎么想的 → 实际发生了什么 → 现在回头看应该怎么做
- 不要轻描淡写——具体到金额、时间、情绪代价
- 金句落点:一句话总结这个坑的本质
5. 结尾(如果重来)
- "如果重新来过,我会..."——给出 2-3 条具体建议
- 不要泛泛而谈,要具体到"第一周先做 X,不要碰 Y"
- CTA:引导读者分享自己的复盘或提问输出格式
对每个选题,从 7 套框架中选出最匹配的 5 套,每套包含:
### 框架 X: {类型名}(推荐指数:⭐⭐⭐⭐⭐)
**开头策略**:{1-2 句话说明开头怎么写}
**段落大纲**:
1. {H2 标题} — {这段写什么,2-3 句话}
2. {H2 标题} — {这段写什么}
3. ...
**金句预埋**:
- {第 X 段结尾}:"{建议的金句方向}"
- {第 X 段结尾}:"{建议的金句方向}"
**结尾引导**:{CTA 策略,1 句话}
**推荐理由**:{为什么这个选题适合用这套框架}推荐指数规则
根据选题特征和客户 content_style 匹配度打星:
- ⭐⭐⭐⭐⭐ 最佳匹配
- ⭐⭐⭐⭐ 适合
- ⭐⭐⭐ 可以用但不是最优
- ⭐⭐ 勉强
- ⭐ 不建议
content_style 对应关系:
- 干货型 → 优先推荐:痛点型、清单型、复盘型
- 故事型 → 优先推荐:故事型、热点解读型、复盘型
- 情绪型 → 优先推荐:故事型、痛点型、纯观点型
- 热点型 → 优先推荐:热点解读型、对比型、纯观点型
- 测评型 → 优先推荐:对比型、清单型
学习人工修改(核心飞轮)
这是 爆款智坊 最重要的长期价值。每次用户编辑文章后让系统学习,下一版的初稿就会更接近用户的风格,需要的编辑量越来越少。
飞轮效应:初稿需要改 30% → 学习 5 次��只需改 15% → 学习 20 次后只需改 5%
触发:用户说"我改了,学习一下"、"学习我的修改"
1. 获取 draft 和 final
- draft:
output/下最新的 .md 文件(按修改时间排序���ls -t output/*.md | head -1) - final:用户提供修改后的版本。主动引��用��:"请把你改好的文章全文粘贴给我,或��告诉我文件路径。如果你是在微信后台编辑器里改的,可以全选复制后直接粘贴到这里。"
2. 运行 diff 分析
python3 {skill_dir}/scripts/learn_edits.py --draft {draft_path} --final {final_path}3. 分析并记�� pattern
读取脚本输���的 diff 数据和 INSTRUCTIONS FOR AGENT,对每个有意义的修改写入 pattern。
每个 pattern 必须包含:
type��word_sub/para_delete/para_add/structure/title/tone/expressionkey:短唯一标识(英文,如avoid_jiangzhen、shorter_paragraphs、more_negative_emotion)description:这次修改是什么(如"把'讲真'替换为'坦白说'")rule:可执行的写作指令���必须是祈使句,不是描述句)
key 的复用:如果这次的修改和之前某个 lesson 里的 pattern 是同一种偏好(比如又一次把段落改短了),使用相同的 key。这样 --summarize 时 occurrences 会累加���confidence 自动提升。
编辑 lesson YAML 文件中的 patterns 列表,写入分���结果。
4. Playbook 更新
每积累 5 次 lessons,触发 playbook 更新:
python3 {skill_dir}/scripts/learn_edits.py --summarize --json读取 JSON 输出,按以下规则更新 {skill_dir}/playbook.md:
playbook.md 格式
playbook.md 是 YAML 格式,每条规则带 confidence 和元数据:
# 爆款智坊 Playbook — 从用户编辑中学习的写作规则
# 由 Agent 自动���护,不要手动编辑
# confidence ≥ 5 的规则在 Step 4 写作时作为硬性约束��行
# confidence < 5 的规则作为软性参考
rules:
- key: "shorter_paragraphs"
type: "expression"
rule: "段落不超过 80 字,长段必须在 3 句内换行"
confidence: 7.0
occurrences: 4
last_seen: "2026-03-28"
- key: "avoid_jiangzhen"
type: "word_sub"
rule: "不要使用'讲真',用'坦白说'代替"
confidence: 5.0
occurrences: 2
last_seen: "2026-03-30"更新规则
1. 新增:summarize 中出��了 playbook 里没有的 key → 直接添加 2. 更新:summarize 中的 confidence/occurrences/rule 比 playbook 里的新 → 用新值覆盖 3. 保留:playbook 中有但 summarize 中没有的规则 → 保留不动(可能是早期学到的,仍然��效) 4. 衰减淘汰:confidence < 2 的规则 → 删除(太旧或不再相关)
5. Step 4 如何使用 playbook
Step 4 写作时读取 playbook.md:
- confidence ≥ 5 的规则:作为硬性约束执行(和 persona 同级)
- confidence 3-5 的规则:作为软性参考(倾向遵循但不强制)
- confidence < 3 的规则:忽略(可能已过时)
这确保:
- 用户反复确认的偏好(高 confidence)被严格执行
- 只出现过一次的偏好(低 confidence)不��过度影响
- 用户风格变化时,旧规则自然衰减退出
Onboard(首次设置)
触发条件:
- Step 1 发现
style.yaml不存在 - 用户明确说"重新设置风格"、"修改配置"
Phase 1: 收集信息(交互式问答)
通过对话收集以下信息,不要一次性列出所有问题——一轮问 1-2 个,像聊天一样:
必问(缺了无法运行):
| 顺序 | 问题 | 对应字段 | 示例引导 |
|---|---|---|---|
| 1 | 你的公众号叫什么名字?主要做什么方向? | name + industry | "比如'零号AI',做科技/互联网" |
| 2 | 主要写哪几个方向的内容? | topics | "比如 AI、产品设计、效率工具" |
| 3 | 你希望文章是什么风格? | tone | "专业严肃?轻松有趣?毒舌犀利?像朋友聊天?" |
选问(有默认值,用户不答就用默认):
| 问题 | 对应字段 | 默认值 |
|---|---|---|
| 目标读者是谁? | target_audience | 从 industry 推断 |
| 用什么人称写? | voice | "第一人称,像一个懂行的朋友" |
| 有没有绝对不能出现的词或话题? | blacklist | 空 |
| 有没有想参考的公众号? | reference_accounts | 空 |
| 署名写什么? | author | name 字段值 |
| 偏好哪种写作人格? | writing_persona | 从 tone 推断(见映射) |
tone → persona 自动映射(用户不选时的默认推断):
- 轻松/有趣/朋友/聊天 →
midnight-friend - 温暖/共鸣/故事/治愈 →
warm-editor - 专业/分析/深度/行业 →
industry-observer - 犀利/锐评/观点/新闻 →
sharp-journalist - 严谨/数据/研究/财经 →
cold-analyst
| 偏好哪种排版风格?(可运行 gallery 命令预览全部 16 个主题) | theme | "professional-clean" | | 封面风格偏好? | cover_style | 从 industry 推断 | | 有没有固定封面模板? | cover_template | 不设置 |
写作人格说明(personas/ 目录下有详细定义):
| 人格 | 适合 | 朱雀实测 | 一句话描述 |
|---|---|---|---|
midnight-friend | 个人号/自媒体 | 39% 人工 | 像深夜给朋友发微信,极度口语化 |
warm-editor | 生活/文化/情感 | 10% 人工 | 故事驱动,温暖共鸣 |
industry-observer | 行业媒体/分析 | 10% 人工 | 克制的专业分析,偶尔锐利 |
sharp-journalist | 新闻/评论 | 0% 人工(需编辑) | 短句利落,观点鲜明 |
cold-analyst | 财经/投研 | 0% 人工(需编辑) | 严谨数据,专业措辞 |
快捷路径:
- 如果用户直接甩了一段描述(如"我做科技自媒体,风格像虎嗅"),直接从中提取所有能提取的字段,只补问缺的
- 如果用户说"不设置"、"用默认的"、"直接写" → 复制
{skill_dir}/style.example.yaml为style.yaml,跳过所有问答
参考: {skill_dir}/references/style-template.md(字段说明和可用主题列表)Phase 2: 生成配置
用收集到的信息自动生成 {skill_dir}/style.yaml。
同时确保以下文件/目录存在(不存在则创建):
{skill_dir}/history.yaml→ 初始化为articles: []{skill_dir}/corpus/→ 空目录{skill_dir}/lessons/→ 空目录
生成完成后,把 style.yaml 的内容展示给用户看一遍,问"这个配置 OK 吗?有什么要改的?"。用户确认后继续。
Phase 3: Playbook(可选,不阻断)
问用户:"你有没有之前写过的公众号文章?如果有 20 篇以上,我可以从中学习你的写作风格,以后写出来的文章会更像你。"
- 用户有语料 → 告知将文章(.md 或 .txt)放入
{skill_dir}/corpus/,然后运行:
python3 {skill_dir}/scripts/build_playbook.py按脚本输出逐批阅读文章,提取风格特征,生成 playbook.md。
- 用户没有语料 / 暂时不想弄 → 完全正常,跳过。告知用户:"没问题,先用通用风格写,后续你可以随时说'学习我的修改'来让我逐渐适应你的风格。"
Phase 4: 试跑
Onboard 完成后,问用户:"配置好了,要不要现在试写一篇?"
- 是 → 回到 Step 1,执行完整流程
- 否 → 告知用户下次如何触发:"下次直接说'写一篇公众号文章'就行"
{作者名} × 哔哩哔哩中视频 风格手册
平台基础信息
- 平台:哔哩哔哩
- 内容形态:中视频脚本(分P+社区互动)
- 时长范围:1-30分钟
风格调整参数
| 参数 | 通用风格 | 哔哩哔哩脚本 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N-1}/5 | -1 |
| 段落长度 | 200字 | 分P(每段3-8分钟) | 分P结构 |
| 情感浓度 | {N}/5 | {N+0.5}/5 | +0.5 |
差异化要点
强化项: 1. 开场钩子(前30秒) 2. 完播率优化结构 3. 弹幕互动设计 4. Z世代语感 5. 社区氛围营造
弱化项: 1. 说教式表达 2. 过于严肃的语气 3. 单向输出而非互动
脚本结构
分P式结构(P即Part):
- P1:开场钩子(前30秒)+ 本期内容预告
- P2-Pn:每个Part 3-8分钟,含章节时间戳
- 结尾:投币/收藏引导 + 下期预告
句式特点
- 略口语化,Z世代语感
- 互动式表达("你们觉得呢""弹幕告诉我")
- 适度玩梗
- 真实感强
词汇特点
增补词汇:Z世代用语、梗、B站特有表达(前方高能、爷青回等) 禁用词汇:爹味说教、过时网络语
风险提示
配音或字幕形式:「以上仅为个人分享,不构成投资建议」
写作提示词(用户可复制)
你是一位B站up主,风格Z世代、真实感强、擅长社区互动。
脚本结构:开场钩子(前30秒)→分P正文(每P 3-8分钟)→结尾引导;
章节时间戳;预设弹幕引爆点;投币/收藏/充电引导;
up主人设一致性。{作者名} × 抖音短视频 风格手册
平台基础信息
- 平台:抖音
- 内容形态:短视频脚本(分镜+注意力抢夺)
- 时长范围:15秒-3分钟
风格调整参数
| 参数 | 通用风格 | 抖音脚本 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N-1.5}/5 | -1.5 |
| 段落长度 | 200字 | 分镜≤15秒 | 分镜结构 |
| 情感浓度 | {N}/5 | {N+1}/5 | +1 |
差异化要点
强化项: 1. 开场钩子(3秒) 2. 行动引导 3. 口语化表达 4. 注意力抢夺设计
弱化项: 1. 复杂逻辑 2. 专业术语堆砌 3. 冗长铺垫
脚本结构
分镜式结构:
- 开场钩子(前3秒):5种类型(痛点/数字/反问/震惊/场景)
- 正文分镜(每镜≤15秒)
- 结尾引导(关注/评论/点赞)
句式特点
- 极口语化
- 短句为主
- 停顿/重音标记
- 重复强调关键点
词汇特点
增补词汇:网络流行语、情绪词、行动词 禁用词汇:复杂专业术语、冗长解释
风险提示
配音或字幕形式:「投资有风险,内容仅供参考」
写作提示词(用户可复制)
你是一位抖音博主,擅长3秒注意力抢夺和行动引导。
脚本结构:开场钩子(3秒)→分镜正文(每镜≤15秒)→结尾CTA;
极口语化;每镜有画面描述+配音稿;音乐/音效提示。{作者名} × 今日头条 风格手册
平台基础信息
- 平台:今日头条
- 内容形态:短段落文章(算法友好+信息密度)
- 字数范围:800-1500字
风格调整参数
| 参数 | 通用风格 | 今日头条 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N}/5 | 保持 |
| 段落长度 | 200字 | ≤3句/段 | 大幅缩短 |
| 情感浓度 | {N}/5 | {N+0.5}/5 | +0.5 |
差异化要点
强化项: 1. 算法友好(关键词密度) 2. 信息密度 3. 短段落结构 4. 情绪化标题
弱化项: 1. 复杂论证 2. 长段落 3. 委婉表达
段落结构
短段落(每段≤3句)+ 关键词前置。 前3段必须出现核心关键词。 结构:情绪化标题→核心观点→支撑信息→结论
句式特点
- 短句为主,每段≤3句
- 关键词前置
- 信息密度高
- 开门见山
词汇特点
增补词汇:关键词、情绪词、热点词 禁用词汇:过于专业晦涩的术语
风险提示
必须有风险提示,可相对简化:「本文仅供参考,不构成投资建议」
写作提示词(用户可复制)
你是一位头条号作者,风格信息密度高,擅长算法友好写作。
写作时:情绪化标题;短段落每段≤3句;前3段有关键词;
关键词前置;结尾有简化风险提示。{作者名} × 微信长文 风格手册
平台基础信息
- 平台:微信公众号
- 内容形态:长文(深度分析/市场评论)
- 字数范围:1500-4000字
风格调整参数
| 参数 | 通用风格 | 微信长文 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N+0.5}/5 | +0.5 |
| 段落长度 | 200字 | 300字 | +100字 |
| 情感浓度 | {N}/5 | {N}/5 | 保持 |
差异化要点
强化项: 1. 论证逻辑链条 2. 数据精确性 3. 深度分析能力 4. 条件判断句式
弱化项: 1. 过于口语化的表达 2. emoji使用(保留但克制)
段落结构
6段式结构(市场概述→事件→外围→技术→资金→操作建议),每段300字左右。
句式特点
必须使用:
- 条件判断句:「若...则...」「若...大概率...」
- 概率性表达:「大概率」「或」「可能」
- 长句分析,逻辑递进
词汇特点
增补词汇:精准数据词汇、专业术语、论证连接词 禁用词汇:过于网络化的流行语、极端化表达
风险提示
每篇结尾必须包含完整风险提示:
- 数据来源标注
- 投资有风险,入市需谨慎
- 本文不构成投资建议
写作提示词(用户可复制)
你是一位专业的A股市场分析师,风格冷静克制,擅长用数据说话。
写作时:使用6段式结构,每段300字;使用条件判断句和概率性表达;
数据精确到小数点后2位;结尾必须有完整风险提示。{作者名} × 微博 风格手册
平台基础信息
- 平台:微博
- 内容形态:短文案(即时观点+话题互动)
- 字数范围:≤140字
风格调整参数
| 参数 | 通用风格 | 微博 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N-2}/5 | -2 |
| 段落长度 | 200字 | 单段落≤140字 | 大幅缩短 |
| 情感浓度 | {N}/5 | {N+0.5}/5 | +0.5 |
差异化要点
强化项: 1. 一句话核心观点 2. 话题标签组合 3. 互动引导 4. 即时性表达
弱化项: 1. 复杂论证 2. 长篇数据 3. 过于正式的表述
段落结构
单段落,140字以内。 结构:一句话观点(核心) + 1-2句补充 + 话题标签 + 互动引导
句式特点
- 极度口语化
- 一句话法则(删除所有不必要的词)
- 使用网络语言
- 反问/感叹增强感染力
词汇特点
增补词汇:网络流行语、话题标签(#XX#)、情绪词 禁用词汇:复杂术语、长句连接词
风险提示
极简风险词:「投资有风险,谨慎」
写作提示词(用户可复制)
你是一位微博博主,风格极度口语化,擅长用一句话引爆讨论。
写作时:单段落≤140字;一句话核心观点+补充+话题标签;
互动引导如"你怎么看?""认同的转"等。{作者名} × 小红书 风格手册
平台基础信息
- 平台:小红书
- 内容形态:图文笔记(情绪共鸣+可操作)
- 字数范围:500-1000字
风格调整参数
| 参数 | 通用风格 | 小红书 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N-1.5}/5 | -1.5 |
| 段落长度 | 200字 | 80字 | -120字 |
| 情感浓度 | {N}/5 | {N+1}/5 | +1 |
差异化要点
强化项: 1. 情绪共鸣 2. 个人体验 3. 视觉元素(emoji/标签) 4. 行动引导 5. 封面图概念
弱化项: 1. 长篇论证 2. 复杂数据呈现 3. 过于专业的术语
段落结构
短段落+空行,平均80字每段。 开头:情绪钩子/共鸣点 中间:个人经历/体验→价值点→可操作建议 结尾:固定收尾模板+互动引导
句式特点
- 短句为主,每段≤3句
- 大量使用 emoji 点缀
- 口语化表达
- 反问句引发共鸣
词汇特点
增补词汇:emoji、感叹词、网络流行语、情感形容词 禁用词汇:过于专业的财经术语、生硬的数据罗列
风险提示
固定收尾模板: 「以上仅为个人分享,不构成投资建议,投资有风险,入市需谨慎」
写作提示词(用户可复制)
你是一位亲切的小红书博主,擅长用个人体验引发共鸣。
写作时:短段落+空行,大量emoji,口语化表达;
开头用情绪钩子,结尾用固定风险提示模板;
标签:3泛4精2趋势,共9个标签。{作者名} × 知乎 风格手册
平台基础信息
- 平台:知乎
- 内容形态:长文(专业深度+论证完整)
- 字数范围:1000-3000字
风格调整参数
| 参数 | 通用风格 | 知乎长文 | 调整幅度 |
|---|---|---|---|
| 语气正式度 | {N}/5 | {N+0.5}/5 | +0.5 |
| 段落长度 | 200字 | 150字 | -50字 |
| 情感浓度 | {N}/5 | {N}/5 | 保持 |
差异化要点
强化项: 1. 论证结构完整性 2. 引用脚注规范 3. 逻辑严谨性 4. 专业深度展示
弱化项: 1. 过于口语化 2. 情绪化表达 3. 简化论证
段落结构
H1/H2/H3层级标题 + 论证式正文。 结构:问题定义→论点→论据→论证→结论→参考文献
句式特点
- 论证式行文,观点→论据→论证→结论
- 引用标注规范
- 逻辑连接词丰富
- 避免极端化表述
词汇特点
增补词汇:专业术语、学术表达、引用标注格式 禁用词汇:谣言、未经证实的数据、极端化表达
风险提示
必须有:
- 数据来源标注
- 引用脚注
- 「本文不构成投资建议」
写作提示词(用户可复制)
你是一位知乎专业回答者,风格严谨,擅长论证式写作。
写作时:H1/H2/H3层级标题完整;观点→论据→论证→结论结构;
引用数据注明来源;结尾必须包含风险提示。微信公众号 SEO 规则
标题优化
微信标题限制 64 字符。最佳长度 20-28 个中文字——太短信息不够,太长在信息流里会被截断。标题是打开率的决定性因素。
有效套路:
- 数字:「3 个方法」「90% 的人不知道」「5 分钟搞定」
- 信息差:「你以为...其实...」「被忽略的...」
- 反直觉:「为什么 X 反而更好」「别再...了」
- 痛点:直接戳目标读者的具体问题
避免:
- 标题党(震惊!必看!)— 微信会降权
- 太学术(「论 AI 在企业数字化转型中的应用」)
- 太模糊(「聊聊最近的一些想法」)
输出要求:生成 3 个备选标题,标注每个的策略(数字/信息差/反直觉/痛点)。
摘要优化
摘要限制 120 UTF-8 字节(约 54 个中文字,converter 自动截断)。
摘要出现在分享卡片和搜一搜结果中,要求:
- 包含核心关键词
- 制造悬念(「...结果出乎意料」)或给出价值承诺(「读完你会知道...」)
- 不要重复标题
正文关键词
- 核心关键词在前 200 字内出现(微信搜一搜权重最高的区域)
- 全文自然出现 3-5 次
- 用同义词/近义词替换部分,避免堆砌感
- 关键词出现在 H2 标题中加分
标签推荐
为文章推荐 5 个精准标签:
- 2 个行业大词(如:人工智能、产品设计)
- 2 个热点词(如:GPT-5、Sora)
- 1 个长尾词(如:AI 产品经理转型)
完读率优化
完读率直接影响微信推荐权重。以下排版和内容策略提升完读率:
段落控制:
- 每段不超过 150 字(手机屏幕上 4-5 行)
- 每 3-4 段后设置一个"钩子"(悬念、反转、金句),防止读者中途退出
视觉节奏:
- 每 400-500 字插入一张配图,打破纯文字的压迫感
- 关键数据/结论用加粗标记,让扫读的读者也能抓住重点
- H2 标题要有信息量(不要写"一、背景",要写"为什么 90% 的人都选错了")
进度感:
- 清单型文章天然有进度感(读者知道"还有几条")
- 其他类型文章,H2 标题数量控制在 2-4 个,让读者感觉"快看完了"
结尾留存:
- 结尾不要太长(≤100 字)
- CTA 要具体(不要"欢迎留言",要"你觉得哪个方案更靠谱?评论区聊聊")
风格配置说明
快速开始
1. 复制 style.example.yaml 为 style.yaml 2. 修改配置项 3. 对 Agent 说:「写一篇公众号文章」
也可以跳过手动配置——首次使用时 Agent 会通过对话引导你自动生成 style.yaml。
必填字段
name: "客户名称"
industry: "行业"
topics: # 内容方向(列表)
- "方向1"
- "方向2"
tone: "写作风格描述"
theme: "professional-clean" # 排版主题可选字段
target_audience: "目标受众描述"
voice: "写作人称和语感"
writing_persona: "midnight-friend" # 写作人格(见下方说明)
word_count: "1500-2500"
blacklist:
words: ["禁忌词1", "禁忌词2"]
topics: ["禁忌话题1"]
reference_accounts: ["参考账号1", "参考账号2"]
cover_style: "封面风格描述"
cover_template: "/path/to/cover.png" # 设置后跳过 AI 生成封面
author: "署名"可用排版主题
运行 python3 toolkit/cli.py gallery 可在浏览器中预览所有主题的实际效果。
| 主题 | 说明 |
|---|---|
| professional-clean | 专业简洁(默认,适合大部分商业内容) |
| tech-modern | 科技风(蓝紫渐变,适合技术/产品类) |
| warm-editorial | 暖色编辑风(适合生活/文化类) |
| minimal | 极简黑白(适合文学/严肃内容) |
| bytedance | 字节风(品牌蓝,现代大间距) |
| sspai | 少数派风(暖白底,红色点缀,清爽文艺) |
| newspaper | 报纸风(米黄底,深棕文字,衬线感) |
| bauhaus | 包豪斯(黑白为主,红蓝黄色块点缀) |
| ink | 水墨风(宣纸底,中文衬线,留白多) |
| midnight | 午夜深色(深蓝黑底,蓝色高亮) |
| bold-green | 大胆绿(森林绿主色,适合环保/健康) |
| bold-navy | 大胆藏青(藏青主色,适合金融/商务) |
| elegant-rose | 优雅玫瑰(浅粉底,玫瑰点缀,适合女性/生活) |
| minimal-gold | 极简金(金色细线点缀,奢华但克制) |
| focus-red | 聚焦红(中国红标题,适合新闻/评论) |
| github | GitHub 风(蓝色链接,等宽代码块,开发者友好) |
设计品味准则(全模具通用)
所有模具生成 HTML 前,必须经过本准则校验。这是视觉质量的底线。
1. 基线参数
| 维度 | 默认值 | 含义 |
|---|---|---|
| DESIGN_VARIANCE | 8 | 1=完美对称,10=艺术混沌 |
| VISUAL_DENSITY | 4 | 1=画廊留白,10=驾驶舱信息密度 |
根据模具自动调整:
-l长图:DESIGN_VARIANCE=5, VISUAL_DENSITY=3(阅读舒适优先)。变化通过色调感知实现——不同内容气质对应不同背景底色和强调色(见 mode-long.md 步骤 2.5)-i信息图:DESIGN_VARIANCE=7, VISUAL_DENSITY=8(数据密度优先)。变化通过动态 REF 编码和内容驱动的自定义布局实现-c海报:DESIGN_VARIANCE=9, VISUAL_DENSITY=2(视觉冲击优先)。与长图共享色调系统,结尾标记仅在末页出现
2. 排版工程
标题
- 大标题:
tracking-tighter(字间距紧凑),leading-none(行高极小) - 禁用 Inter 字体。长图/海报用衬线体(Noto Serif SC),信息图用等宽+无衬线混排
- 仪表盘/技术类场景严禁衬线体——只用高端无衬线(Geist、Satoshi、Cabinet Grotesk)
正文
- 默认:
text-base、leading-relaxed、最大行宽65ch -i信息图:正文 ≥36px、行高 ≥1.6、标注 ≥24px(手机端 1080px→390px 缩放 2.8 倍后需可读)- 段落文本颜色避免纯黑,用
#333或#4a4a4a等深灰
数字
- 当 VISUAL_DENSITY > 7(信息图模式),所有数字用等宽字体(
font-family: monospace)
3. 色彩校准
硬性规则
- 最多 1 个强调色,饱和度 < 80%
- 禁止「AI 紫蓝」:紫色按钮光晕、霓虹渐变一律禁止
- 同一张图内严格统一冷暖调——不在暖灰和冷灰之间摇摆
- 禁止纯黑
#000000:用 Off-Black(#1a1a1a)、Zinc-950 或炭灰
渐变约束
- 不要对大标题使用渐变填充文字
- 背景渐变仅限微妙过渡,避免色彩跳跃
4. 布局多样化
DESIGN_VARIANCE > 4 时
- 禁止居中 Hero:标题不要默认居中。用左对齐、分屏、非对称留白
- 禁止「三等分卡片」:3 列等宽并排是 AI 生成的头号标志。用 2 列锯齿、非对称网格、或横向滚动替代
DESIGN_VARIANCE ≥ 8 时
- 使用 CSS Grid 分数单位(如
grid-template-columns: 2fr 1fr 1fr) - 允许大面积留白(
padding-left: 20vw级别的空间感) - 允许 Masonry 式错落布局
卡片与容器
- 卡片仅在层级关系(elevation)有功能需求时使用
- 数据指标让它们「呼吸」——用
border-top、divide-y或纯留白分组,而非一个个方盒子 - 阴影必须染色(与背景色调一致),不要灰色默认阴影
5. AI 生成禁忌清单
生成任何视觉内容前,逐项排查以下 AI 典型痕迹:
视觉 & CSS
- 禁止外发光:不要
box-shadow默认光晕。用内边框或染色阴影 - 禁止过饱和强调色:强调色必须与中性色优雅融合
- 禁止自定义鼠标指针(静态图不涉及,但生成 HTML 时也不要加)
排版
- 禁止 Inter 字体:用 Geist、Outfit、Cabinet Grotesk 或 Satoshi
- 禁止 H1 尖叫:标题不要靠单纯放大来建立层级。用字重和颜色控制
内容 & 数据(「Jane Doe 效应」)
- 禁止通用人名:John Doe、Sarah Chan、Jack Su 禁止出现。用有创意的真实名字
- 禁止假数据:不要
99.99%、50%、1234567。用有机的「脏」数据(47.2%、+1 (312) 847-1928) - 禁止创业烂名:Acme、Nexus、SmartFlow 禁止。发明有品味的品牌名
- 禁止 AI 文案腔:「赋能」「无缝」「释放」「下一代」禁止。用具体动词
- 禁止 Unsplash 链接:如需占位图,用
https://picsum.photos/seed/{随机字符串}/800/600或 SVG
间距 & 对齐
- padding 和 margin 必须数学精确,不留尴尬间隙
- 相邻元素严格对齐,视觉线条贯通
6. 材质与表面
玻璃态(Glassmorphism)
如需毛玻璃效果,不要只用 backdrop-blur。必须叠加:
- 1px 内边框:
border: 1px solid rgba(255,255,255,0.1) - 微妙内阴影:
box-shadow: inset 0 1px 0 rgba(255,255,255,0.1)
模拟物理边缘折射。
圆角
- 主容器用大圆角(
border-radius: 2.5rem) - 扩散阴影(极淡、大范围):
box-shadow: 0 20px 40px -15px rgba(0,0,0,0.05)
7. 出厂自检
生成 HTML 后、截图前,逐项确认:
- [ ] 是否避免了居中 Hero(DESIGN_VARIANCE > 4 时)?
- [ ] 是否避免了三等分等宽卡片?
- [ ] 标题是否用了非 Inter 字体?
- [ ] 颜色是否统一冷暖调,无纯黑?
- [ ] 强调色是否 ≤ 1 个且饱和度 < 80%?
- [ ] 数据是否真实感(非 99.99% 式假数据)?
- [ ] 文案是否去除了 AI 腔(赋能/无缝/释放)?
- [ ] 间距是否数学精确,无尴尬留白?
- [ ] 阴影是否染色(非灰色默认)?
选题评估规则
你的角色
你是一个公众号选题编辑。你的目标是从热点列表中挑出 10 个值得写的选题——既要有热度,又要跟客户定位匹配,还要有独特的切入角度。
输入
- 热点列表(JSON,包含 title/source/hot/url/description)
- 客户 style.yaml 中的:topics、target_audience、blacklist、content_style
- 客户 history.yaml 中的:已发布文章的 topic_keywords 和 stats(如有)
- seo_keywords.py 输出:关键词的 seo_score 和 related_keywords(如有)
评估维度
对每个热点,按三个维度打分(1-10):
热度分(权重 30%)
看这个话题有多火:
- 热搜前 10 → 8-10 分
- 热搜 10-30 → 5-7 分
- 30 名之后 → 1-4 分
- 多个平台同时出现 → 加 2 分(封顶 10)
相关度分(权重 40%)
看这个话题跟客户定位有多契合:
- 直接命中 topics 列表 → 8-10 分
- 间接相关(比如客户做"AI",热点是"芯片出口管制")→ 5-7 分
- 勉强能扯上关系 → 3-4 分
- 完全无关 → 0 分
- 命中 blacklist 的词汇或话题 → 直接判 0,整个选题淘汰
切入价值分(权重 30%)
看这个话题写出来能不能好看:
- 有明确的反直觉点或信息差 → 8-10 分
- 有争议、有正反两面可以讨论 → 6-7 分
- 纯资讯类、搬运即可 → 3-4 分
- 太复杂不适合 2000 字展开,或太浅没东西可写 → 1-2 分
content_style 加成
根据客户的 content_style,对切入价值分做加成:
| content_style | 加分条件 | 加分 |
|---|---|---|
| 干货 | 选题能输出方法论/工具/教程 | +2 |
| 故事 | 选题有人物、有情节、有转折 | +2 |
| 情绪 | 选题能引发共鸣、愤怒、感动 | +2 |
| 热点 | 选题正在热搜前 10 | +2 |
| 测评 | 选题涉及产品/工具/方案对比 | +2 |
加成后封顶 10 分。
综合评分
总分 = 热度 × 0.3 + 相关度 × 0.4 + 切入价值(含加成) × 0.3输出格式
列出 Top 10 选题(按总分降序),每个包含:
### 选题 {序号}: {选题标题}(总分 X.X)
- 对应标题(20-28字):"{为这个选题拟的公众号标题}"
- 切入角度:{1-2 句话说明怎么写、从什么角度切}
- 热度:X/10 | 相关度:X/10 | 切入价值:X/10
- 点击率潜力:{高/中/低} — {原因,如"标题含数字+反直觉,点击率高"}
- SEO 友好度:{seo_score}/10 — {引用 seo_keywords.py 的数据,如"百度 8 + 360 10,相关词丰富"}
- 推荐框架:{痛点型/故事型/清单型/对比型/热点解读型}
- 推荐理由:{为什么这个值得写}
- 历史标记:{如果 history.yaml 中近 7 天有相同关键词,标注"⚠️ 近期已覆盖类似话题"}历史去重规则
读取 history.yaml 中最近 30 天的文章记录,提取所有 topic_keywords。
- 如果选题的核心关键词在最近 7 天已出现 → 综合评分扣 3 分,并标注"⚠️ 近期已覆盖"
- 如果在7-30 天内出现 → 综合评分扣 1 分,标注"ℹ️ 月内有相关文章"
- 超过 30 天 → 不扣分
历史效果闭环
如果 history.yaml 中有带 stats 的文章(阅读量、分享量),做以下分析:
1. 框架偏好:统计每种 framework 的平均阅读量和分享率 → 推荐框架时,表现好的框架加 1-2 分 2. 增强策略偏好:统计每种 enhance_strategy 的平均表现 → 在 Step 3.2 选择增强策略时参考 3. 标题风格:分析高表现文章的标题特征(数字型/反直觉/痛点/提问)→ 拟标题时参考 4. content_style 验证:如果用户设置的 content_style 与实际高表现文章的类型不符 → 在选题报告末尾提示
不要强制套用——只作为加权信号,选题本身的质量仍然最重要。stats 数据不足 5 篇时跳过此分析。
常青选题
除了热点选题,额外生成 2-3 个常青选题——不依赖时效性,长尾流量价值高。
常青选题来源:
- 从用户的
topics列表出发,生成教程/方法论/经验总结/工具推荐类选题 - 参考 SEO 数据中搜索量高但竞争度低的关键词
- 如果有 history.yaml,避免与已写过的常青内容重复
常青选题的评分规则:
- 热度分固定为 5(不依赖热搜,但也不是 0)
- 相关度和切入价值正常评分
- 标注"🌲 常青",与热点选题混排
选题不足时的处理
- 热点选题 + 常青选题合计 10 个
- 如果热点相关度 ≥ 5 的不足 7 个,用常青选题补足
- 如果加上常青仍不足 10 个,告诉用户"今天热点跟你的领域匹配度不高",输出能找到的 + 建议用户自己给选题
注意
- 不要只挑热度最高的。一个热度 6 分但相关度 10 分的选题,往往比热度 10 分但相关度 3 分的更好
- 每个选题必须配一个拟好的标题(20-28字),不是热点原标题
- 推荐框架要根据选题特征和 content_style 来选,不要全推同一种
- SEO 友好度必须引用 seo_keywords.py 的数据(如果有),不要纯靠猜
视觉AI模块
你的任务
为文章生成两类视觉素材的 AI 绘图提示词:封面图(3 组差异化创意)和内文配图(3-6 张,按段落匹配)。
你不负责生成图片本身——你输出的是结构化的提示词,用户可以拿去任何 AI 绘图工具(即梦、文心一格、Midjourney、DALL-E)使用。
---
一、封面图(3 组创意)
生成规则
每组创意走不同的视觉策略,确保差异化:
创意 A: 直觉冲击型
- 策略:用一个视觉隐喻直接表达文章核心观点
- 适合:热点类、观点类文章
- 风格:大胆、对比强烈、第一眼抓眼球
创意 B: 氛围渲染型
- 策略:营造一种情绪或场景氛围,引发好奇
- 适合:故事类、情绪类文章
- 风格:细腻、有质感、让人想点进去看
创意 C: 信息图表型
- 策略:用简洁的图形/图标/数据可视化传递信息
- 适合:干货类、清单类、测评类文章
- 风格:简洁、专业、一眼看懂文章主题
提示词格式
每组输出:
### 封面创意 A: {创意名称}
- 视觉描述:{详细的画面描述,100-150字}
- 色调:{主色+辅色}
- 构图:{横版 16:9,主体位置、留白位置}
- 文字区域:{标题放在什么位置,需要留多大空间}
- AI 绘图提示词:
"{英文提示词,适配主流 AI 绘图工具,包含风格、构图、色调、光影}"
- 适配工具建议:{即梦/文心一格/Midjourney/DALL-E 中哪个最适合}实体锚定(必须)
生成提示词之前,先从文章中提取 3-5 个具体实体:
- 人物/角色("短剧导演"、"AI 工程师")
- 产品/技术("Sora"、"数字人"、"大模型")
- 场景("拍摄片场"、"手机竖屏播放"、"服务器机房")
- 数据/趋势("成本曲线下降"、"90% 亏损率")
硬规则:
- 每条提示词必须包含至少 2 个文章实体
- 禁止用"科技感"、"未来感"、"商务感"、"数据背景"等泛化词替代具体内容——这些词可以作为风格修饰,但不能作为画面主体
- 自检方法:如果一个没读过文章的人看到这条提示词,能猜出文章大概在讲什么吗?不能 → 重写
反例 → 正例:
- ❌ "蓝色科技背景,数据流动,未来感" → ✅ "AI 生成的短剧角色走出手机屏幕,背景是废弃的真人拍摄片场,蓝色冷光"
- ❌ "商务办公场景,专业氛围" → ✅ "一个仓库货架上堆满退货包裹,旁边屏幕显示飙升的退货率曲线"
提示词撰写要点
- 始终指定
16:9 aspect ratio, horizontal composition - 避免生成文字(AI 绘图工具生成的文字通常是乱码)
- 指定
no text, no letters, no words防止出现乱码文字 - 为标题留出干净的空间:
clean space on the left/right/bottom for text overlay - 色调与客户 style.yaml 的 cover_style 对齐
- 风格关键词要具体:不说"好看",说"flat design, soft gradient, minimalist"
---
风格锚定
封面确认后,立即提取视觉锚点,后续所有内文配图必须复用:
视觉锚点:
- 色板:{封面的主色 hex + 辅色 hex,如 #2563EB + #F97316}
- 风格关键词:{封面的风格描述,如 "flat illustration, minimalist, bold outlines"}
- 画面调性:{冷调/暖调/中性}规则:
- 每条内文配图提示词的末尾,必须附加视觉锚点中的色板和风格关键词
- 如果封面是暖调,内文配图不能突然切换为冷调科技风(反之亦然)
- 视觉锚点在整篇文章的所有配图中保持一致
---
二、内文配图(3-6 张)
分析流程
写作完成后(Step 5 终稿),按以下步骤分析配图位置:
第一步:提取结构
- 列出所有 H2 标题及其下属段落
- 统计每个论点段落的字数和核心内容
第二步:逐个论点判断
对每个 H2 论点,判断是否需要配图:
| 需要配图(优先级高→低) | 不需要配图 |
|---|---|
| 有具体数据/统计 → 信息图强化 | 纯观点论述、篇幅短(<200字) |
| 有场景描写 → 画面还原 | 已经有引用块或代码块(视觉已丰富) |
| 转折/高潮处 → 视觉冲击 | 紧接着另一张配图(间距不足300字) |
| 长段落后(>400字无图) → 节奏调节 | 结尾 CTA 段落 |
第三步:确定图片类型
根据段落内容,为每张配图选择最匹配的类型:
| 类型 | 适用内容 | 核心构图 |
|---|---|---|
| infographic | 数据、统计、指标对比 | 区域分块 + 标签标注 |
| scene | 叙事场景、情绪渲染、人物故事 | 焦点主体 + 氛围光影 |
| flowchart | 流程、步骤、工作流 | 步骤节点 + 连接箭头 |
| comparison | 两个方案/观点对比 | 左右分栏 + 分隔线 |
| framework | 概念模型、架构关系 | 层级节点 + 关系连线 |
| timeline | 时间线、发展历程 | 时间轴 + 里程碑标记 |
第四步:确定位置
- 配图插入在对应段落之后(不是之前)
- 具体到"H2 XX 下的第 N 段之后"
约束规则:
- 总数 3-6 张(1500字→3张,2000字→4张,2500字→5-6张)
- 相邻两张配图之间至少间隔 300 字
- 不要在文章第一段之前放配图
- 不要在结尾 CTA 段落放配图
结构化提示词模板
根据图片类型,使用对应的结构化模板生成提示词。禁止自由文本描述——所有提示词必须填写模板的每个字段。
infographic(信息图)
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 类型:infographic
- 对应内容:{1句话概括}
Layout: {grid / radial / hierarchical}
Zones:
- Zone 1: {具体数据点,用文章真实数字}
- Zone 2: {对比/趋势,用文章真实数字}
- Zone 3: {结论/要点}
Labels: {文章中的真实数字、术语、指标名}
Colors: {视觉锚点色板}
Style: {视觉锚点风格关键词}, clean infographic, no text
Aspect: 16:9
- 备选方案:{Unsplash/Pexels 搜索关键词}scene(场景)
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 类型:scene
- 对应内容:{1句话概括}
Focal Point: {画面主体,必须是文章实体}
Atmosphere: {光影、环境、时间}
Mood: {情绪基调}
Color Temperature: {warm / cool / neutral,与视觉锚点一致}
Style: {视觉锚点风格关键词}, no text no letters
Aspect: 16:9
- 备选方案:{Unsplash/Pexels 搜索关键词}flowchart(流程图)
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 类型:flowchart
- 对应内容:{1句话概括}
Layout: {left-right / top-down / circular}
Steps:
1. {步骤名} — {简述}
2. {步骤名} — {简述}
3. {步骤名} — {简述}
Connections: {箭头方向、决策分支}
Colors: {视觉锚点色板}
Style: {视觉锚点风格关键词}, clean diagram, no text
Aspect: 16:9
- 备选方案:{Unsplash/Pexels 搜索关键词}comparison(对比图)
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 类型:comparison
- 对应内容:{1句话概括}
Left Side — {选项A名称}:
- {要点1}
- {要点2}
Right Side — {选项B名称}:
- {要点1}
- {要点2}
Divider: {分隔线样式}
Colors: {视觉锚点色板,左右各用一个主色}
Style: {视觉锚点风格关键词}, split layout, no text
Aspect: 16:9
- 备选方案:{Unsplash/Pexels 搜索关键词}framework(架构图)
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 类型:framework
- 对应内容:{1句话概括}
Structure: {hierarchical / network / matrix}
Nodes:
- {概念1} — {角色}
- {概念2} — {角色}
- {概念3} — {角色}
Relationships: {节点间如何连接}
Colors: {视觉锚点色板}
Style: {视觉锚点风格关键词}, clean diagram, no text
Aspect: 16:9
- 备选方案:{Unsplash/Pexels 搜索关键词}timeline(时间线)
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 类型:timeline
- 对应内容:{1句话概括}
Direction: {horizontal / vertical}
Events:
- {时间点1}: {里程碑}
- {时间点2}: {里程碑}
- {时间点3}: {里程碑}
Markers: {视觉标记样式}
Colors: {视觉锚点色板}
Style: {视觉锚点风格关键词}, clean timeline, no text
Aspect: 16:9
- 备选方案:{Unsplash/Pexels 搜索关键词}内文配图通用要求
- 尺寸统一 16:9 横版(image_gen.py --size article)
- 视觉锚定:每条提示词的 Colors 和 Style 字段必须引用封面提取的视觉锚点
- 实体锚定规则同封面——每条提示词至少包含 2 个文章实体
- 不要太复杂——手机屏幕上看,简洁的图比复杂的图好
- 提示词用中文(seedream 中文理解强)
- 每张图都提供一个免费图库备选关键词,以防生图效果不佳
---
三、辅助功能
提示词修改
如果用户说"封面创意 A 我喜欢方向但是想要更暖的色调",只修改对应创意的提示词,其他不变。
创意切换
如果用户说"封面我想要更多选择",在 A/B/C 三种策略的基础上,为用户偏好的策略再出 2 个变体(比如"直觉冲击型的变体 1 和变体 2")。
配图场景调整
如果用户说"第 3 张配图位置不对"或"这段不需要图",按用户要求增删调整。
---
输出示例
## 封面图创意
### 创意 A: 天平失衡(直觉冲击型)
- 视觉描述:一个巨大的天平,左边是中国国旗配色的芯片堆叠,右边是美国国旗配色的芯片,天平明显向左倾斜。背景是深蓝色数据流。
- 色调:深蓝 + 科技蓝 + 金色点缀
- 构图:16:9 横版,天平居中,右侧 1/3 留白放标题
- 文字区域:右侧留出干净空间
- AI 绘图提示词:
"A large balance scale, left side stacked with red-themed microchips, right side with blue-themed microchips, scale tilting left, dark blue background with flowing data streams, flat design, minimalist, tech aesthetic, 16:9 aspect ratio, clean space on the right third for text overlay, no text no letters no words"
- 适配工具建议:即梦(国内场景理解好)
## 内文配图
### 配图 1: 位于"数字背后是什么"段落后
- 配图目的:信息强化
- 画面描述:一个简洁的柱状图,展示中美大模型调用量的对比,中国柱子更高但带有问号标记
- 尺寸:1:1 方形
- AI 绘图提示词:
"Minimalist bar chart comparing two bars, left bar taller in red, right bar shorter in blue, question mark floating above the taller bar, clean white background, flat infographic style, 1:1 square, no text"
- 备选方案:Unsplash 搜 "data comparison chart technology"markdown>=3.5
beautifulsoup4>=4.12
cssutils>=2.9
requests>=2.31
camoufox[geoip]>=0.4
pyyaml>=6.0
Pygments>=2.15
Pillow>=10.0
#!/usr/bin/env python3
"""
Build OpenClaw-compatible SKILL.md from Claude Code source.
Usage:
python3 scripts/build_openclaw.py # output to dist/openclaw/
python3 scripts/build_openclaw.py -o \/oc # custom output dir
"""
import argparse
import re
import shutil
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent
# Directories to copy alongside SKILL.md
COPY_DIRS = ["references", "scripts", "toolkit", "personas"]
# Files to copy alongside SKILL.md
COPY_FILES = [
"requirements.txt",
"config.example.yaml",
"style.example.yaml",
"writing-config.example.yaml",
"VERSION",
]
# Frontmatter keys to strip (OpenClaw ignores allowed-tools)
STRIP_FRONTMATTER_KEYS = {"allowed-tools"}
def transform_frontmatter(frontmatter: str) -> str:
"""Remove Claude Code-specific frontmatter keys."""
lines = frontmatter.split("\n")
result = []
skip_block = False
for line in lines:
# Check if this line starts a key we want to strip
stripped = line.lstrip()
if any(stripped.startswith(f"{key}:") for key in STRIP_FRONTMATTER_KEYS):
skip_block = True
continue
# If we're in a skip block, skip indented continuation lines (list items)
if skip_block:
if stripped.startswith("- ") or stripped == "":
continue
skip_block = False
result.append(line)
return "\n".join(result)
def transform_body(body: str) -> str:
"""Apply all body transformations."""
# 1. {skill_dir} → {baseDir}
body = body.replace("{skill_dir}", "{baseDir}")
# 2. WebSearch references in instructions (preserve in bash code blocks)
# "WebSearch:" as instruction prefix → "web_search:"
# "WebSearch " in prose → "web_search "
body = re.sub(r'(?m)^WebSearch:', 'web_search:', body)
body = re.sub(r'(?<![`/])WebSearch(?=[ ":,)])', 'web_search', body)
# WebSearch in parentheses/tables: "(WebSearch)"
body = re.sub(r'(?<=()WebSearch(?=))', 'web_search', body)
# 3. Path convention note
body = body.replace(
"本文档中 `{baseDir}` 指本 SKILL.md 所在的目录(即 爆款智坊 的根目录)",
"本文档中 `{baseDir}` 指本 SKILL.md 所在的目录(即 爆款智坊 的根目录)",
)
return body
def split_frontmatter(text: str) -> tuple[str, str]:
"""Split YAML frontmatter from body. Returns (frontmatter, body)."""
if not text.startswith("---"):
return "", text
end = text.find("\n---", 3)
if end == -1:
return "", text
# +4 to skip the closing "---\n"
fm = text[3:end].strip()
body = text[end + 4:] # skip "\n---"
return fm, body
def build(output_dir: Path):
skill_src = REPO_ROOT / "SKILL.md"
text = skill_src.read_text(encoding="utf-8")
fm, body = split_frontmatter(text)
fm = transform_frontmatter(fm)
body = transform_body(body)
out_skill = output_dir / "SKILL.md"
output_dir.mkdir(parents=True, exist_ok=True)
out_skill.write_text(f"---\n{fm}\n---{body}", encoding="utf-8")
print(f" SKILL.md → {out_skill}")
# Copy supporting directories
for d in COPY_DIRS:
src = REPO_ROOT / d
dst = output_dir / d
if src.is_dir():
if dst.exists():
shutil.rmtree(dst)
shutil.copytree(src, dst, ignore=shutil.ignore_patterns(
"__pycache__", "*.pyc", "*.pyo",
))
print(f" {d}/ → {dst}")
# Copy supporting files
for f in COPY_FILES:
src = REPO_ROOT / f
if src.is_file():
shutil.copy2(src, output_dir / f)
print(f" {f} → {output_dir / f}")
print(f"\nDone. OpenClaw skill at: {output_dir}")
def main():
parser = argparse.ArgumentParser(description="Build OpenClaw-compatible 爆款智坊 skill")
parser.add_argument(
"-o", "--output",
default=str(REPO_ROOT / "dist" / "openclaw"),
help="Output directory (default: dist/openclaw/)",
)
args = parser.parse_args()
build(Path(args.output))
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
SEO keyword research tool.
Queries real search data to evaluate keyword popularity:
1. Baidu search suggestions (autocomplete volume proxy)
2. Baidu related searches
3. WeChat sogou index (search volume proxy)
Usage:
python3 seo_keywords.py "AI大模型"
python3 seo_keywords.py "AI大模型" "科技股" "创业"
python3 seo_keywords.py --json "AI大模型"
Output: keyword popularity score, related keywords, trending signals.
"""
import argparse
import json
import sys
import urllib.parse
import requests
TIMEOUT = 10
HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
}
def baidu_suggestions(keyword: str) -> list[str]:
"""Get Baidu search autocomplete suggestions — proxy for search volume."""
try:
resp = requests.get(
"https://suggestion.baidu.com/su",
params={"wd": keyword, "action": "opensearch", "ie": "utf-8"},
headers=HEADERS,
timeout=TIMEOUT,
)
data = resp.json()
# Response format: [query, [suggestions...]]
if isinstance(data, list) and len(data) >= 2:
return data[1]
return []
except Exception as e:
print(f"[warn] baidu suggestions failed: {e}", file=sys.stderr)
return []
def so360_suggestions(keyword: str) -> list[str]:
"""Get 360 search suggestions — second source for search volume proxy."""
try:
resp = requests.get(
"https://sug.so.360.cn/suggest",
params={"word": keyword, "encodein": "utf-8", "encodeout": "utf-8", "format": "json"},
headers=HEADERS,
timeout=TIMEOUT,
)
data = resp.json()
return [item.get("word", "") for item in data.get("result", []) if item.get("word")]
except Exception as e:
print(f"[warn] 360 suggestions failed: {e}", file=sys.stderr)
return []
def analyze_keyword(keyword: str) -> dict:
"""Analyze a keyword's SEO potential."""
baidu_suggs = baidu_suggestions(keyword)
so360_suggs = so360_suggestions(keyword)
# Popularity score (0-10) based on suggestion count
# More suggestions = more search demand
baidu_score = min(len(baidu_suggs), 10)
so360_score = min(len(so360_suggs), 10)
# Combined score: average of two sources
combined_score = round((baidu_score + so360_score) / 2, 1)
# Extract related keywords (dedup)
all_related = list(dict.fromkeys(baidu_suggs + so360_suggs))
return {
"keyword": keyword,
"seo_score": combined_score,
"baidu_score": baidu_score,
"so360_score": so360_score,
"baidu_suggestions": baidu_suggs[:5],
"so360_suggestions": so360_suggs[:5],
"related_keywords": all_related[:10],
}
def main():
parser = argparse.ArgumentParser(description="SEO keyword analysis")
parser.add_argument("keywords", nargs="+", help="Keywords to analyze")
parser.add_argument("--json", action="store_true", help="Output as JSON")
args = parser.parse_args()
results = []
for kw in args.keywords:
result = analyze_keyword(kw)
results.append(result)
if args.json:
json.dump(results, sys.stdout, ensure_ascii=False, indent=2)
else:
for r in results:
print(f"\n关键词: {r['keyword']}")
print(f" 综合 SEO 评分: {r['seo_score']}/10(百度 {r['baidu_score']} + 360 {r['so360_score']})")
if r["so360_suggestions"]:
print(f" 360热搜词: {', '.join(r['so360_suggestions'][:5])}")
if r["related_keywords"]:
print(f" 相关关键词: {', '.join(r['related_keywords'][:5])}")
if __name__ == "__main__":
main()