用 OpenClaw 每日自动发布 AI 速递:微信公众号 + 小红书全流程实操

42 阅读13分钟

本文记录了笔者使用 OpenClaw(AI 智能体)完成「每日 AI 前沿新闻」从信息搜集、图片生成到双平台发布的完整实践过程。全程无需手动操作,AI 自动完成所有步骤。


一、背景与目标

每天有大量 AI 前沿资讯涌现,手动整理、配图、排版、发布极其耗时。本文的目标是:

  • 搜索:自动搜集当日 5 条最重要的 AI 新闻
  • 制图:生成封面图 + 内容卡片(小红书风格)
  • 发布:同步推送到微信公众号(图文草稿)和小红书(图文笔记)

整个流程通过 OpenClaw 的 Skill 机制 + 微信公众号 API + 小红书发布脚本 串联实现。


二、前置准备

2.1 环境要求

项目说明
OpenClaw 运行环境云开发机(Linux,已联网)
工作目录/data/workspace
Python3.x(系统自带)
curl系统自带

2.2 安装 xhs-note-creator Skill

OpenClaw 的 Skill 是一套预置的工具脚本集合,可通过 use_skill 指令加载。xhs-note-creator 提供了:

  • 小红书图片卡片渲染(render_xhs.py
  • 小红书笔记发布(publish_xhs.py

安装后目录结构为:

/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:

XHS_COOKIE=your_cookie_here

获取 Cookie 方法:浏览器登录小红书 → F12 开发者工具 → Network → 任意请求 → 复制 Cookie 请求头的值。

2.4 准备微信公众号 API 凭证

需要一个有开发权限的微信公众号,获取:

  • AppID(公众号后台 → 开发 → 基本配置)
  • AppSecret(同上,点击"重置"获取)

2.5 配置微信 API 中转服务(可选)

微信公众号 API(api.weixin.qq.com)要求调用方的 IP 必须在公众号后台配置的IP 白名单中。云开发机的 IP 是动态变化的,每次重启后 IP 可能不同,频繁手动更新白名单非常麻烦。

推荐的解决方案是:在一台固定公网 IP 的服务器上搭建 Nginx 反向代理,将其 IP 加入微信白名单,所有 API 请求通过该服务器转发给微信。

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 新闻:

搜索词 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

---
emoji: "🤖"
title: "今日5大AI前沿新闻"
subtitle: "YYYY.MM.DD | 每日AI速递"
---

# 🚀 ① 新闻标题一

新闻正文(100-200字,突出核心数据和关键词)...

---

# 🦾 ② 新闻标题二

新闻正文...

---

# 🐙 ③ 新闻标题三

新闻正文...

---

# 🧠 ④ 新闻标题四

新闻正文...

---

# 🏛️ ⑤ 新闻标题五

新闻正文...

---

#AI前沿 #人工智能 #AI新闻 #科技资讯 #每日AI速递

注意事项:

  • YAML 头部的 emojititlesubtitle 会被渲染脚本用于生成封面图
  • 每条新闻用 --- 分隔,渲染脚本会据此拆分为独立卡片
  • 正文中适当加粗关键数字和词汇(使用 **加粗**

五、第三步:生成小红书图片卡片

5.1 创建输出目录

mkdir -p /data/workspace/ai_news_output

5.2 调用渲染脚本

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 输出文件结构

渲染完成后,输出目录中会生成:

/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

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 上传封面为永久素材

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:

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

每张图片返回格式:

{"url": "http://mmbiz.qpic.cn/..."}

记录所有图片的 URL,后续构建 HTML 正文时使用。

6.4 构建图文并茂的 HTML 正文

这是整个流程中最关键的一步。公众号正文是 HTML 格式,需要将图片和文字交替排列,形成"图文并茂"的效果。

以下是经过反复调试后确定的最优排版 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} &nbsp;|&nbsp; 每日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> &nbsp;·&nbsp; '
    '👀 <span style="color:#00d4aa;">在看</span> &nbsp;·&nbsp; '
    '🔁 <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前沿 &nbsp; #人工智能 &nbsp; #AI新闻 &nbsp; #科技资讯 &nbsp; #每日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 排版设计说明

经过多轮调试,最终确定的排版风格如下:

┌─────────────────────────────────────┐
│  DAILY AI DIGEST                    │  ← 深色渐变背景导语区
│  🤖 今日 5 大 AI 前沿新闻           │
│  2026.3.11 | 每日AI速递             │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│  01  [芯片革命]  🚀 英伟达GTC...    │  ← 深色标题栏(序号+标签+标题)
├─────────────────────────────────────┤
│                                     │
│         [全宽图片卡片]               │  ← 图片(无缝衔接,无间距)
│                                     │
├─────────────────────────────────────┤
│  新闻正文内容...                    │  ← 浅灰卡片背景正文
└─────────────────────────────────────┘

... (共5条,结构相同)

┌─────────────────────────────────────┐
│  🌟 觉得有用?帮个小忙吧~           │  ← 深色结尾引导区
│  👍 点赞 · 👀 在看 · 🔁 转发       │
│  关注我,不错过任何 AI 大事件 🤖    │
└─────────────────────────────────────┘

关键 CSS 技巧:

  1. 图片与标题栏无缝衔接:图片容器设置 line-height:0; font-size:0;,消除 inline 元素底部的默认间距
  2. 正文与图片无缝连接:正文卡片设置 border-top:none;,避免出现双边框
  3. 深色背景渐变:使用 linear-gradient(135deg, #1a1a2e 0%, #16213e 100%) 实现科技感深色渐变
  4. 强调色:使用 #00d4aa(青绿色)作为强调色,与深色背景形成对比

七、第五步:发布到小红书

7.1 准备小红书文案

小红书文案风格要求活泼、有 emoji、标题带日期:

标题格式(不超过20字):

今日5大AI速递🔥YYYY.MM.DD

正文格式:

🤖 今日AI速递 | YYYY.MM.DD

① 🚀 新闻1核心亮点(一句话)
② 🦾 新闻2核心亮点(一句话)
③ 🐙 新闻3核心亮点(一句话)
④ 🧠 新闻4核心亮点(一句话)
⑤ 🏛️ 新闻5核心亮点(一句话)

👆 关注我,不错过每日AI速递~

#AI前沿 #人工智能 #AI新闻 #科技资讯 #每日AI速递 #大模型 #AIGC #科技前沿 #AI工具 #人工智能应用

7.2 调用发布脚本

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 和链接:

✅ 发布成功!
笔记 ID:69b0eed7000000001d025bea
链接:https://www.xiaohongshu.com/explore/69b0eed7000000001d025bea

7.4 注意事项

问题原因解决方案
图片上传超时云服务器网络限制,无法访问小红书 CDN在本地电脑上运行发布脚本
Cookie 失效小红书 Cookie 有效期约 30 天重新登录获取新 Cookie
发布失败内容含敏感词调整文案措辞

八、整体流程总结

┌──────────────────────────────────────────────────────────────┐
│                    每日 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)。


十、进阶优化建议

  1. 新闻质量提升:增加更多搜索关键词,覆盖英文来源(如 TechCrunch、The Verge)
  2. 图片风格定制:修改 xhs-note-creator 的主题 CSS,打造专属品牌风格
  3. 自动化程度提升:将整个流程封装为一个 Shell 脚本,配合 crontab 实现全自动
  4. 多平台扩展:在现有基础上增加 B 站专栏、掘金、知乎等平台的发布
  5. 数据追踪:记录每篇文章的阅读量、点赞数,分析哪类 AI 新闻最受欢迎

本文基于 OpenClaw 实际操作过程整理,所有命令均经过实测验证。