WordPress REST API 自动发文:4 条铁律 + 实战记录
把”打开浏览器→登录→编辑→发布”的 30 秒,压缩到一行命令 0.3 秒。
背景
阿里云 ECS 上跑着 WordPress 7.0.2 + Zibll 主题。日常想批量发文章、或者把 Obsidian 笔记同步到博客,每次都要登后台手动复制粘贴。今天终于把 REST API 自动发文的链路打通了,过程踩了 4 个坑,记录一下。
准备工作
1. 创建应用密码
WordPress 5.6+ 内置 Application Password 功能。路径:后台 → 用户 → 个人资料 → 应用密码 → 添加新应用密码。
注意:密码只显示一次,丢了只能删了重建。
2. 存到环境变量
密码不要硬编码在脚本里(容易随 git 同步泄露)。Windows 用户级环境变量最方便:
4 条铁律
调试过程踩的坑,最后总结成 4 条调用铁律,缺一就 401 或 404:
| # | 铁律 | 原因 |
|—|—|—|
| 1 | **必须用 www 子域** | 裸域 4134.cn 会 301 跳转,curl 默认不跟随 |
| 2 | **必须带浏览器 UA** | 宝塔 btwaf WAF 按 UA 拦扫描器,python-requests/curl 默认 UA 假 404 |
| 3 | **必须 `–noproxy “*”`** | v2rayN 系统代理对国内域名不可靠 |
| 4 | **应用密码 strip 空格** | 官方两种格式都支持,但实测去空格版本最稳 |
实战调用
最简的健康检查:
curl.exe -sL --noproxy "*" `
-u "master:$pass" `
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0" `
"https://www.4134.cn/wp-json/wp/v2/users/me"
期望 HTTP 200 + 返回用户 JSON。
POST 发文
-u "master:$pass" `
-H "Content-Type: application/json" `
-d '{"title":"test","content":"hello","status":"draft"}'
返回 HTTP 201 + 新建文章的 id。
Python 脚本要点
完整脚本用标准库 urllib 实现,无需 pip install:
auth = base64.b64encode(f"{user}:{app_pass}".encode()).decode()
req = urllib.request.Request(url, data=json.dumps(payload).encode("utf-8"), method="POST")
req.add_header("Authorization", f"Basic {auth}")
req.add_header("Content-Type", "application/json; charset=utf-8")
req.add_header("User-Agent", "Mozilla/5.0 ...")
# 关键:不走系统代理
opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
跑法:
踩坑记录
最大的坑是用户名假设错了。
FNS(飞牛笔记同步)那边的账号是 cudoer,我以为 WordPress 也是同一个。结果 REST API 一直返回 401,折腾半天才反应过来:WordPress 的管理员用户名是 master,跟 FNS 完全无关。
教训:跨系统用户名不要从其他系统上下文搬运。接入新系统时第一件事应该是 wp user list(或对应平台的用户查询命令)核实真实管理员用户名。
进阶玩法
链路通了之后能玩的:
总结
打通这条链路的关键不是代码多复杂,而是把 4 条铁律 + 1 个错误假设理清楚。
运维的快感来源之一:把”打开浏览器→登录→编辑→发布”的 30 秒,压缩到一行命令 0.3 秒。
本文由 wp-publish.py 脚本通过 REST API 自动发布。
