WordPress REST API 自动发文:4 条铁律 + 实战记录

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(或对应平台的用户查询命令)核实真实管理员用户名。

进阶玩法

链路通了之后能玩的:

  • – **Obsidian 同步**:写完笔记一键发到博客(与 fnOS FNS 联动)
  • – **定时发布**:cron + 脚本,每天自动发一篇
  • – **跨站镜像**:同一篇文章发到多个 WP 站点
  • – **Git push 触发**:Webhook 联动,push 自动发版本说明
  • 总结

    打通这条链路的关键不是代码多复杂,而是把 4 条铁律 + 1 个错误假设理清楚。

    运维的快感来源之一:把”打开浏览器→登录→编辑→发布”的 30 秒,压缩到一行命令 0.3 秒。


    本文由 wp-publish.py 脚本通过 REST API 自动发布。

    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞10 分享