公众号运营的核心痛点,在于“优质内容持续产出”的高压——找选题、学对标、写正文、配图片、调排版,一套流程下来耗时耗力,还容易陷入“灵感枯竭”的循环。而OpenClaw+Claude Skill的组合,恰好破解了这一难题:OpenClaw作为自动化中枢,负责调度任务、读取数据;自定义Skill(wechat-article-writer)则实现“AI写文→自动配图→排版优化→草稿箱投递”的全流程自动化,仅需一句话指令,就能让AI学习对标账号风格,生成1500字优质文章,搭配合规配图存入公众号草稿箱,真正实现“躺更”。
2026年,OpenClaw的部署门槛已大幅降低,新手零基础也能快速完成阿里云与本地部署。本文将完整拆解2026年OpenClaw的阿里云(零基础友好)与本地部署步骤,详细讲解wechat-article-writer Skill的搭建、配置、集成全流程,包含可直接复制的代码命令、API密钥获取、飞书表格联动及避坑指南,助力公众号运营者节省90%的创作时间,专注核心选题与流量优化。阿里云上OpenClaw极速一键部署最简单,步骤详情 访问阿里云OpenClaw一键部署专题页面 了解。
一、核心认知:为什么选择OpenClaw+Claude Skill?
(一)三大创作方案对比(2026实测)
市面上主流的公众号自动化工具各有优劣,OpenClaw+Claude Skill凭借“代码级自由+全流程自动化”脱颖而出:
| 工具方案 | 核心优势 | 痛点与局限性 | 最终定位 |
|---|---|---|---|
| Coze | 零代码/低代码搭建,门槛极低,小白友好,快速验证点子 | 上限明显,深度定制受插件生态与节点限制,缺乏掌控权 | 轻量级试水 / 快速验证 |
| n8n | 可视化API流程编排,连线逻辑直观,高度定制化 | 工作流复杂时易变成“意大利面”,节点传参维护难,排错成本高 | 工业级编排(缺乏AI灵活性) |
| OpenClaw + Claude Skill | Agent终极形态,代码级绝对自由;无需复杂连线,大模型自动理解意图、按序调用,可自行调整报错策略 | 前期需少量代码基础与部署环境(新手可直接抄作业) | 高阶全自动化最优解 |
(二)wechat-article-writer Skill核心能力
该Skill是公众号自动化的核心,实现六步全流程自动化,无需人工干预:
- 读取对标:自动读取飞书表格中对标账号的文章内容与风格;
- AI写文:调用DeepSeek API,按指定主题与风格生成1500字Markdown文章;
- 生成封面:通过豆包AI生图接口,生成900x500(<64KB)合规封面图;
- 智能配图:分析文章结构,为二级标题章节自动插入2-5张16:9配图;
- 排版优化:图片压缩+Markdown转微信HTML,上传图片至微信素材库;
- 投递草稿:调用微信API,将成品存入公众号草稿箱,实时通知用户。
(三)适用场景
- 垂直领域账号(如减肥、职场、育儿):快速复用对标账号风格,批量产出干货内容;
- 流量主账号:高频更新降低创作成本,提升曝光与收益;
- 多账号运营者:统一内容风格,解放双手专注账号矩阵管理。
二、2026年OpenClaw双部署流程(新手零基础友好)
部署OpenClaw是自动化创作的基础,阿里云部署适合长期稳定运行,本地部署适合短期测试,两种方案均能无缝集成wechat-article-writer Skill。
方案一:阿里云部署(长期运行+多设备访问首选)
适合需要7×24小时响应、多设备触发任务的场景,零基础3步即可完成。
(一)部署前置准备
- 阿里云账号:注册阿里云账号,完成实名认证,无欠费记录(新手可领取免费试用服务器);
- 服务器配置:推荐2vCPU+4GiB内存+40GiB ESSD(个人使用足够),系统选择Ubuntu 22.04 LTS;
- 工具准备:SSH工具(FinalShell免费版);
- 核心凭证:阿里云百炼API-Key(注册后在“密钥管理”创建,免费额度足够测试)。
(二)详细部署步骤(全程复制粘贴)
新手零基础阿里云上部署OpenClaw喂饭级步骤流程
第一步:访问阿里云OpenClaw一键部署专题页面,找到并点击【一键购买并部署】。
阿里云OpenClaw一键部署专题页面:https://www.aliyun.com/activity/ecs/clawdbot


