用 OpenClaw 每日自动发布 AI 速递:微信公众号 + 小红书全流程实操
本文记录了笔者使用 OpenClaw(AI 智能体)完成「每日 AI 前沿新闻」从信息搜集、图片生成到双平台发布的完整实践过程。全程无需手动操作,AI 自动完成所有步骤。
一、背景与目标
每天有大量 AI 前沿资讯涌现,手动整理、配图、排版、发布极其耗时。本文的目标是:
- 搜索:自动搜集当日 5 条最重要的 AI 新闻
- 制图:生成封面图 + 内容卡片(小红书风格)
- 发布 :同步推送到微信公众号 (图文草稿)和小红书(图文笔记)
整个流程通过 OpenClaw 的 Skill 机制 + 微信公众号 API + 小红书发布脚本 串联实现。
二、前置准备
2.1 环境要求
| 项目 | 说明 |
|---|---|
| OpenClaw 运行环境 | AnyDev 云开发机(Linux,已联网) |
| 工作目录 | /data/workspace |
| Python | 3.x(系统自带) |
| curl | 系统自带 |
2.2 安装 xhs-note-creator Skill
OpenClaw 的 Skill 是一套预置的工具脚本集合,可通过 use_skill 指令加载。xhs-note-creator 提供了:
- 小红书图片卡片渲染(
render_xhs.py) - 小红书笔记发布(
publish_xhs.py)
安装后目录结构为:
bash
/data/workspace/.agent/skills/xhs-note-creator/
├── SKILL.md # 使用说明
├── .env # 配置文件(存放 Cookie)
└── scripts/
├── render_xhs.py # 图片渲染脚本
└── publish_xhs.py # 发布脚本
2.3 配置小红书 Cookie
编辑 /data/workspace/.agent/skills/xhs-note-creator/.env,填入你的小红书登录 Cookie:
env
XHS_COOKIE=your_cookie_here
获取 Cookie 方法 :浏览器登录小红书 → F12 开发者工具 → Network → 任意请求 → 复制
Cookie请求头的值。
2.4 准备微信公众号 API 凭证
需要一个有开发权限的微信公众号,获取:
AppID(公众号后台 → 开发 → 基本配置)AppSecret(同上,点击"重置"获取)
2.5 配置微信 API 中转服务(可选)
微信公众号 API(api.weixin.qq.com)要求调用方的 IP 必须在公众号后台配置的IP 白名单中。AnyDev 云开发机的 IP 是动态变化的,每次重启后 IP 可能不同,频繁手动更新白名单非常麻烦。
推荐的解决方案是:在一台固定公网 IP 的服务器上搭建 Nginx 反向代理,将其 IP 加入微信白名单,所有 API 请求通过该服务器转发给微信。
Nginx 配置示例:
nginx
server {
listen 8080;
location / {
proxy_pass https://api.weixin.qq.com;
proxy_ssl_server_name on;
proxy_set_header Host api.weixin.qq.com;
}
}
注意 :中转服务只是解决 IP 白名单问题,API 路径和参数与直连微信完全相同,无需做任何修改。调用时只需将请求发到
http://your-server:8080,Nginx 会自动将请求转发至https://api.weixin.qq.com。
三、第一步:搜索今日 AI 新闻
OpenClaw 使用 web_search 工具,通过多个关键词搜索当日最重要的 AI 新闻:
css
搜索词 1:AI新闻 今日 YYYY年M月DD日 最新进展
搜索词 2:人工智能 最新进展 YYYY年M月
搜索词 3:AI YYYY年M月DD日 大模型 机器人 最新消息
覆盖领域建议:
| 领域 | 关键词示例 |
|---|---|
| 大模型 / 芯片 | GPT、Claude、Gemini、英伟达、芯片 |
| 机器人 | 具身智能、人形机器人、机器人 |
| AI 应用 | AI 智能体、AIGC、AI 工具 |
| 政策 / 产业 | 两会、政府报告、AI 政策、补贴 |
| 科研 / 论文 | CVPR、NeurIPS、开源模型 |
搜索完成后,从结果中筛选出最具代表性的 5 条新闻,每条包含:标题、核心内容(100-200 字)、信息来源。
四、第二步:整理 Markdown 新闻文件
将搜集到的新闻整理成标准格式,保存为 /data/workspace/ai_news_MMDD.md:
markdown
---
emoji: "🤖"
title: "今日5大AI前沿新闻"
subtitle: "YYYY.MM.DD | 每日AI速递"
---
# 🚀 ① 新闻标题一
新闻正文(100-200字,突出核心数据和关键词)...
---
# 🦾 ② 新闻标题二
新闻正文...
---
# 🐙 ③ 新闻标题三
新闻正文...
---
# 🧠 ④ 新闻标题四
新闻正文...
---
# 🏛️ ⑤ 新闻标题五
新闻正文...
---
#AI前沿 #人工智能 #AI新闻 #科技资讯 #每日AI速递
注意事项:
- YAML 头部的
emoji、title、subtitle会被渲染脚本用于生成封面图 - 每条新闻用
---分隔,渲染脚本会据此拆分为独立卡片 - 正文中适当加粗关键数字和词汇(使用
**加粗**)
五、第三步:生成小红书图片卡片
5.1 创建输出目录
bash
mkdir -p /data/workspace/ai_news_output
5.2 调用渲染脚本
bash
python3 /data/workspace/.agent/skills/xhs-note-creator/scripts/render_xhs.py \
/data/workspace/ai_news_MMDD.md \
-o /data/workspace/ai_news_output/ \
-t terminal \
-m separator
参数说明:
| 参数 | 说明 |
|---|---|
| 第一个参数 | 输入的 Markdown 文件(建议使用绝对路径) |
-o |
输出目录 |
-t terminal |
卡片主题(terminal = 深色科技风) |
-m separator |
分割模式(按 --- 分割为多张卡片) |
5.3 输出文件结构
渲染完成后,输出目录中会生成:
bash
/data/workspace/ai_news_output/
├── cover.png # 封面图(由 YAML 头部生成,规格 900×383 px)
├── card_1.png # 第1条新闻卡片
├── card_2.png # 第2条新闻卡片
├── card_3.png # 第3条新闻卡片
├── card_4.png # 第4条新闻卡片
└── card_5.png # 第5条新闻卡片
六、第四步:发布到微信公众号
微信公众号发布分为 4 个子步骤:获取 Token → 上传封面 → 上传正文图片 → 创建草稿。
以下命令直连微信 API(
https://api.weixin.qq.com)。如果你配置了中转服务,只需将域名替换为中转服务地址,路径和参数完全不变。
6.1 获取 Access Token
bash
TOKEN=$(curl -s "https://api.weixin.qq.com/cgi-bin/token?\
grant_type=client_credential\
&appid=YOUR_APPID\
&secret=YOUR_APPSECRET" \
| python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
echo "Token: $TOKEN"
Token 有效期为 7200 秒(2小时),每次发布前重新获取即可。
6.2 上传封面为永久素材
bash
COVER_RESULT=$(curl -s \
-F "media=@/data/workspace/ai_news_output/cover.png;type=image/png" \
"https://api.weixin.qq.com/cgi-bin/material/add_material?\
access_token=${TOKEN}&type=image")
THUMB_MEDIA_ID=$(echo $COVER_RESULT | python3 -c \
"import sys,json; print(json.load(sys.stdin)['media_id'])")
echo "封面 media_id: $THUMB_MEDIA_ID"
使用
add_material接口上传永久素材 ,返回的media_id将作为文章封面图使用。 ⚠️media_id有效期为 3 天,超期后草稿中的封面图会失效,需重新上传。
6.3 上传正文图片
正文中引用的图片需使用 uploadimg 接口上传,返回可直接在 HTML 中使用的 URL:
bash
for i in 1 2 3 4 5; do
echo "=== 上传 card_${i}.png ==="
curl -s \
-F "media=@/data/workspace/ai_news_output/card_${i}.png;type=image/png" \
"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=${TOKEN}"
echo ""
done
每张图片返回格式:
json
{"url": "http://mmbiz.qpic.cn/..."}
记录所有图片的 URL,后续构建 HTML 正文时使用。
6.4 构建图文并茂的 HTML 正文
这是整个流程中最关键的一步。公众号正文是 HTML 格式,需要将图片和文字交替排列,形成"图文并茂"的效果。
以下是经过反复调试后确定的最优排版 Python 脚本:
python
import json
import urllib.request
# ===== 配置区 =====
TOKEN = "your_access_token"
THUMB_MEDIA_ID = "your_cover_media_id"
DATE_STR = "2026.3.11"
# 5张内容卡片的图片 URL(从步骤 6.3 获取)
card_urls = [
"http://mmbiz.qpic.cn/...", # card_1
"http://mmbiz.qpic.cn/...", # card_2
"http://mmbiz.qpic.cn/...", # card_3
"http://mmbiz.qpic.cn/...", # card_4
"http://mmbiz.qpic.cn/...", # card_5
]
# 5条新闻内容(序号、emoji、标题、分类标签、正文)
news_items = [
{
"num": "01", "emoji": "🚀",
"title": "英伟达GTC 2026即将开幕",
"tag": "芯片革命",
"body": "英伟达年度技术盛会 GTC 2026 将于 <strong>3月16日</strong> 在美国圣何塞召开..."
},
# ... 其余4条
]
# ===== 构建每条新闻的 HTML 区块 =====
def build_section(num, emoji, title, tag, img_url, body):
return (
'<section style="margin:0 0 32px 0;">'
# 深色标题栏
'<section style="display:flex;align-items:center;padding:12px 16px;'
'background:linear-gradient(135deg,#1a1a2e 0%,#16213e 100%);border-radius:8px 8px 0 0;">'
f'<span style="font-size:30px;font-weight:900;color:#00d4aa;'
f'font-family:Georgia,serif;margin-right:12px;line-height:1;">{num}</span>'
f'<span style="font-size:11px;color:#00d4aa;background:rgba(0,212,170,0.15);'
f'border:1px solid rgba(0,212,170,0.4);border-radius:4px;padding:2px 8px;'
f'margin-right:10px;white-space:nowrap;">{tag}</span>'
f'<span style="font-size:15px;font-weight:bold;color:#ffffff;line-height:1.4;">'
f'{emoji} {title}</span>'
'</section>'
# 全宽图片(与标题栏无缝衔接,line-height:0 消除底部空隙)
f'<section style="line-height:0;font-size:0;">'
f'<img src="{img_url}" style="width:100%;display:block;"/></section>'
# 浅灰正文卡片
f'<section style="padding:16px 20px 20px;background:#f8f9fa;'
f'border-radius:0 0 8px 8px;border:1px solid #e8e8e8;border-top:none;">'
f'<p style="font-size:15px;color:#444;line-height:1.9;margin:0;">{body}</p>'
'</section>'
'</section>'
)
# ===== 顶部导语 =====
header_html = (
'<section style="text-align:center;padding:28px 16px 24px;margin:0 0 32px 0;'
'background:linear-gradient(135deg,#0f0c29,#302b63,#24243e);border-radius:12px;">'
'<p style="font-size:12px;color:#aaa;letter-spacing:3px;margin:0 0 8px 0;">DAILY AI DIGEST</p>'
'<h1 style="font-size:22px;font-weight:900;color:#ffffff;margin:0 0 10px 0;line-height:1.4;">'
'🤖 今日 5 大 AI 前沿新闻</h1>'
f'<p style="font-size:13px;color:#00d4aa;margin:0;">{DATE_STR} | 每日AI速递</p>'
'</section>'
)
# ===== 构建完整正文 =====
content_html = header_html
for item, url in zip(news_items, card_urls):
content_html += build_section(
item["num"], item["emoji"], item["title"],
item["tag"], url, item["body"]
)
# ===== 结尾引导关注 + 一键三连 =====
footer_html = (
'<section style="margin:8px 0 0 0;padding:24px 20px;'
'background:linear-gradient(135deg,#1a1a2e,#16213e);border-radius:12px;text-align:center;">'
'<p style="font-size:18px;font-weight:bold;color:#ffffff;margin:0 0 12px 0;">🌟 觉得有用?帮个小忙吧~</p>'
'<p style="font-size:14px;color:#aaa;line-height:2;margin:0 0 16px 0;">'
'👍 <span style="color:#00d4aa;">点赞</span> · '
'👀 <span style="color:#00d4aa;">在看</span> · '
'🔁 <span style="color:#00d4aa;">转发</span>'
'</p>'
'<p style="font-size:13px;color:#888;margin:0 0 16px 0;">'
'每天 9 点,准时推送 5 条 AI 前沿速递<br/>关注我,不错过任何 AI 大事件 🤖</p>'
'<p style="font-size:12px;color:#666;margin:0;">'
'#AI前沿 #人工智能 #AI新闻 #科技资讯 #每日AI速递</p>'
'</section>'
)
content_html += footer_html
# ===== 构建草稿 Payload =====
payload = {
"articles": [{
"title": f"{DATE_STR} 每日AI速递",
"thumb_media_id": THUMB_MEDIA_ID,
"author": "",
"digest": "英伟达GTC2026、智元机器人、OpenClaw安全警示、杨立昆AMI融资、两会AI政策",
"content": content_html,
"content_source_url": "",
"need_open_comment": 1,
"only_fans_can_comment": 0
}]
}
# ===== 提交草稿 =====
api_url = f"https://api.weixin.qq.com/cgi-bin/draft/add?access_token={TOKEN}"
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
req = urllib.request.Request(
api_url, data=data,
headers={"Content-Type": "application/json;charset=utf-8"},
method="POST"
)
with urllib.request.urlopen(req) as resp:
result = json.loads(resp.read().decode("utf-8"))
print(f"草稿创建结果: {result}")
# 成功返回:{"media_id": "xxx", "errcode": 0}
如果使用中转服务,只需将
api_url中的https://api.weixin.qq.com替换为中转服务地址,其余代码完全不变。
6.5 排版设计说明
经过多轮调试,最终确定的排版风格如下:
css
┌─────────────────────────────────────┐
│ DAILY AI DIGEST │ ← 深色渐变背景导语区
│ 🤖 今日 5 大 AI 前沿新闻 │
│ 2026.3.11 | 每日AI速递 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 01 [芯片革命] 🚀 英伟达GTC... │ ← 深色标题栏(序号+标签+标题)
├─────────────────────────────────────┤
│ │
│ [全宽图片卡片] │ ← 图片(无缝衔接,无间距)
│ │
├─────────────────────────────────────┤
│ 新闻正文内容... │ ← 浅灰卡片背景正文
└─────────────────────────────────────┘
... (共5条,结构相同)
┌─────────────────────────────────────┐
│ 🌟 觉得有用?帮个小忙吧~ │ ← 深色结尾引导区
│ 👍 点赞 · 👀 在看 · 🔁 转发 │
│ 关注我,不错过任何 AI 大事件 🤖 │
└─────────────────────────────────────┘
关键 CSS 技巧:
- 图片与标题栏无缝衔接 :图片容器设置
line-height:0; font-size:0;,消除 inline 元素底部的默认间距 - 正文与图片无缝连接 :正文卡片设置
border-top:none;,避免出现双边框 - 深色背景渐变 :使用
linear-gradient(135deg, #1a1a2e 0%, #16213e 100%)实现科技感深色渐变 - 强调色 :使用
#00d4aa(青绿色)作为强调色,与深色背景形成对比
七、第五步:发布到小红书
7.1 准备小红书文案
小红书文案风格要求活泼、有 emoji、标题带日期:
标题格式(不超过20字):
今日5大AI速递🔥YYYY.MM.DD
正文格式:
less
🤖 今日AI速递 | YYYY.MM.DD
① 🚀 新闻1核心亮点(一句话)
② 🦾 新闻2核心亮点(一句话)
③ 🐙 新闻3核心亮点(一句话)
④ 🧠 新闻4核心亮点(一句话)
⑤ 🏛️ 新闻5核心亮点(一句话)
👆 关注我,不错过每日AI速递~
#AI前沿 #人工智能 #AI新闻 #科技资讯 #每日AI速递 #大模型 #AIGC #科技前沿 #AI工具 #人工智能应用
7.2 调用发布脚本
bash
python3 /data/workspace/.agent/skills/xhs-note-creator/scripts/publish_xhs.py \
--title "今日5大AI速递🔥2026.03.11" \
--desc "🤖 今日AI速递 | 2026.03.11
① 🚀 英伟达GTC 2026即将开幕,Rubin架构芯片+1吉瓦算力集群重磅来袭!
② 🦾 智元机器人ACoT-VLA架构入选CVPR 2026,消费级人形机器人今年下半年上市!
③ 🐙 OpenClaw智能体爆火,国家互联网应急中心联合发布安全风险提示!
④ 🧠 杨立昆新公司AMI完成10.3亿美元融资,剑指推理与规划新路线!
⑤ 🏛️ 两会首提「智能经济」+「具身智能」,AI写入政府工作报告新阶段!
👆 关注我,不错过每日AI速递~
#AI前沿 #人工智能 #AI新闻 #科技资讯 #每日AI速递 #大模型 #AIGC #科技前沿 #AI工具 #人工智能应用" \
--images \
/data/workspace/ai_news_output/cover.png \
/data/workspace/ai_news_output/card_1.png \
/data/workspace/ai_news_output/card_2.png \
/data/workspace/ai_news_output/card_3.png \
/data/workspace/ai_news_output/card_4.png \
/data/workspace/ai_news_output/card_5.png
7.3 发布成功示例
发布成功后,脚本会返回笔记 ID 和链接:
arduino
✅ 发布成功!
笔记 ID:69b0eed7000000001d025bea
链接:https://www.xiaohongshu.com/explore/69b0eed7000000001d025bea
7.4 注意事项
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 图片上传超时 | 云服务器网络限制,无法访问小红书 CDN | 在本地电脑上运行发布脚本 |
| Cookie 失效 | 小红书 Cookie 有效期约 30 天 | 重新登录获取新 Cookie |
| 发布失败 | 内容含敏感词 | 调整文案措辞 |
八、整体流程总结
vbnet
┌──────────────────────────────────────────────────────────────┐
│ 每日 AI 速递发布流程 │
└──────────────────────────────────────────────────────────────┘
Step 1: 搜索新闻
web_search × 3次 → 筛选5条最重要AI新闻
Step 2: 整理 Markdown
→ /data/workspace/ai_news_MMDD.md
Step 3: 生成图片卡片
render_xhs.py → cover.png + card_1~5.png
→ /data/workspace/ai_news_output/
Step 4: 发布微信公众号
① 获取 Access Token
② 上传封面(add_material)→ 获取 thumb_media_id
③ 上传正文图片(uploadimg)× 5 → 获取 URL 列表
④ 构建 HTML 正文(图文交替排列)
⑤ POST /cgi-bin/draft/add → 草稿创建成功
Step 5: 发布小红书
publish_xhs.py → 上传图片 → 发布笔记
→ 返回笔记 ID 和链接
Step 6: 通知用户(notify 工具)
九、常见问题 FAQ
Q1:微信 API 返回 40001 错误(access_token invalid)
Access Token 已过期或格式错误。重新执行 Step 4.1 获取新 Token。
Q2:微信 API 返回 40164 错误(invalid ip)
当前调用方 IP 不在公众号后台配置的白名单中。解决方案:
- 方案 A:登录公众号后台 → 开发 → 基本配置 → IP白名单,添加当前开发机 IP
- 方案 B:搭建固定 IP 的中转服务(见 2.5 节),长期有效
Q3:公众号草稿图片不显示
图片 URL 必须是通过 uploadimg 接口上传后返回的 mmbiz.qpic.cn 域名 URL,不能使用外部图片链接。
Q4:小红书发布后图片顺序不对
--images 参数的顺序就是图片在笔记中的展示顺序,确保 cover.png 排在第一位。
Q5:如何实现每日定时自动发布?
可以使用 OpenClaw 的 cron 工具创建定时任务:
每天 09:00 自动执行「每日AI速递」完整发布流程,
完成后通过 notify 工具推送结果通知。
⚠️ 注意:定时任务依赖开发机持续运行,若开发机进入休眠状态,任务将暂停执行。
Q6:公众号草稿创建成功后如何发布?
草稿创建后需要在公众号后台 → 草稿箱 中手动审核并点击发布。订阅号无群发权限,不支持通过 API 自动发布(调用 freepublish/submit 会返回 errcode 48001)。
十、进阶优化建议
- 新闻质量提升:增加更多搜索关键词,覆盖英文来源(如 TechCrunch、The Verge)
- 图片风格定制 :修改
xhs-note-creator的主题 CSS,打造专属品牌风格 - 自动化程度提升:将整个流程封装为一个 Shell 脚本,配合 crontab 实现全自动
- 多平台扩展:在现有基础上增加 B 站专栏、掘金、知乎等平台的发布
- 数据追踪:记录每篇文章的阅读量、点赞数,分析哪类 AI 新闻最受欢迎
本文基于 OpenClaw 实际操作过程整理,所有命令均经过实测验证。