背景
公司为了将网站生产的内容自动发布到WordPress博客网站,但由于CORS问题,需要在服务器做代理转发路由。一是实现前后端分离,而是方便接口统一管理。该项目提供使用Node方式的XMLRPC使用思路。
记录
1、通过研究python-wordpress-xmlrpc库及WordPress官方文档,了解XMLRPC协议机制,了解WP网站参数传递与返回
from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo
from wordpress_xmlrpc.methods import taxonomies
import csv
wp = Client('http://www.your_wordpress_domain.com/xmlrpc.php', 'wordpress_login_account', 'wordpress_login_pwd')
post = WordPressPost()
post.title = '文章标题'
post.content = '文章内容'
post.post_status = 'publish'
post.terms_names = {
'post_tag': ['唐诗'],
'category': ['古诗词']
}
wp.call(NewPost(post))
2、以向WP网站发布文章举例
WordPress网站可通过XMLRPC方式来操作博客数据,所以需生成XML格式数据
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>
wp.newPost
</methodName>
<params>
<param>
<value>
<int>
0
</int>
</value>
</param>
<param>
<value>
<string>
WordPress网站用户账号
</string>
</value>
</param>
<param>
<value>
<string>
WordPress网站用户密码
</string>
</value>
</param>
<param>
<value>
<struct>
<member>
<name>
post_status
</name>
<value>
<string>
publish
</string>
</value>
</member>
<member>
<name>
post_title
</name>
<value>
<string>
文章标题
</string>
</value>
</member>
<member>
<name>
post_thumbnail
</name>
<value>
<int>
封面图或者缩略图ID
</int>
</value>
</member>
<member>
<name>
post_excerpt
</name>
<value>
<string>
摘要
</string>
</value>
</member>
<member>
<name>
post_content
</name>
<value>
<string>
<![CDATA[文章内容]]>
</string>
</value>
</member>
<member>
<name>
post_type
</name>
<value>
<string>
post
</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
- 以上是基本的XML格式数据,还可自定义添加Tag、Category、Term等其他内容。
- 此XML格式是固定的。
- 封面图ID是int类型,需要先上传图片并获取一个ID。
3、NodeServer接口使用request库向WP网站发送请求
关于WP网站Endpoint,一般是"域名/xmlrpc.php",其他情况官网有说明,如下
router.post('/post', function (req, res, next) {
var domain = req.body.domain;
var wpEndpoint = domain + "/xmlrpc.php";
var reqBody = coverToXml(req.body);//转换成上面第2点的XML格式数据
request({
url: wpEndpoint,
method: "POST",
headers: {
"Accept": "*/*",
"content-type": "text/xml",
"User-Agent": "nodejs-xmlrpc-1.0"
},
body: reqBody
}, function (error, response, body) {
res.send(body);// body is xml
});
});
4、返回参数是XML格式,可通过fast-xml-parser库解析
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<string>1602</string>
</value>
</param>
</params>
</methodResponse>
解析代码如下
function getResArticle(resBody) {
var xml2json = fxp.parse(resBody);//require("fast-xml-parser");
var articleId = xml2json.methodResponse.params.param.value.string;
return articleId;
}