Python 调用 WordPress REST API 获取及创建文章
在之前有关 Rest API 系列的文章中我们可以了解到 WordPress 本身内置了对 REST API 的支持,以及 Frontity 通过 Node.js 系统调用 WordPress REST API 实现与 WordPress 交互的功能。本篇文章将以此为基础介绍如何在 Python 应用中调用 WordPress REST API 实现获取并创建文章等功能。
WordPress REST API 有关的基本内容请参考这篇文章,这里就直接使用其中的概念和方法。
一、配置 WordPress
如果 WordPress 是搭建在本地的测试环境中,基于版本的不同需要做一下配置:
WordPress >=5.6,在 wp-config.php 中增加下面一行,如果是在生产环境中而且支持 HTTPS 则无需该配置项。
define( ‘WP_ENVIRONMENT_TYPE’, ‘local’ );
WordPress<5.6,需要安装并激活插件 “Application Passwords”。
配置完成后到 WordPress 的后台,选择一个用户并编辑,比如管理员用户“ admin”(WordPress安装时创建的),在页面的最后面有一行 Application Passwords,在
“New Application Password Name” 文本框中输入一个字符串,比如 “pyrest”,然后点击下面的按钮会生成一串字符,这串字符是外部调用 WordPress REST API 做用户鉴权时的口令,这样就无需使用真实的用户(admin)口令,这串字符也是无法做登录使用的。把这串字符保存到一个文件中,后面会用到。
二、安装 Python 模块
这里的网络处理部分代码会用到 Python 模块 Requests,具体的使用方法请参考官网的指南。
$ python -m pip install requests
三、Python 客户端
下面的例子代码获取并输出 WordPress 的文章列表,另外还创建一篇新的文章。
import requests
import base64
username = "admin"
password = "K1ge NTt8 Eu9B 4h36 eeRX n6Mk"
credentials = username + ":" + password
token = base64.b64encode(credentials.encode())
header = {'Authorization': 'Basic ' + token.decode('utf-8')}
url = "http://127.0.0.1/wp-json/wp/v2/posts"
response = requests.get(url)
results_json = response.json()
for index in range(len(results_json)):
print ('title : %s' % results_json[index]['title']['rendered'])
print ('content : %s' % results_json[index]['content']['rendered'])
newpost = {
'title' : 'Python with WordPress REST API',
'content': 'Python Application call WordPress REST API to create a new post.',
'status': 'publish',
'slug' : 'python-wordpress-rest-api',
'date' : '2022-06-26T09:30:00'
}
response = requests.post(url, headers=header, json=newpost)
也可以用上一篇文章介绍的 curl 的方法来实现,使用了 PycURL 模块,该模块用 C 语言写的(基于操作系统的 libcurl 库),因此比 Requests 模块要快:
import pycurl
from io import BytesIO
import json
headers = ["Content-Type:application/json"]
url = "http://%s:%s/wp-json/wp/v2/posts" %('127.0.0.1', '80')
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, headers)
c.setopt(pycurl.WRITEDATA, buffer)
c.perform()
c.close()
results = buffer.getvalue()
print(json.loads(results))
其它的功能如编辑文章、删除文章、创建新用户、上传图片文件等功能是类似的,就是分别调用不同 Endpoints 的 URL,请参考官网的说明。