微信公众号文章运营 Skill(v4 · 配图前置版)
基于历次实战复盘(v1 初版 → v2 系统化 → v3 浅色主题 → v4 配图前置),核心优化:
- 配图调研前置:选题调研阶段就并行搜索 Pexels/Pixabay 配图,避免二次改文
- 一次推送:写文章时即确定所有图片方案,一次性插入
![配图]标记 - 搜索提示词模板化:每个环节的搜索词都标准化,直接复制使用
前置条件
| 环境变量 | 说明 | 获取方式 |
|---|---|---|
WX_APPID | 微信公众号 AppID | 公众号后台→开发→基本配置 |
WX_APPSECRET | 微信公众号 AppSecret | 同上 |
CNB_TOKEN | CNB API Token(可选) | cnb.cool→个人设置→访问令牌 |
微信 IP 白名单
⚠️ 如果推送时报 40164: invalid ip,将报错中的 IP 加入白名单: 路径:公众号后台 → 设置与开发 → 基本配置 → IP 白名单
完整工作流(6 步,一步到位)
第一步:选题调研(并行 3 路搜索 + 配图调研)
1.1 了解账号定位
搜索提示词 → web: "微信公众号'{公众号名}' 内容定位 风格"确认账号已有文章方向,确保新选题是延续或升级。
1.2 选题搜索 + 写作技巧(并行 3 路)
text
# 路 1:行业热点
搜索提示词 → web: "AI人工智能 {当前月} 最新热点新闻趋势"
搜索提示词 → web: "{选题关键词} {当前年} 最新动态 行业分析"
# 路 2:爆款写作技巧
搜索提示词 → web: "微信公众号爆款文章 写作技巧 标题公式 {当前年}"
搜索提示词 → web: "公众号10万+文章 拆解 方法论"
# 路 3:配图灵感
搜索提示词 → web: "秀米编辑器 公众号排版 引导关注 {当前年}"1.3 深度调研(sub-agent 并行)
选题确定后,拆成 2-3 个子任务并行调研:
text
# 子代理 1:选题核心内容(research 类型)
subagent_spawn(type=research): "搜索并整理以下信息:
1. {事件/政策/产品} 的核心细节、关键数据、时间线
2. {公司A}的相关动态、财报数据、行业排名
3. 行业专家观点、市场分析
要求:每条信息标注来源,数据精确到具体数字(不要用'约'、'近'等模糊词)"
# 子代理 2:写作技巧参考
subagent_spawn(type=research): "搜索并整理:
1. 公众号爆款标题公式(数字+冲突+悬念等模式),给出3个示例
2. 公众号文章开头钩子写法(数据冲击、反常识、场景共鸣3种),各给1个示例
3. 公众号文章结构设计方法论(建议的四段式比例和写法)"
# 子代理 3:配图素材搜索 ← v4 新增:提前搜索,避免事后补图
subagent_spawn(type=research): "搜索免费可商用配图素材,适配以下文章主题:
主题:{文章主题简述}
请同时在 Pexels (pexels.com) 和 Pixabay (pixabay.com) 搜索以下分类图片:
1. AI/科技/机器人类 — 文章开头用(关键词:AI, artificial intelligence, robot, technology)
2. 数据/图表/降价类 — 数据展示用(关键词:chart, data, price, discount, business)
3. 竞争/策略/博弈类 — 行业分析用(关键词:competition, strategy, chess, market)
4. 洞察/未来/灯泡类 — 结论启示用(关键词:lightbulb, insight, future, innovation)
要求:
- 优先找白色/浅色背景、留白多的图片(适配微信白底阅读环境)
- 检查 Pexels License 确保免署名可商用
- 每类推荐 1-2 张最佳选择,返回直接下载链接
- 标注图片风格(极简/科技/矢量等),方便统一搭配
- 优先使用 Pexels(URL 稳定),Pixabay 作为备选"1.4 选题标准
- 与账号已有内容形成延续或升级
- 有数据支撑(融资额、用户数、增长率等硬数字)
- 对读者有实操启示(不只新闻搬运,给出解读)
1.5 配图方案确定(v4 关键步骤)
在写文章之前,先确定配图方案:
text
封面:{标题/副标题} → outputs/cover.jpg
数据图1(柱状图/卡片/时间线):{描述数据内容}
数据图2(可选):{描述数据内容}
实景插画1(Pexels/Pixabay):{用于文章哪个章节,什么风格}
实景插画2(Pexels/Pixabay):{用于文章哪个章节,什么风格}
实景插画3(可选):{用于文章哪个章节,什么风格}推荐配图分布密度:1500字文章配4-5张图(2张数据图 + 2-3张实景插画),每300-400字有一处视觉停顿。
1.6 文章结构设计
标准四段式(1500-1800 字):
| 结构 | 作用 | 占比 |
|---|---|---|
| 开头钩子 | 数据冲击 / 反常识 / 场景共鸣 | 10% |
| 主体 2-3 节 | 层层递进:现象→原因→影响→未来 | 55% |
| 读者启示 | 「对我们意味着什么?」3 点总结 | 20% |
| CTA 收尾 | 点赞/在看/关注 + 下期预告 | 15% |
第二步:撰写文章(含配图标记)
2.1 写作规范
- 口语化,但信息密度高(每段至少含一个数据点或观点)
- 忌词:当然、值得注意的是、总的来说、总而言之
- 标题 ≤ 28 字,用「」引号突出关键词
- 小标题用"一、二、三"编号 + 破折号式副标题
2.2 Markdown 模板(含配图标记占位)
markdown
# 主标题:核心冲突 + 悬念(≤ 28 字)
> 开头引用块:3 句内制造冲击感(可用数据冲击、反常识、场景共鸣)
---
![插画:robot]
![配图] ← 实景插画1(Pexels/Pixabay AI科技类)
## 一、小标题(现象层:发生了什么?)
正文 + 数据表格(可选)
![配图] ← 数据图1(柱状图/卡片图)
---
![插画:chart]
## 二、小标题(原因/影响层:为什么?意味着什么?)
正文
![配图] ← 实景插画2(竞争/策略类,如象棋图)
---
![插画:chip]
## 三、小标题(行业影响层)
正文
![配图] ← 数据图2(可选)
---
![插画:lamp]
![配图] ← 实景插画3(洞察/未来类,如灯泡图)
## 四、写在最后:对我们意味着什么?
三点判断...
---
![插画:sparkle]
🔥 **下周看点**
- 预告 1
- 预告 2
---
*CTA 收尾:点赞/在看/转发/关注*
*关注「鸿爪派」,不追风口,只拆底层逻辑。*2.3 特殊标记
| 标记 | 渲染效果 | 用途 |
|---|---|---|
![配图] | 全宽图片(从 --images 参数注入) | 数据图表、实景插画 |
![插画:xxx] | 居中蓝色 SVG 图标 | 章节装饰、视觉节奏 |
插画图标速查(15 个内置 SVG):
- 基础图标(金色):fire / like / star / bell / section / dot / qr
- 插画图标(蓝色):robot / shield / chart / globe / lamp / chip / doc / sparkle
第三步:生成配图(一次性完成)
⚠️ 关键原则:所有配图在写文章时就确定方案,一次性生成、上传,避免二次修改。
3.1 下载实景插画(Pexels/Pixabay)
在第一步就确定好素材,直接下载:
bash
mkdir -p outputs/illustrations
curl -sL -o outputs/illustrations/插图1.jpg "Pexels/Pixabay 下载链接"
curl -sL -o outputs/illustrations/插图2.jpg "下载链接"3.2 封面图(必须 · 900×383)
bash
python3 skills/wechat-article/gen_image.py cover \
--title "主标题(≤12字)" \
--subtitle "副标题(15字以内)" \
-o outputs/cover.jpg3.3 正文数据配图(建议 2 张)
⚠️ 数据必须用 JSON 数组格式,不能用对象:
bash
# ✅ 正确:数组格式
python3 gen_image.py bar --title "标题" \
--data '[[\"名称\",数值,\"#色号\",\"标签\"],...]' \
-o outputs/bar.png
python3 gen_image.py cards --title "标题" \
--data '[[\"标题\",\"描述\",\"#色号\"],...]' \
-o outputs/cards.png
python3 gen_image.py timeline --title "标题" \
--data '[[\"日期\",\"标签\",\"描述\",\"#色号\"],...]' \
-o outputs/timeline.png
# ❌ 错误:对象格式会导致 TypeError/ValueError
# --data '[{\"name\":\"...\",\"val\":...}]'四种配图类型:
| 类型 | 数据格式 | 适用场景 |
|---|---|---|
cover | title + subtitle | 封面 900×383 |
bar | [[\"名称\",数值,\"#色号\",\"标签\"]] | 对比数据 |
cards | [[\"标题\",\"描述\",\"#色号\"]] | 并列要点 |
timeline | [[\"日期\",\"标签\",\"描述\",\"#色号\"]] | 时间递进 |
3.4 一次性上传所有配图
先获取 Token,然后批量上传:
bash
# 获取 token
TOKEN=$(curl -s "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$WX_APPID&secret=$WX_APPSECRET" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
# 上传封面(永久素材,返回 thumb_media_id)
THUMB=$(curl -s -F media=@outputs/cover.jpg \
"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$TOKEN&type=thumb" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['media_id'])")
echo "thumb_media_id: $THUMB"
# 上传正文配图(media/uploadimg,返回 URL)
# 注意:正文配图用 media/uploadimg,不是 material/add_material!
IMG1_URL=$(curl -s -F media=@outputs/illustrations/插图1.jpg \
"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=$TOKEN" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['url'])")
IMG2_URL=$(curl -s -F media=@outputs/bar.png \
"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=$TOKEN" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['url'])")
# ... 继续上传所有配图
# 拼接 images 字符串(与 article.md 中 ![配图] 顺序一致)
IMAGES="${IMG1_URL},${IMG2_URL},${IMG3_URL}"第四步:Markdown → 微信 HTML
详见 push.js 的参数说明。push.js 自动处理:
- 品牌头标渲染(🔥 鸿爪派 🔥)
- SVG 插画图标渲染(
![插画:xxx]→ 蓝色居中 SVG) - 配图注入(
![配图]→--images中的 URL) - 数据表格、引用块、列表等微信 HTML 转换
- 品牌尾标渲染
配色方案(浅色主题 · 微信白底适配)
默认浅色主题(适合微信白色阅读背景),无需额外设置:
| 色号 | 用途 | 环境变量 |
|---|---|---|
#f8fafc | 底色(品牌头标等区域) | WX_COLOR_BG |
#1e293b | 正文/标题文字 | WX_COLOR_TEXT |
#64748b | 辅助文字 | WX_COLOR_MUTED |
#d97706 | 品牌金色(强调、头标火焰) | WX_COLOR_GOLD |
#2563eb | 插画蓝色(章节装饰) | WX_COLOR_ACCENT |
#7c3aed | 强调紫色 | WX_COLOR_PURPLE |
#f1f5f9 | 卡片底色 | WX_COLOR_CARD |
#94a3b8 | 暗淡灰 | WX_COLOR_DIM |
第五步:推送草稿箱(一次性推送)
bash
cd /sandbox/workspace
export WX_APPID="wx..." WX_APPSECRET="..."
node skills/wechat-article/push.js outputs/article.md \
--brand "鸿爪派" \
--slogan "不追风口,只拆底层逻辑" \
--author "鸿爪派" \
--digest "摘要(54字以内)" \
--images "${IMG1_URL},${IMG2_URL},${IMG3_URL}" \
--thumb "${THUMB_MEDIA_ID}"第六步:验证草稿
bash
TOKEN=$(curl -s "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$WX_APPID&secret=$WX_APPSECRET" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
curl -s -X POST "https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=$TOKEN" \
-H "Content-Type: application/json" -d '{"offset":0,"count":1}' | python3 -c "
import sys, json
d = json.load(sys.stdin)
items = d.get('item', [])
if not items:
print('❌ 没有草稿')
sys.exit(1)
n = items[0]['content']['news_item'][0]
c = n['content']
print(f'✅ 标题: {n[\"title\"]}')
print(f'✅ 作者: {n[\"author\"]}')
print(f'✅ 摘要: {n[\"digest\"]}')
print(f'✅ 图片数: {c.count(chr(60)+\"img \")}')
print(f'✅ SVG数: {c.count(chr(60)+\"svg\")}')
print(f'✅ 品牌头标: {\"鸿爪派\" in c}')
print(f'✅ 暗色残留: {c.count(\"#0f172a\")}(应为0)')
"验证清单:
- [ ] 标题、作者、摘要正确
- [ ] 图片数量 = 封面+正文配图(≥ 3 张)
- [ ] SVG 图标数量 ≥ 8(基础图标 + 插画图标)
- [ ] 品牌头标和尾标存在
- [ ] 暗色码
#0f172a残留为 0
常见踩坑
| 症状 | 原因 | 解决 |
|---|---|---|
| 文字看不见 | 浅色文字在微信白底上对比度太低 | 默认浅色主题已解决;或设 WX_COLOR_TEXT="#1e293b" |
| gen_image.py TypeError | data 用了对象格式 [{...}] | 改用数组格式 [[...]] |
| push 后无图片 | 正文配图用了 material/add_material | 改用 media/uploadimg |
40164: invalid ip | 沙箱 IP 不在白名单 | 公众号后台添加 IP |
| 插画图标不显示 | 图标名称拼写错误 | 检查 ![插画:xxx] 中名称是否在 15 个图标列表内 |
| 配图数不匹配 | ![配图] 标记数 ≠ --images URL 数 | 文章中的标记数量和 --images 参数数量必须一致 |
| 二次推送验证脚本失败 | 草稿箱为空或返回格式不符 | 先确认 push 成功,再用指定的验证命令 |
快速开始(一次性全流程速查)
bash
# 1. 设置环境变量
export WX_APPID="wx..." WX_APPSECRET="..."
# 2. 搜索配图素材(第一步调研时同步完成)
# → Pexels/Pixabay 下载到 outputs/illustrations/
# 3. 生成封面 + 数据图
python3 skills/wechat-article/gen_image.py cover --title "..." --subtitle "..." -o outputs/cover.jpg
python3 skills/wechat-article/gen_image.py bar --title "..." --data '[[...]]' -o outputs/bar.png
# 4. 上传所有配图(一次性)
# 获取 TOKEN → 上传封面得 thumb_media_id → 上传正文配图得 URL
# 5. 写文章(Markdown,含所有 ![配图] 和 ![插画:xxx] 标记)
# 6. 推送(一次性)
node skills/wechat-article/push.js outputs/article.md \
--brand "鸿爪派" --slogan "不追风口,只拆底层逻辑" \
--author "鸿爪派" --digest "..." \
--images "url1,url2,url3,url4,url5" \
--thumb "thumb_media_id"
# 7. 验证
# 运行第六步中的验证脚本