一键导入
wechat-ai-publisher
自动采集 AI 热门内容,撰写公众号文章,生成配图并发布到微信公众号草稿箱。当用户说"发布AI热点"、"写公众号文章"、"采集AI内容"、"publish AI news"时触发。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
自动采集 AI 热门内容,撰写公众号文章,生成配图并发布到微信公众号草稿箱。当用户说"发布AI热点"、"写公众号文章"、"采集AI内容"、"publish AI news"时触发。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | wechat-ai-publisher |
| description | 自动采集 AI 热门内容,撰写公众号文章,生成配图并发布到微信公众号草稿箱。当用户说"发布AI热点"、"写公众号文章"、"采集AI内容"、"publish AI news"时触发。 |
| homepage | https://github.com/bbwdadfg/wechat-ai-publisher |
| metadata | {"openclaw":{"emoji":"📰","requires":{"bins":["bash","curl","jq"]}}} |
1. 询问用户配置(主题、风格、配图数量)
↓
2. Exa/Tavily 搜索采集 AI 热点资料
↓
3. 撰写文章(Markdown 格式)
↓
4. 调用 nanobanana API 生成配图
↓
5. 上传图片到微信服务器(获取 mmbiz URL)
↓
6. 转换为 HTML 并发布到公众号草稿箱
↓
7. 提示用户去微信公众号后台检查文章
WECHAT_APPID(通过环境变量配置)WECHAT_SECRET(通过环境变量配置)google/nano-banana-pro(通过 Replicate)~/.codex/skills/article-illustrator/scripts/generate_image.py(也可能是 ~/.claude/skills/... 或 ~/.gemini/skills/...,以你的工具为准)配置方法见
README.md(本仓库已移除所有硬编码密钥/Token/本地路径)。
重要:根据文章语言决定图片中的文字语言!
| 文章语言 | 图片 Prompt 语言 | 示例 |
|---|---|---|
| 中文文章 | 中文配字 | "流程图展示:搜索新闻 → 撰写文章 → 生成配图 → 发布,中文标注" |
| 英文文章 | 英文配字 | "Flowchart: Search → Write → Generate → Publish, English labels" |
Prompt 编写规则:
,中文标注,简体中文文字, English text labels设计思路:不同主题、风格、配图数量会影响后续所有步骤,所以先收集用户偏好。
如果是交互式运行,可以询问用户;如果是定时任务/自动运行(比如 OpenClaw Cron),则不要提问,直接从触发消息里解析参数或使用默认值。
WECHAT_AUTHOR 默认值)支持的参数(建议写在触发语句中):
主题:例如 AI工具 / 大模型 / AI Agent风格:例如 purple / orangeheart / github配图:例如 仅封面 / 封面+2张 / 封面+3张作者:例如 田威 AI(会映射到环境变量 WECHAT_AUTHOR)主题=... / 风格=... / 配图=... / 作者=...,则覆盖默认值。交互式询问(可选):
问题 1 - 文章主题:
问题 2 - CSS 风格:
问题 3 - 配图数量:
问题:简单搜索只返回标题和 200 字摘要,内容太浅,写不出有深度的文章。
解决方案:两阶段采集
阶段 1:广度搜索(发现)
↓ 筛选 3-5 篇高质量文章
阶段 2:深度抓取(提取)
↓ 获取完整原文内容
设计思路:
Tavily vs Exa 选择:
| 场景 | 推荐 | 原因 |
|---|---|---|
| 新闻热点 | Tavily | topic="news" 专门优化新闻搜索 |
| 技术文档 | Exa | 对技术内容索引更全面 |
| 综合搜索 | 两者并用 | 互补,覆盖更广 |
# Tavily 搜索(适合新闻热点)
mcp__tavily__tavily-search(
query="AI artificial intelligence news {主题}",
topic="news",
days=3,
max_results=10,
search_depth="advanced" # 使用高级搜索
)
# Exa 搜索(适合技术内容)
mcp__exa__web_search_exa(
query="AI {主题} latest news tutorial",
numResults=10
)
筛选标准(从 10 条中选 3-5 条):
关键:使用 tavily-extract 抓取完整文章内容!
# 深度抓取选中的文章(返回完整原文,可达 2 万字)
mcp__tavily__tavily-extract(
urls=[
"https://example.com/article1",
"https://example.com/article2",
"https://example.com/article3"
],
extract_depth="advanced" # 高级提取,获取更多内容
)
对比效果:
| 方法 | 返回内容 | 适用场景 |
|---|---|---|
tavily-search | 标题 + 200字摘要 | 发现文章 |
tavily-extract | 完整原文(可达2万字) | 深度阅读 |
exa web_search | 标题 + 摘要 + 部分正文 | 快速了解 |
为什么要深度抓取?
抓取完成后,整理成以下格式:
## 素材 1:[文章标题]
- **来源**:[URL]
- **核心观点**:[1-2 句话总结]
- **关键数据/案例**:
- [具体数据点 1]
- [具体案例 1]
- [代码片段(如有)]
- **可引用的金句**:[原文中的精彩表述]
## 素材 2:[文章标题]
...
## 素材 3:[文章标题]
...
整理要点:
# 1. 广度搜索
search_results = mcp__tavily__tavily-search(
query="Claude Code Skills tutorial 2025",
topic="general",
max_results=10,
search_depth="advanced"
)
# 2. 筛选高质量文章(人工或自动)
selected_urls = [
"https://huggingface.co/blog/...",
"https://www.siddharthbharath.com/claude-skills/",
"https://www.youngleaders.tech/p/..."
]
# 3. 深度抓取
full_content = mcp__tavily__tavily-extract(
urls=selected_urls,
extract_depth="advanced"
)
# 4. 整理素材(见上方模板)
设计思路:
参考示例文章:examples/nursing-tech-article.md
文章结构设计:
引子(钩子开头,抛出问题或观点)
↓
核心内容(3-5 个分点,每点配一张图)
↓
价值总结(明确结论)
↓
行动号召(引导读者下一步)
输出格式:Markdown,用注释标记配图位置和描述
# 文章标题
开头段落(钩子,吸引读者继续阅读)...
## 第一部分
内容...
<!-- IMAGE_1: 图片描述(根据文章语言决定中英文) -->
<!-- 图片应该可视化这部分的核心概念 -->
## 第二部分
内容...
<!-- IMAGE_2: 图片描述 -->
## 第三部分
内容...
<!-- IMAGE_3: 图片描述 -->
## 总结
结尾(明确结论 + 行动号召)...
配图位置选择原则:
设计思路:
必须使用 article-illustrator 的脚本(通过环境变量配置 API Key):
# 生成封面图(16:9,横版,适合列表展示)
python3 ~/.codex/skills/article-illustrator/scripts/generate_image.py \
--prompt "封面图描述,中文标注" \
--output "/tmp/wechat_cover.png" \
--aspect-ratio "16:9"
# 生成配图(4:3,适合文章内嵌)
python3 ~/.codex/skills/article-illustrator/scripts/generate_image.py \
--prompt "配图描述,中文标注" \
--output "/tmp/wechat_img1.png" \
--aspect-ratio "4:3"
Prompt 编写技巧:
[主题] + [具体内容] + [视觉风格] + [颜色调性] + [语言标注]
Prompt 示例(中文文章):
常见问题:
设计思路:
mmbiz.qpic.cn 域名的图片,外部图片会被过滤重要:公众号文章只能显示微信域名的图片!
import os
import requests
# 1. 获取 access_token(有效期 2 小时)
token_resp = requests.get(
"https://api.weixin.qq.com/cgi-bin/token",
params={
"grant_type": "client_credential",
"appid": os.environ["WECHAT_APPID"],
"secret": os.environ["WECHAT_SECRET"]
}
)
access_token = token_resp.json()["access_token"]
# 2. 上传封面图(永久素材接口,返回 media_id)
# 用于草稿的 thumb_media_id 字段
with open("/tmp/wechat_cover.png", "rb") as f:
thumb_resp = requests.post(
f"https://api.weixin.qq.com/cgi-bin/material/add_material"
f"?access_token={access_token}&type=image",
files={"media": ("cover.png", f, "image/png")}
)
thumb_media_id = thumb_resp.json()["media_id"]
# 3. 上传文章内配图(图文消息内图片接口,返回 URL)
# 返回的 URL 可以直接嵌入 HTML
with open("/tmp/wechat_img1.png", "rb") as f:
img_resp = requests.post(
f"https://api.weixin.qq.com/cgi-bin/media/uploadimg"
f"?access_token={access_token}",
files={"media": ("img1.png", f, "image/png")}
)
img1_url = img_resp.json()["url"]
# 返回: http://mmbiz.qpic.cn/sz_mmbiz_png/...
两个接口的区别:
| 接口 | 用途 | 返回值 | 使用场景 |
|---|---|---|---|
/material/add_material | 永久素材 | media_id | 封面图(thumb_media_id) |
/media/uploadimg | 图文消息内图片 | mmbiz URL | 文章内嵌图片 |
为什么这样设计?
<img src=""> 引用设计思路:
<style> 标签,只有内联样式才生效\uXXXX 编码,微信无法正确显示import json
# 1. 构建 HTML(使用微信返回的图片 URL)
# 所有样式必须内联,不能用 class
html_content = f'''
<section style="font-family: -apple-system, sans-serif; line-height: 1.8; color: #333; padding: 15px;">
<p style="margin-bottom: 20px;">段落内容</p>
<h2 style="border-bottom: 1px solid #eee; padding-bottom: 8px;">标题</h2>
<p style="text-align: center; margin: 25px 0;">
<img src="{img1_url}" style="max-width: 100%; border-radius: 6px;">
</p>
<blockquote style="background: #f6f8fa; border-left: 4px solid #ddd; padding: 12px 16px;">
引用内容
</blockquote>
</section>
'''
# 2. 构建草稿数据
draft_data = {
"articles": [{
"title": "文章标题(不超过21个中文字符)",
"digest": "文章摘要(会显示在分享卡片上)",
"content": html_content,
"thumb_media_id": thumb_media_id, # 封面图 ID
"need_open_comment": 1, # 开启评论
"only_fans_can_comment": 0 # 所有人可评论
}]
}
# 3. 发布草稿(关键:ensure_ascii=False)
response = requests.post(
f"https://api.weixin.qq.com/cgi-bin/draft/add?access_token={access_token}",
data=json.dumps(draft_data, ensure_ascii=False).encode('utf-8'),
headers={"Content-Type": "application/json; charset=utf-8"}
)
result = response.json()
# 成功返回: {"media_id": "草稿ID"}
HTML 样式要点:
style="...")max-width: 100% 防止溢出常见错误:
ensure_ascii=False设计思路:
发布完成后,输出:
✅ 发布完成!
📝 文章信息
- 标题:xxx
- 摘要:xxx
- 风格:xxx
📤 公众号
- 草稿 ID:xxx
- 请前往微信公众号后台检查文章:https://mp.weixin.qq.com
⚠️ 检查要点:
1. 图片是否正常显示
2. 排版是否正确
3. 标题和摘要是否合适
4. 确认无误后点击"发布"
| 风格 ID | 名称 | 标题色 | 正文色 | 引用背景 |
|---|---|---|---|---|
purple | 紫色经典 | #8064a9 | #444444 | #f4f2f9 |
orangeheart | 橙心暖色 | #ef7060 | #000000 | #fff5f5 |
github | GitHub风格 | #333333 | #333333 | #f6f8fa |
详细配置见 styles.json
ensure_ascii=False