背景
公司爲了將網站生產的內容自動發佈到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;
}