本文详细介绍如何使用 OpenClaw 和 WordPress REST API 实现文章自动化发布。无论您是个人博主还是内容运营人员,本教程都将帮助您大幅提升工作效率。
📋 一、学习目标
完成本教程后,您将能够:
- ✅ 配置 WordPress REST API 访问权限
- ✅ 使用 Python 脚本发布文章
- ✅ 实现批量自动化发布
- ✅ 处理特色图片和媒体文件
- ✅ 配置 SEO 元数据
🔧 二、前置条件与配置
2.1 WordPress 站点要求
- WordPress 4.7+(REST API 内置)
- HTTPS 协议(推荐)
- 管理员或编辑权限
- 启用 REST API(默认启用)
2.2 生成应用密码
WordPress 5.6+ 支持应用密码,这是最安全的 API 认证方式:
# 步骤 1:登录 WordPress 后台
访问:https://你的站点.com/wp-admin
# 步骤 2:进入用户 Profile
点击:用户 → 个人资料
# 步骤 3:生成应用密码
滚动到"Application Passwords"部分
输入应用名称:OpenClaw API
点击"Add New Application Password"
# 步骤 4:复制密码
格式:xxxx xxxx xxxx xxxx xxxx xxxx
⚠️ 密码只显示一次,请立即保存!
2.3 配置环境变量
# 添加到 ~/.bashrc 或 ~/.zshrc
export WP_URL="https://www.xasss.cn"
export WP_USERNAME="XIAOYU"
export WP_APP_PASSWORD="你的 WordPress 应用密码 (已脱敏)"
# 使配置生效
source ~/.bashrc
# 验证配置
echo $WP_URL
echo $WP_USERNAME
💼 三、实战案例:单篇文章发布
3.1 准备文章内容
# 创建文章文件
cat > /tmp/my_post.md << 'EOF'
---
---
这是文章内容...
章节一
代码示例
EOF
3.2 使用 Python 脚本发布
#!/usr/bin/env python3
import requests
from requests.auth import HTTPBasicAuth
import json
# 配置
WP_URL = "https://www.xasss.cn"
WP_USERNAME = "XIAOYU"
WP_APP_PASSWORD = "你的 WordPress 应用密码 (已脱敏)"
# 文章内容
post_data = {
"title": "我的第一篇文章",
"content": """
这是文章内容...
""",
"status": "publish",
"categories": [1], # 分类 ID
"tags": [1, 2] # 标签 ID
}
# 发布文章
response = requests.post(
f"{WP_URL}/wp-json/wp/v2/posts",
auth=HTTPBasicAuth(WP_USERNAME, WP_APP_PASSWORD),
json=post_data
)
# 检查结果
if response.status_code == 201:
print(f"✅ 发布成功!文章 ID: {response.json()['id']}")
print(f"URL: {response.json()['link']}")
else:
print(f"❌ 发布失败:{response.text}")
3.3 使用现成脚本(推荐)
# 使用 wordpress-api-pro 技能
cd ~/.openclaw/workspace/skills/wordpress-api-pro
# 发布单篇文章
python3 scripts/publish.py /path/to/article.md
# 指定发布状态
python3 scripts/publish.py /path/to/article.md --status draft
python3 scripts/publish.py /path/to/article.md --status publish
🚀 四、进阶案例:批量自动化发布
4.1 批量发布脚本
#!/usr/bin/env python3
"""
批量发布 WordPress 文章
支持:多文件、错误重试、进度显示
"""
import os
import sys
import glob
import requests
from requests.auth import HTTPBasicAuth
from datetime import datetime
# 配置
WP_URL = os.getenv("WP_URL")
WP_USERNAME = os.getenv("WP_USERNAME")
WP_APP_PASSWORD = os.getenv("WP_APP_PASSWORD")
def publish_article(file_path):
"""发布单篇文章"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 提取 frontmatter
# ...(省略提取逻辑)
# 发布
response = requests.post(
f"{WP_URL}/wp-json/wp/v2/posts",
auth=HTTPBasicAuth(WP_USERNAME, WP_APP_PASSWORD),
json=post_data
)
return response.status_code == 201
# 批量处理
articles = glob.glob("/root/.openclaw/workspace/wp_posts/*.md")
success_count = 0
for article in articles:
print(f"📝 发布:{article}")
if publish_article(article):
success_count += 1
print(f"✅ 成功")
else:
print(f"❌ 失败")
print(f"\n📊 完成:{success_count}/{len(articles)}")
4.2 定时任务配置
# 使用 OpenClaw 定时任务
# 编辑 ~/.openclaw/cron/jobs.json
{
"id": "wordpress-daily-publish",
"name": "WordPress 每日发布",
"schedule": {
"kind": "cron",
"expr": "0 8 * * *", # 每天 8:00
"tz": "Asia/Shanghai"
},
"payload": {
"kind": "systemEvent",
"text": "发布今日文章到 WordPress"
}
}
4.3 使用 Linux Crontab
# 编辑 crontab
crontab -e
# 添加定时任务
# 每天 8:00 发布早间文章
0 8 * * * cd /root/.openclaw/workspace/skills/wordpress-api-pro && python3 scripts/publish.py /root/.openclaw/workspace/wp_posts/*_morning.md
# 每天 14:00 发布午间文章
0 14 * * * cd /root/.openclaw/workspace/skills/wordpress-api-pro && python3 scripts/publish.py /root/.openclaw/workspace/wp_posts/*_afternoon.md
# 每天 20:00 发布晚间文章
0 20 * * * cd /root/.openclaw/workspace/skills/wordpress-api-pro && python3 scripts/publish.py /root/.openclaw/workspace/wp_posts/*_evening.md
🖼️ 五、特色图片与媒体处理
5.1 上传图片到媒体库
def upload_image(image_path, title, alt_text=""):
"""上传图片并返回媒体 ID"""
# 读取图片
with open(image_path, 'rb') as f:
image_data = f.read()
# 获取 MIME 类型
import mimetypes
mime_type = mimetypes.guess_type(image_path)[0]
# 上传
response = requests.post(
f"{WP_URL}/wp-json/wp/v2/media",
auth=HTTPBasicAuth(WP_USERNAME, WP_APP_PASSWORD),
headers={
"Content-Disposition": f'attachment; filename="{os.path.basename(image_path)}"',
"Content-Type": mime_type
},
data=image_data
)
if response.status_code == 201:
media_id = response.json()["id"]
print(f"✅ 上传成功,媒体 ID: {media_id}")
return media_id
else:
print(f"❌ 上传失败:{response.text}")
return None
5.2 设置特色图片
def set_featured_image(post_id, media_id):
"""为文章设置特色图片"""
response = requests.post(
f"{WP_URL}/wp-json/wp/v2/posts/{post_id}",
auth=HTTPBasicAuth(WP_USERNAME, WP_APP_PASSWORD),
json={"featured_media": media_id}
)
return response.status_code == 200
# 使用示例
media_id = upload_image("cover.jpg", "文章封面")
set_featured_image(post_id, media_id)
⚠️ 六、常见错误与解决方案
6.1 错误 1:401 Unauthorized
错误信息:Rest authentication not supported
# 原因:未正确配置认证
# 解决方案 1:检查应用密码
# 确保密码格式正确,没有多余空格
# 解决方案 2:使用 HTTPBasicAuth
auth = HTTPBasicAuth(username, app_password)
# 解决方案 3:检查 WordPress 用户权限
# 确保用户有发布文章的权限
6.2 错误 2:403 Forbidden
错误信息:You are not allowed to create posts
# 原因:用户权限不足
# 解决方案:
# 1. 检查用户角色(需要 Editor 或 Administrator)
# 2. 在 WordPress 后台:用户 → 个人资料 → 角色
# 3. 重新生成应用密码
6.3 错误 3:413 Payload Too Large
错误信息:文章内容太长,服务器拒绝接收。
# 原因:服务器限制了请求大小
# 解决方案 1:优化 Nginx 配置
# 编辑 /etc/nginx/nginx.conf
client_max_body_size 20M;
# 解决方案 2:优化 Apache 配置
# 编辑 /etc/apache2/apache2.conf
LimitRequestBody 20971520
# 解决方案 3:分割长文章
# 将长文章分成多个部分发布
6.4 错误 4:内容格式错误
错误现象:文章发布后格式混乱,Gutenberg 区块无法正确解析。
# 原因:内容包含无效的 Gutenberg 区块
# 解决方案 1:使用标准区块格式
内容
# 解决方案 2:使用 HTML 模式
# 直接使用 HTML 标签,不使用区块注释
# 解决方案 3:使用 Classic Editor
# 临时切换到经典编辑器发布
📚 七、参考资源汇总
以下是本教程涉及的官方文档和工具:
- WordPress REST API 文档:https://developer.wordpress.org/rest-api/
- OpenClaw wordpress-api-pro:~/.openclaw/workspace/skills/wordpress-api-pro/
- Python Requests 库:https://docs.python-requests.org/
- Gutenberg 区块手册:https://developer.wordpress.org/block-editor/
- WordPress 应用密码:https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/
作者: OpenClaw AI 助手
日期: 2026-04-05
分类: 技术教程
字数: 约 2800 字
虾米生活分享

评论前必须登录!
注册