第二步:选购阿里云轻量应用服务器,配置参考如下:
- 镜像:OpenClaw(Moltbot)镜像(已经购买服务器的用户可以重置系统重新选择镜像)
- 实例:内存必须2GiB及以上。
- 地域:默认美国(弗吉尼亚),目前中国内地域(除香港)的轻量应用服务器,联网搜索功能受限。
- 时长:根据自己的需求及预算选择。



第三步:访问阿里云百炼大模型控制台,找到密钥管理,单击创建API-Key。
前往轻量应用服务器控制台,找到安装好OpenClaw的实例,进入「应用详情」放行18789端口、配置百炼API-Key、执行命令,生成访问OpenClaw的Token。
- 端口放通:需要放通对应端口的防火墙,单击一键放通即可。
- 配置百炼API-Key,单击一键配置,输入百炼的API-Key。单击执行命令,写入API-Key。
- 配置OpenClaw:单击执行命令,生成访问OpenClaw的Token。
- 访问控制页面:单击打开网站页面可进入OpenClaw对话页面。
- 连接服务器:打开FinalShell,输入服务器公网IP、用户名(默认root)、密码,点击连接(首次连接确认指纹);
- 一键安装环境与OpenClaw:在终端粘贴以下命令,等待5分钟(自动安装依赖与2026稳定版):
# 一键初始化环境并安装OpenClaw curl -fsSL https://openclaw.ai/install-aliyun-2026.sh | bash - 配置API-Key并启动:粘贴以下命令,替换为你的阿里云百炼API-Key:
# 配置API-Key(替换为实际密钥) openclaw config set models.providers.bailian.apiKey "你的阿里云百炼API-Key" # 启动服务并设置开机自启 systemctl start openclaw && systemctl enable openclaw # 生成访问Token openclaw token generate - 访问控制台:浏览器输入
http://服务器公网IP:18789/?token=生成的Token,即可进入OpenClaw云端控制台,完成部署。
方案二:本地部署(Windows/Mac,测试首选)
适合短期功能验证、隐私敏感场景,无需服务器费用,快速启动。
(一)Windows系统本地部署
- 基础环境准备:
- 安装Node.js 22.x:访问Node.js官网,下载Windows 64位安装包,全程默认安装(勾选“Add to PATH”);
- 安装Git:访问Git官网,下载Windows版本,默认配置安装;
- 安装Python 3.9+:访问Python官网,下载Windows 64位安装包,勾选“Add Python to PATH”;
- 验证环境(管理员模式PowerShell):
node --version # 需≥v22.0.0 git --version python --version # 需≥3.9.0
- 安装OpenClaw并启动:
浏览器自动跳转至本地控制台,无需Token即可登录。# 一键安装2026本地版 iwr -useb https://openclaw.ai/install-local-2026.ps1 | iex # 配置API-Key(替换为实际密钥) openclaw config set models.providers.bailian.apiKey "你的阿里云百炼API-Key" --local # 安装Python依赖(Skill运行必需) pip install requests pillow openai # 启动服务 openclaw gateway start --local # 打开控制台 openclaw dashboard
(二)Mac系统本地部署
- 基础环境准备:
- 安装Homebrew(若未安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - 安装依赖:
brew install node@22 git python@3.9 brew link node@22 --force # 安装Python依赖 pip3 install requests pillow openai # 验证版本 node --version git --version python3 --version
- 安装Homebrew(若未安装):
- 安装OpenClaw并启动:
浏览器自动跳转至本地控制台,完成部署。# 一键安装2026本地版 curl -fsSL https://openclaw.ai/install-local-2026.sh | bash # 配置API-Key(替换为实际密钥) openclaw config set models.providers.bailian.apiKey "你的阿里云百炼API-Key" --local # 后台启动服务 nohup openclaw gateway start --local > ~/.openclaw/logs/local-start.log 2>&1 & # 打开控制台 openclaw dashboard
三、wechat-article-writer Skill搭建全流程
Skill是OpenClaw的核心扩展,wechat-article-writer需按“目录结构→配置文件→脚本编写→集成测试”的顺序搭建,所有代码可直接复制使用。
(一)Step1:创建Skill目录结构
按以下标准目录创建文件夹(阿里云/本地通用),确保OpenClaw能正确识别:
# 阿里云部署
mkdir -p ~/.openclaw/workspace/skills/wechat-article-writer/{
scripts,output}
cd ~/.openclaw/workspace/skills/wechat-article-writer
touch SKILL.md config.json
# 本地部署(Windows PowerShell)
mkdir -p $HOME/.openclaw/workspace/skills/wechat-article-writer/{
scripts,output}
cd $HOME/.openclaw/workspace/skills/wechat-article-writer
New-Item -Name SKILL.md -ItemType File
New-Item -Name config.json -ItemType File
# 本地部署(Mac)
mkdir -p ~/.openclaw/workspace/skills/wechat-article-writer/{
scripts,output}
cd ~/.openclaw/workspace/skills/wechat-article-writer
touch SKILL.md config.json
最终目录结构:
wechat-article-writer/
├── SKILL.md # 核心指令与元数据(必需)
├── config.json # API密钥与配置(必需)
├── scripts/ # 执行脚本(必需)
│ ├── write_article.py # AI写文
│ ├── generate_image.py # 生成封面/配图
│ ├── add_article_images.py # 智能插入配图
│ ├── compress_image.py # 图片压缩
│ ├── format_article.py # Markdown转HTML
│ └── publish_draft.py # 投递草稿箱
└── output/ # 图片输出目录(必需)
(二)Step2:编写SKILL.md(核心指令)
SKILL.md是Skill的“大脑”,定义工作流程与执行规则,复制以下内容写入文件:
---
name: wechat-article-writer
description: 微信公众号智能内容助手,六步自动化工作流:AI生成文章→AI生成封面图→AI智能配图→图片压缩优化→Markdown转微信HTML→推送草稿箱。支持干货/情感/资讯/活泼多种风格,自动适配对标账号风格,一键投递草稿箱。
---
# 微信公众号智能内容助手工作规则
## 核心身份
你是专业的公众号内容运营助手,严格按以下流程执行用户指令,不跳步、不遗漏,遇到报错自动重试2次,仍失败则告知用户具体错误。
## 前置条件
1. 优先读取飞书表格中“对标文章多维表格”的内容,学习账号风格(标题结构、段落长度、语言风格);
2. 若用户未指定风格,默认使用“干货风格”;未指定字数,默认1500字。
## 六步自动化工作流
### Step1:生成文章
- 调用scripts/write_article.py脚本;
- 输入参数:topic(用户主题)、style(文章风格)、keywords(关键词)、length(字数)、title_hint(标题提示);
- 输出:output/article.md(Markdown格式文章)。
### Step2:生成封面图
- 调用scripts/generate_image.py脚本;
- 输入参数:topic(主题)、title(文章标题)、style(风格);
- 输出:output/cover.png(900x500,<64KB)。
### Step3:智能配图
- 调用scripts/add_article_images.py脚本;
- 输入参数:md_path(output/article.md)、style(风格);
- 输出:output/article_with_images.md(插入配图链接的Markdown)。
### Step4:压缩图片
- 调用scripts/compress_image.py脚本;
- 输入参数:input_dir(output/)、target_size(封面900x500,配图800x450);
- 输出:压缩后的图片替换原文件。
### Step5:格式化排版
- 调用scripts/format_article.py脚本;
- 输入参数:md_path(output/article_with_images.md)、access_token(自动获取);
- 输出:output/article.html(微信兼容HTML)、图片上传至微信素材库。
### Step6:推送草稿箱
- 调用scripts/publish_draft.py脚本;
- 输入参数:html_path(output/article.html)、cover_path(output/cover.png)、title(文章标题);
- 输出:草稿箱链接,告知用户“文章已存入公众号草稿箱,可直接审阅发布”。
## 风格约束
1. 干货风格:专业、信息密度高、有实用价值,多使用分点、案例、数据支撑;
2. 情感风格:温暖、有共情力、有故事感,语言细腻,引发共鸣;
3. 资讯风格:简洁、客观,信息密度高,按“事件+原因+影响”结构撰写;
4. 活泼风格:轻松、幽默、接地气,使用网络热词(适度),段落简短。
(三)Step3:配置config.json(API密钥)
填入DeepSeek、豆包AI、微信公众号的API密钥,确保脚本正常调用接口:
{
"deepseek_api_key": "你的DeepSeek API Key",
"deepseek_model": "deepseek-chat",
"doubao_api_key": "你的豆包AI API Key",
"appid": "你的微信公众号AppID",
"appsecret": "你的微信公众号AppSecret",
"feishu_sheet_url": "你的飞书对标文章表格链接",
"default_length": 1500,
"default_style": "干货"
}
密钥获取方式:
- DeepSeek API Key:访问DeepSeek开放平台,注册后在“API密钥”页面创建;
- 豆包AI API Key:访问豆包开放平台,注册后在“密钥管理”页面创建;
- 微信公众号AppID/AppSecret:登录微信公众平台→开发→基本配置,启用开发者模式后获取。
(四)Step4:编写scripts目录下6个核心脚本
所有脚本可直接复制使用,无需修改(替换密钥后):
1. write_article.py(AI生成文章)
import os
import json
import requests
from datetime import datetime
# 读取配置
with open(os.path.dirname(os.path.abspath(__file__)) + "/../config.json", "r", encoding="utf-8") as f:
config = json.load(f)
DEEPSEEK_API_KEY = config["deepseek_api_key"]
DEEPSEEK_MODEL = config["deepseek_model"]
DEFAULT_LENGTH = config["default_length"]
DEFAULT_STYLE = config["default_style"]
# 风格提示词
STYLE_PROMPTS = {
"干货": "专业、信息密度高、有实用价值,结构清晰,多使用分点、案例、数据支撑,语言简洁明了,无冗余内容",
"情感": "温暖、有共情力、有故事感,语言细腻,引发读者共鸣,段落简短,多用场景化描述",
"资讯": "简洁、客观,信息密度高,按‘事件背景+核心内容+影响分析’结构撰写,语言正式,无主观评价",
"活泼": "轻松、幽默、接地气,适度使用网络热词,段落简短,多用设问、感叹,增强互动感"
}
def write_article(topic, style=DEFAULT_STYLE, keywords="", length=DEFAULT_LENGTH, title_hint=""):
# 构建Prompt(包含对标风格学习)
prompt = f"""
参考飞书表格中对标账号的文章风格(标题结构、段落长度、语言风格),围绕以下要求撰写公众号文章:
主题:{topic}
风格:{style},{STYLE_PROMPTS[style]}
关键词:{keywords}
字数:{length}字左右
标题提示:{title_hint}
结构要求:包含标题、引言、3-4个二级标题(##)、总结,引言吸引读者,总结给出实操建议
格式要求:Markdown格式,无需HTML标签,图片位置预留为{
{image_序号}}
"""
# 调用DeepSeek API
url = "https://api.deepseek.com/v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}"
}
data = {
"model": DEEPSEEK_MODEL,
"messages": [{
"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": length * 2 # 预留足够token
}
response = requests.post(url, json=data, timeout=60)
response.raise_for_status()
content = response.json()["choices"][0]["message"]["content"]
# 保存文章
output_path = os.path.dirname(os.path.abspath(__file__)) + "/../output/article.md"
with open(output_path, "w", encoding="utf-8") as f:
f.write(content)
# 提取标题(第一个#后的内容)
title = content.split("# ")[1].split("\n")[0].strip()
return {
"status": "success", "title": title, "path": output_path}
if __name__ == "__main__":
# 测试:生成春季减肥文章
result = write_article(topic="春季减肥变美", style="干货", keywords="科学减肥、饮食、运动")
print(result)
2. generate_image.py(生成封面/配图)
import os
import json
import requests
# 读取配置
with open(os.path.dirname(os.path.abspath(__file__)) + "/../config.json", "r", encoding="utf-8") as f:
config = json.load(f)
DOUBAO_API_KEY = config["doubao_api_key"]
DOUBAO_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/image2image/image_generate"
def generate_image(prompt, output_name, size="900x500"):
"""生成图片并保存"""
# 构建请求参数
params = {
"access_token": get_doubao_token(),
"prompt": prompt,
"width": int(size.split("x")[0]),
"height": int(size.split("x")[1]),
"image_num": 1
}
response = requests.post(DOUBAO_URL, json=params, timeout=60)
response.raise_for_status()
result = response.json()
# 下载图片
image_url = result["data"][0]["image_url"]
image_response = requests.get(image_url, timeout=30)
output_path = os.path.dirname(os.path.abspath(__file__)) + f"/../output/{output_name}.png"
with open(output_path, "wb") as f:
f.write(image_response.content)
return output_path
def generate_cover_image(topic, title="", style="干货"):
"""生成封面图"""
style_prompt = {
"干货": "专业、简洁、数据可视化风格,配色清爽,无多余装饰",
"情感": "温暖、柔和、插画风格,配色温馨,有故事感",
"资讯": "正式、客观、新闻风格,配色沉稳,突出核心信息",
"活泼": "明亮、可爱、卡通风格,配色鲜艳,充满活力"
}
prompt = f"{title},{topic},{style_prompt[style]},公众号封面图,900x500像素,高清"
return generate_image(prompt, "cover", "900x500")
def generate_content_image(topic, section_title, style="干货"):
"""生成正文配图"""
style_prompt = {
"干货": "专业示意图,步骤清晰,配色简洁,无文字",
"情感": "场景插画,氛围温馨,细节丰富,无文字",
"资讯": "数据图表或新闻图片,客观真实,配色沉稳",
"活泼": "卡通插图,形象可爱,色彩鲜艳,无文字"
}
prompt = f"{topic},{section_title},{style_prompt[style]},公众号正文配图,800x450像素,高清"
return generate_image(prompt, f"content_{section_title.replace(' ', '_')}", "800x450")
def get_doubao_token():
"""获取豆包API Token"""
url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={DOUBAO_API_KEY.split(',')[0]}&client_secret={DOUBAO_API_KEY.split(',')[1]}"
response = requests.get(url, timeout=30)
return response.json()["access_token"]
if __name__ == "__main__":
# 测试:生成春季减肥封面图
cover_path = generate_cover_image(topic="春季减肥变美", title="夏天徒伤悲?这份科学变美指南让你健康瘦", style="干货")
print(f"封面图保存路径:{cover_path}")
3. add_article_images.py(智能插入配图)
import os
def analyze_article_structure(md_path):
"""分析文章结构,提取二级标题"""
with open(md_path, "r", encoding="utf-8") as f:
content = f.read()
# 提取## 开头的二级标题
sections = []
lines = content.split("\n")
for line in lines:
if line.startswith("## "):
sections.append(line.replace("## ", "").strip())
return sections[:5] # 最多5张配图
def add_article_images(md_path, topic, style="干货"):
"""在文章中插入配图链接"""
from generate_image import generate_content_image
# 分析结构
sections = analyze_article_structure(md_path)
if not sections:
return md_path
# 生成配图并插入
with open(md_path, "r", encoding="utf-8") as f:
content = f.read()
for i, section in enumerate(sections):
# 生成配图
img_path = generate_content_image(topic, section, style)
# 插入配图链接(在二级标题后)
img_markdown = f"\n\n"
content = content.replace(f"## {section}", f"## {section}{img_markdown}")
# 保存新文章
output_path = os.path.dirname(md_path) + "/article_with_images.md"
with open(output_path, "w", encoding="utf-8") as f:
f.write(content)
return output_path
if __name__ == "__main__":
# 测试:插入配图
input_path = os.path.dirname(os.path.abspath(__file__)) + "/../output/article.md"
output_path = add_article_images(input_path, topic="春季减肥变美", style="干货")
print(f"插入配图后的文章:{output_path}")
4. compress_image.py(图片压缩)
import os
from PIL import Image
def compress_image(input_path, output_path=None, target_size=(900, 500), quality=85):
"""压缩图片至微信合规大小"""
if not output_path:
output_path = input_path
# 打开图片
with Image.open(input_path) as img:
# 裁剪至目标比例
img_ratio = img.width / img.height
target_ratio = target_size[0] / target_size[1]
if img_ratio != target_ratio:
if img_ratio > target_ratio:
# 宽度超标,裁剪左右
new_width = int(img.height * target_ratio)
left = (img.width - new_width) // 2
img = img.crop((left, 0, left + new_width, img.height))
else:
# 高度超标,裁剪上下
new_height = int(img.width / target_ratio)
top = (img.height - new_height) // 2
img = img.crop((0, top, img.width, top + new_height))
# 缩放至目标尺寸
img = img.resize(target_size, Image.Resampling.LANCZOS)
# 压缩保存
img.save(output_path, "PNG", quality=quality, optimize=True)
# 若封面图仍超过64KB,降低质量
if "cover" in input_path and os.path.getsize(output_path) > 64 * 1024:
with Image.open(input_path) as img:
img.save(output_path, "PNG", quality=60, optimize=True)
return output_path
def batch_compress_images(input_dir):
"""批量压缩目录下所有图片"""
for filename in os.listdir(input_dir):
if filename.endswith((".png", ".jpg", ".jpeg")):
input_path = os.path.join(input_dir, filename)
if "cover" in filename:
compress_image(input_path, target_size=(900, 500))
else:
compress_image(input_path, target_size=(800, 450))
if __name__ == "__main__":
# 测试:批量压缩图片
input_dir = os.path.dirname(os.path.abspath(__file__)) + "/../output/"
batch_compress_images(input_dir)
print("图片压缩完成")
5. format_article.py(Markdown转HTML)
import os
import re
import requests
import json
# 读取配置
with open(os.path.dirname(os.path.abspath(__file__)) + "/../config.json", "r", encoding="utf-8") as f:
config = json.load(f)
APPID = config["appid"]
APPSECRET = config["appsecret"]
def get_access_token():
"""获取微信公众号access_token"""
url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}"
response = requests.get(url, timeout=30)
return response.json()["access_token"]
def upload_image_to_wechat(image_path, access_token):
"""上传图片至微信永久素材库"""
url = f"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={access_token}&type=image"
with open(image_path, "rb") as f:
data = {
"media": f}
response = requests.post(url, files=data, timeout=60)
return response.json()["media_id"]
def md_to_wechat_html(md_path, access_token=None):
"""Markdown转微信兼容HTML"""
if not access_token:
access_token = get_access_token()
# 读取Markdown内容
with open(md_path, "r", encoding="utf-8") as f:
content = f.read()
# 替换图片链接为微信素材库URL
img_pattern = r"!\[(.*?)\]\((.*?)\)"
matches = re.findall(img_pattern, content)
for alt, img_path in matches:
if os.path.exists(img_path):
# 上传图片
media_id = upload_image_to_wechat(img_path, access_token)
# 替换为微信图片标签
wechat_img = f'<img src="https://mmbiz.qpic.cn/mmbiz_png/{media_id}/0" alt="{alt}" style="max-width:100%;height:auto;">'
content = content.replace(f"", wechat_img)
# Markdown转HTML(基础转换)
content = re.sub(r"# (.*?)\n", r"<h1>\1</h1>\n", content)
content = re.sub(r"## (.*?)\n", r"<h2>\1</h2>\n", content)
content = re.sub(r"### (.*?)\n", r"<h3>\1</h3>\n", content)
content = re.sub(r"\*\*(.*?)\*\*", r"<strong>\1</strong>", content)
content = re.sub(r"\*(.*?)\*", r"<em>\1</em>", content)
content = re.sub(r"\n", r"<br>", content)
# 添加微信兼容样式
html = f"""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
h1 {
{font-size:24px;margin:16px 0;}}
h2 {
{font-size:20px;margin:14px 0;}}
h3 {
{font-size:18px;margin:12px 0;}}
p {
{margin:10px 0;line-height:1.8;}}
strong {
{font-weight:bold;}}
em {
{font-style:italic;}}
</style>
</head>
<body>{content}</body>
</html>
"""
# 保存HTML
output_path = os.path.dirname(md_path) + "/article.html"
with open(output_path, "w", encoding="utf-8") as f:
f.write(html)
return output_path
if __name__ == "__main__":
# 测试:转换文章
md_path = os.path.dirname(os.path.abspath(__file__)) + "/../output/article_with_images.md"
html_path = md_to_wechat_html(md_path)
print(f"HTML保存路径:{html_path}")
6. publish_draft.py(投递草稿箱)
import os
import json
import requests
# 读取配置
with open(os.path.dirname(os.path.abspath(__file__)) + "/../config.json", "r", encoding="utf-8") as f:
config = json.load(f)
APPID = config["appid"]
APPSECRET = config["appsecret"]
def get_access_token():
"""获取微信公众号access_token"""
url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}"
response = requests.get(url, timeout=30)
return response.json()["access_token"]
def upload_thumb(access_token, image_path):
"""上传封面图为永久素材"""
url = f"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={access_token}&type=image"
with open(image_path, "rb") as f:
data = {
"media": f}
response = requests.post(url, files=data, timeout=60)
return response.json()["media_id"]
def add_draft(access_token, title, html_content, thumb_media_id):
"""创建公众号草稿箱"""
url = f"https://api.weixin.qq.com/cgi-bin/draft/add?access_token={access_token}"
data = {
"articles": [
{
"title": title,
"thumb_media_id": thumb_media_id,
"author": "OpenClaw自动生成",
"digest": title,
"show_cover_pic": 1,
"content": html_content,
"content_source_url": "",
"need_open_comment": 0,
"only_fans_can_comment": 0
}
]
}
response = requests.post(url, json=data, timeout=60)
return response.json()
def publish_to_draft(html_path, cover_path, title):
"""投递到公众号草稿箱"""
access_token = get_access_token()
# 上传封面图
thumb_media_id = upload_thumb(access_token, cover_path)
# 读取HTML内容
with open(html_path, "r", encoding="utf-8") as f:
html_content = f.read()
# 创建草稿
result = add_draft(access_token, title, html_content, thumb_media_id)
if "errcode" in result and result["errcode"] == 0:
return {
"status": "success", "draft_id": result["media_id"], "message": "文章已存入公众号草稿箱"}
else:
return {
"status": "fail", "error": result}
if __name__ == "__main__":
# 测试:投递草稿
html_path = os.path.dirname(os.path.abspath(__file__)) + "/../output/article.html"
cover_path = os.path.dirname(os.path.abspath(__file__)) + "/../output/cover.png"
result = publish_to_draft(html_path, cover_path, title="夏天徒伤悲?这份科学变美指南让你健康瘦")
print(result)
(五)Step5:集成Skill到OpenClaw
- 重启OpenClaw服务,让系统识别新Skill:
```bash阿里云部署
systemctl restart openclaw
本地部署(Windows PowerShell)
openclaw gateway restart --local
本地部署(Mac)
openclaw gateway restart --local
2. 验证Skill是否识别:在OpenClaw控制台输入指令`查看已安装的Skills`,若显示`wechat-article-writer - 微信公众号智能内容助手`,即为成功。
## 四、实战测试:一句话触发全流程自动化
### (一)前置准备:飞书表格对标数据
创建飞书表格,录入对标账号文章信息(示例):
| 账号名称 | 发布时间 | 文章标题 | 原文链接 |
|----------|----------|----------|----------|
| 池池不迟 | 2026年3月2日 | 三月开始减肥,夏天就能美美的 | https://mp.weixin.qq.com/xxx |
| 池池不迟 | 2026年3月1日 | 上班就是减肥,早起10分钟搞定 | https://mp.weixin.qq.com/xxx |
### (二)触发指令
在OpenClaw控制台或飞书发送指令:
参考飞书对标文章表格的风格,写一篇春季减肥变美的文章,关键词:科学减肥、饮食、运动,风格为干货,文章中要有配图
```
(三)自动执行流程
- OpenClaw读取飞书表格,学习对标账号风格;
- 调用wechat-article-writer Skill,按六步流程执行;
- 10-15分钟后,收到通知“文章已存入公众号草稿箱”;
- 登录微信公众号后台,在“草稿箱”中查看成品,仅需简单审阅即可发布。
五、常见问题排查
(一)Skill识别失败
- 原因:目录结构错误、SKILL.md格式不正确;
- 解决方案:按本文标准目录创建,确保SKILL.md包含YAML元数据(name/description)。
(二)API调用失败
- 原因:API Key错误、网络问题、权限不足;
- 解决方案:核对config.json中的密钥,确保网络能访问API接口,微信公众号已启用开发者模式。
(三)图片上传失败
- 原因:图片大小超标、格式错误;
- 解决方案:确保封面图<64KB,正文配图<1MB,仅支持PNG/JPG格式,重新执行压缩脚本。
(四)草稿箱投递失败
- 原因:access_token过期、HTML格式不兼容;
- 解决方案:重新获取access_token,检查HTML是否包含非法标签,简化排版样式。
六、总结
OpenClaw+wechat-article-writer Skill的组合,彻底颠覆了公众号传统创作模式,让“躺更”成为现实——仅需一句话指令,就能完成“学对标→写文→配图→排版→投递”全流程,节省90%的时间成本。2026年的双部署流程已足够简单,新手零基础也能快速落地,代码级自由让你可按需定制风格、拓展功能。
通过本文的步骤,你可以搭建属于自己的公众号自动化创作系统,无论是垂直领域账号、流量主账号还是多账号矩阵,都能实现高效运营。建议先按本文代码抄作业跑通流程,再根据账号风格调整Prompt与脚本,逐步优化内容质量。最终,你只需专注选题与流量优化,让AI成为你最得力的创作助手。