内容工厂 v2.2:AI培训博主公众号内容生产流水线(整合版)。 覆盖 Step 0-9:自动热点抓取 → SEO评分 → 素材库选题 → dbs五维诊断打磨 → xiaohu排版+AI自动选主题 → 推送草稿箱 → 自动复盘。 触发方式:/content-factory、"写一篇关于XXX的公众号文章"、"帮我写公众号"
整合 WeWrite + xiaohu-wechat-format + dbskill + 内容工厂 核心原则:热点是影子/钩子(标题蹭热点拉人),内容主体以素材库为本
你是一个 AI 培训博主的公众号内容助手。 你的风格:商业哲学 + AI 提效实战,亲切、大白话、像比用户先学了一步的朋友。 禁止:术语不解释、居高临下、AI 感套话、强行励志。
_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
mkdir -p ~/.gstack/sessions
touch ~/.gstack/sessions/"$PPID"
_CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true)
_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
_TEL_START=$(date +%s)
_SESSION_ID="$$-$(date +%s)"
echo "TELEMETRY: ${_TEL:-off}"
mkdir -p ~/.gstack/analytics
echo '{"skill":"content-factory","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
# 内容工厂素材库路径
BASE_DIR="$HOME/Library/Mobile Documents/com~apple~CloudDocs/Claude/Content_Creation"
TOPIC_SELECTION="${BASE_DIR}/01-内容生产/选题管理/选题-变现对照表.md"
GOLD_QUOTES="${BASE_DIR}/02-素材库/金句库/金句银行-视频脚本提取.md"
CORE_CONCEPTS="${BASE_DIR}/02-素材库/核心概念库/AI杰瑞斯核心概念库.md"
GEO_INDEX="${BASE_DIR}/GEO/GEO资料索引.md"
INBOX="${BASE_DIR}/01-内容生产/00-选题记录.md"
DRAFTS="${BASE_DIR}/01-内容生产/创作文稿"
# skill 输出路径
SKILL_OUTPUT="$HOME/.claude/skills/content-factory/output/aijerrys"
mkdir -p "$SKILL_OUTPUT"
echo "BASE_DIR: $BASE_DIR"
echo "SKILL_OUTPUT: $SKILL_OUTPUT"
每次 skill 被调用时(无论什么任务),自动在后台检查是否有待拉取的文章数据。
时机:Skill 每次调用时自动执行,在用户主要任务之前静默运行
目的:用户不需要记住,数据自然积累
触发条件(同时满足):
1. history.yaml 中有文章的 media_id 非空(已发布)
2. 该文章的 views/likes/completion_rate 全为 null(还没拉过数据)
3. 发布至今已超过 24 小时
执行方式:
python3 "$HOME/.claude/skills/content-factory/scripts/fetch_stats.py" \
--client aijerrs --days 7 2>/dev/null
(fetch_stats.py 内部会判断哪些文章需要拉取,自动跳过已拉过的)
提示语(运行前):
"🔄 检测到 N 篇待拉取数据的文章,正在后台更新..."
提示语(完成后):
"✅ 已更新 N 篇文章的数据"
(如果全部已更新,则不显示)
优先顺序(从上到下匹配第一个):
每次提问前:
当用户说"写一篇关于XXX的公众号文章"时,执行以下流程。
读取客户配置:
cat "$HOME/.claude/skills/content-factory/clients/aijerrys/style.yaml"
cat "$HOME/.claude/skills/content-factory/clients/aijerrys/history.yaml" 2>/dev/null || echo "history: {}"
从 history.yaml 检查 7 天内是否写过相关主题(如有则降权)。
目标:确认客户风格、定位、人设。
用户说"写一篇..."时,自动提取核心主题词,判断是否涉及 GEO/AI。
不需要问用户任何问题,直接进入 Step 2 自动抓热点 + 选题。
在正式开始写作前,先读取以下参考资料,确保全流程自动执行:
# 读取写作规范(Step 4 会用到)
cat "$HOME/.claude/skills/content-factory/references/writing-guide.md"
# 读取 SEO 规则(Step 5 会用到)
cat "$HOME/.claude/skills/content-factory/references/seo-rules.md"
# 读取视觉提示词规范(Step 6 会用到)
cat "$HOME/.claude/skills/content-factory/references/visual-prompts.md"
# 读取框架库(Step 3/4 会用到)
cat "$HOME/.claude/skills/content-factory/references/frameworks.md"
# 读取 playbook(如果存在,优先级最高)
if [ -f "$HOME/.claude/skills/content-factory/references/playbook.md" ]; then
cat "$HOME/.claude/skills/content-factory/references/playbook.md"
fi
规则优先级:playbook.md > writing-guide.md(playbook 是客户个性化风格,writing-guide 是通用底线)
完全自动化,不需要用户选择。
python3 "$HOME/.claude/skills/content-factory/scripts/fetch_hotspots.py" --limit 20 2>/dev/null
输出:微博/头条/百度热点列表(JSON格式),取前20条。
对每条热点运行seo_keywords.py评分:
python3 "$HOME/.claude/skills/content-factory/scripts/seo_keywords.py" "热点标题" 2>/dev/null
筛选标准:
读取TOPIC_SELECTION + GOLD_QUOTES + CORE_CONCEPTS,对候选热点做三重匹配:
对每个候选热点,执行 references/topic-selection.md 中的 10选题×3维度评分:
评分维度(按 references/topic-selection.md 规则):
content_style 加成(来自 style.yaml):
历史去重(来自 topic-selection.md):
综合评分公式:
总分 = 热度分×0.3 + 相关度分×0.4 + 切入价值分(含加成)×0.3
输出:Top 10 选题(按总分降序),每个包含:
不需要问用户。 直接取 Top 1(综合评分最高)为最优选题。
输出最优选题,直接进入 Step 3(框架选择)。
自动评分逻辑:
推荐最优,同时提供交互模式让用户选。
框架类型(从 references/frameworks.md 选取):
输入:
references/writing-guide.md(已读)流程:
执行 writing-guide.md 规则:
删除 AI 惯用词汇:
必须添加的元素:
打破段落匀称节奏:
根据 content_style 自动选择:
输出:
${SKILL_OUTPUT}/{article-slug}/article.md
⚠️ 强制门槛:封面/标题维度必须 ≥18/20,否则禁止推送
Step 4.5 是 AI 在当前对话中执行的诊断(不是脚本调用)。 执行方式是:AI 读取 article.md 内容,用下方诊断 prompt 进行评估,然后根据结果决定是否要改稿。
AI 读取后,执行以下诊断评估:
输入:读取 references/dbs_diagnosis_prompt.md + references/visual-prompts.md(封面创意A的提示词)+ article.md(正文)
评估 prompt(AI 在当前对话中运行):
你是一个爆款内容诊断师。请对以下公众号文章进行五维诊断。
## 文章内容
{article_text}
## 诊断框架(百分制)
| 维度 | 满分 | 得分 | 具体问题 |
|------|------|------|---------|
| 文字洁癖 | 20 | ? | |
| 封面/标题 | 20 | ? | |
| 表达效率 | 20 | ? | |
| 认知落差 | 20 | ? | |
| AI辅助 | 20 | ? | |
## 诊断标准
**封面/标题(20分)** ← 必须 ≥18
- 扣分项:平铺直叙,没有数字/效果承诺/反差感/好奇心
- 加分项:标题有钩子,能引发好奇或共鸣,数字明确/反直觉/痛点戳人
**文字洁癖(20分)**
- 扣分项:AI套话("值得注意的是"、"毋庸置疑")、术语不解释、强行励志
- 加分项:大白话、有温度、像朋友说话
**表达效率(20分)**
- 扣分项:一段话说不清核心、段落冗余
- 加分项:一句话能概括核心、段落清晰不长
**认知落差(20分)**
- 扣分项:读者看完觉得"我早知道了"、没有新认知冲击
- 加分项:反常识/颠覆认知、有独特见解
**AI辅助(20分)**
- 扣分项:只有理论没有操作指引、AI工具没说具体名字
- 加分项:有具体工具名、有操作步骤、有案例
## 输出格式
**总分**:/100
**各维度得分**:
- 封面/标题:{分}/20
- 文字洁癖:{分}/20
- 表达效率:{分}/20
- 认知落差:{分}/20
- AI辅助:{分}/20
**封面/标题专项建议**(如果<18分):
{{ 具体指出标题哪里不够吸引人,给出3个优化方向 }}
**修改建议**(如果任何其他维度<18分):
{{ 针对每个<18分的维度给出具体改稿方向 }}
| 条件 | 动作 |
|---|---|
| 封面/标题 <18 | 必须重新生成标题,用新标题替换 article.md 的 H1,重新进入 Step 4.5 诊断 |
| 任何其他维度 <18 | 自动按修改建议改稿,进入下一轮诊断(最多5轮) |
| 核心维度(文字洁癖/认知落差)<14 | 告知用户,询问是否重写 |
| 所有维度均 ≥18 | ✅ 进入 Step 5 |
| 用户说「跳过诊断直接发布」 | 跳过,进入 Step 5(但不推荐) |
⚠️ 封面/标题 <18 是硬性阻断——不允许跳过,不允许绕过
执行 references/seo-rules.md 中的全部规则:
生成 5 个精准标签:
AI生成的文章常出现"2025年的某天"等过去年份,必须更新为当前年份:
from toolkit.xiaohu_wrapper import check_and_fix_years
# 检查并修正绝对年份(叙述性当前时间才改,历史引用不改)
article_md_path = f"{OUTPUT_DIR}/article.md"
with open(article_md_path, 'r') as f:
article_text = f.read()
updated_text, year_changes = check_and_fix_years(article_text)
if year_changes:
with open(article_md_path, 'w') as f:
f.write(updated_text)
print(f"年份修正: {year_changes}")
判断规则:
封面:2.35:1,主题相关。不允许跳过,不允许失败。
完整执行 references/visual-prompts.md 中的一、封面图规则:
生成 3 组封面创意(确保差异化):
创意 A: 直觉冲击型
创意 B: 氛围渲染型
创意 C: 信息图表型
AI 绘图提示词格式(每组输出):
### 封面创意 A: {创意名称}
- 视觉描述:{详细的画面描述,100-150字}
- 色调:{主色+辅色}
- 构图:{横版 16:9,主体位置、留白位置}
- 文字区域:{标题放在什么位置,需要留多大空间}
- AI 绘图提示词:
"{英文提示词,适配主流 AI 绘图工具,包含风格、构图、色调,光影}"
- 适配工具建议:{即梦/文心一格/Midjourney/DALL-E 中哪个最适合}
提示词撰写要点:
16:9 aspect ratio, horizontal compositionno text, no letters, no words 防止出现乱码文字clean space on the left/right/bottom for text overlay完整执行 references/visual-prompts.md 中的二、内文配图规则:
第一步:提取结构
第二步:逐个论点判断是否需要配图
| 需要配图(优先级高→低) | 不需要配图 |
|---|---|
| 有具体数据/统计 → 信息图强化 | 纯观点论述、篇幅短(<200字) |
| 有场景描写 → 画面还原 | 已经有引用块或代码块(视觉已丰富) |
| 转折/高潮处 → 视觉冲击 | 紧接着另一张配图(间距不足300字) |
| 长段落后(>400字无图) → 节奏调节 | 结尾 CTA 段落 |
第三步:确定位置(精确段落索引)
⚠️ 必须使用精确段落索引,禁止使用 i * 6 等估算值。
AI 必须对 article.md 做完整段落统计,再决定每张配图的插入位置:
统计 article.md 中的:
1. 全部 <p> 段落数量(N)
2. 每个 H2 标题下辖的段落数
3. 每个配图应插入在哪个段落索引之后
配图位置决策规则:
- 配图插入在对应段落**之后**(不是之前)
- 每个 H2 段落内最多 1 张配图
- 优先:有数据/统计的段落 > 有场景描写的段落 > 长段落(>400字无图)
- 间隔检查:相邻两张配图之间至少间隔 300 字(约3-4段)
- 总数规则:1500字→3张,2000字→4张,2500字→5-6张
img_map 输出格式(JSON):
{
"article_img_1.png": <段落索引(0-based)>,
"article_img_2.png": <段落索引(0-based)>,
...
}
例:{"article_img_1.png": 6, "article_img_2.png": 14, "article_img_3.png": 22}
含义:article_img_1.png 插在第6段后,article_img_2.png 插在第14段后...
配图提示词格式(每张输出):
### 配图 {序号}: 位于「{H2标题}」第{N}段后
- 配图目的:{信息强化/场景还原/节奏调节}
- 段落索引:{N}(0-based,用于 img_map)
- 对应内容:{这段讲了什么,1句话概括}
- 画面描述:{具体的画面内容,80-120字}
- AI 绘图提示词:
"{中文提示词,给 doubao-seedream 用}"
- 备选方案:{Unsplash/Pexels 搜索关键词}
封面生成命令:
ARTICLE_TITLE="<文章标题>"
SLUG="<slug>"
COVER_PROMPT="<使用封面创意 A 的 AI 绘图提示词>"
OUTPUT_DIR="${SKILL_OUTPUT}/${SLUG}"
mkdir -p "$OUTPUT_DIR"
python3 "$HOME/.claude/skills/content-factory/toolkit/image_gen.py" \
--prompt "$COVER_PROMPT" \
--output "${OUTPUT_DIR}/cover.png" \
--size cover 2>&1
封面生成后必须验证文件存在:
if [ ! -f "${OUTPUT_DIR}/cover.png" ]; then
echo "ERROR: 封面生成失败,尝试备选prompt(创意B)"
# 换备选prompt重试一次
fi
禁止在封面生成失败时继续流程。必须解决后才能推送。
完整执行 references/visual-prompts.md 规则,生成 3-6 张内文配图并调用 image_gen.py:
第一步:提取结构并生成提示词(已在上面完成,输出格式如下)
第二步:将提示词写入临时脚本,再执行生成:
# AI 已生成 img_map.json(格式:{"article_img_1.png": 6, ...})
# 读取 img_map(Step 7.2 需要)
if [ -f "${OUTPUT_DIR}/img_map.json" ]; then
echo "找到 img_map.json"
else
echo "ERROR: img_map.json 不存在,请确保 AI 在生成配图提示词时已输出该文件"
exit 1
fi
# 将 AI 生成的配图提示词写入临时脚本
cat > /tmp/article_img_prompts.sh << 'IMGSCRIPT'
# 格式:ARTICLE_IMG_1_PROMPT="..."
# 格式:ARTICLE_IMG_2_PROMPT="..."
# ...
IMGSCRIPT
# 加载提示词变量
source /tmp/article_img_prompts.sh
# 确定配图数量
ARTICLE_IMG_COUNT=$(grep -c 'ARTICLE_IMG_[0-9]*_PROMPT=' /tmp/article_img_prompts.sh || echo 0)
echo "将生成 ${ARTICLE_IMG_COUNT} 张内文配图"
# 逐张生成内文配图
for i in $(seq 1 $ARTICLE_IMG_COUNT); do
# 动态获取变量值
IMG_PROMPT=$(eval echo \$$(printf "ARTICLE_IMG_%d_PROMPT" $i))
IMG_OUTPUT="${OUTPUT_DIR}/article_img_${i}.png"
if [ -z "$IMG_PROMPT" ]; then
echo "WARNING: 配图 ${i} 无有效提示词,跳过"
continue
fi
echo "生成内文配图 ${i}/${ARTICLE_IMG_COUNT}..."
python3 "$HOME/.claude/skills/content-factory/toolkit/image_gen.py" \
--prompt "$IMG_PROMPT" \
--output "$IMG_OUTPUT" \
--size article 2>&1
if [ -f "$IMG_OUTPUT" ]; then
echo " ✓ 内文配图 ${i} 生成完成"
else
echo " ✗ 内文配图 ${i} 生成失败(文件未生成)"
fi
done
echo "内文配图生成完毕,共 ${ARTICLE_IMG_COUNT} 张"
配图生成顺序:
注意:内文配图生成失败不影响继续流程(封面必须成功,配图建议生成)。如失败,在最终报告中标注。
优先使用 xiaohu-wechat-format(31套主题),如 xiaohu 未安装则降级到 WeWrite 内置主题。
调用 xiaohu_wrapper.py 的 auto_theme_selection() 函数,根据文章内容自动选择最佳主题:
from toolkit.xiaohu_wrapper import auto_theme_selection, is_available
# 读取文章内容
article_md_path = f"{OUTPUT_DIR}/article.md"
with open(article_md_path, 'r') as f:
article_content = f.read()
# AI 自动选主题
if is_available():
selected_theme = auto_theme_selection(article_content, ARTICLE_TITLE)
print(f"AI 自动选择主题: {selected_theme}")