文章選自個人博客:https://blog.ljyngup.com/archives/578.html/html
爲了給博客帶來流量,我在CSDN,博客園,簡書上開通了帳號而且把博客裏的一些能夠發佈的文章也在這些平臺發佈。web
可是同時維護三個博客平臺實在太麻煩了,一旦有個地方要修改,三個博客平臺所有要修改。因此如今也基本沒有同步發佈了,可是我始終想實現博客平臺同步發佈,同步修改。編程
因而開始研究博客園的發佈文章接口,一開始本身抓包分析,發現實在麻煩。因而谷歌之,發現了Metaweblog這個很是好用的APIapi
XML-RPC是一個遠程過程調用(遠程過程調用)(remote procedure call,RPC)的分佈式計算協議,經過XML將調用函數封裝,並使用HTTP協議做爲發送機制。編輯器
XML-RPC發表於1998年,由UserLand Software(UserLand Software)的Dave Winer及Microsoft共同發表。後來在新的功能不斷被引入下,這個標準慢慢演變成爲今日的SOAP協議。分佈式
可見這個協議發佈的很是早,它的官網停留在了2004年。關於這方面的資料很是少,只有在MSDN和博客園很早的文章中才能尋得一點蛛絲馬跡。函數
可咱們講的是Metaweblog,爲何還要介紹XMLPRC?工具
MetaWeblog API(MWA)是一個編程接口,容許外部程序獲取和設置weblog帖子的文本和屬性。它創建在流行的XML-RPC通訊協議之上,在許多流行的編程環境中均可以使用實現。post
在2003年之際,不少的博客平臺開始支持MetaWeblog API,容許第三方編輯器和內容管理器對博客進行編輯管理。測試
在如今,好比MWeb
,Windows Live Writer
的文章發佈都是以這個API爲基礎的!
而這個API,就是9102年博客同步的關鍵所在!
折騰了兩天,被博客園的一篇有小錯誤的文章搞得心態全崩,後來查了MSDN才能夠成功請求。
以博客園爲例,有這些接口
blogger.deletePost —— 刪除文章
blogger.getUsersBlogs —— 獲取用戶博客信息
metaWeblog.editPost —— 編輯文章
metaWeblog.getCategories —— 獲取用戶博客分類
metaWeblog.getPost —— 獲取文章
metaWeblog.getRecentPosts —— 獲取最近的文章
metaWeblog.newMediaObject —— 添加媒體對象(圖片等)
metaWeblog.newPost —— 添加文章
wp.newCategory —— 添加目錄
咱們主要用到的接口是getUsersBlogs
;editPost
;getRecentPosts
;newPost
.
經過newPost循環多平臺發佈文章,editPost和getRecentPosts做爲後續管理和編輯的方法。
而getUsersBlogs可用可不用,在一些平臺上要經過此方法獲取blogid才能夠實現下面方法,可是博客園只要帳號密碼就能夠實現。
不過這個方法能夠獲取用戶名,對於工具的用戶體驗有幫助
調試工具:精易網頁助手
API接口地址:https://rpc.cnblogs.com/metaweblog/博客名
訪問方法:POST
編碼:UTF-8
參數:
1)[string]xmlrpc_url(即上述API接口地址)
2)[string]username(博客園帳號)
3)[string]pwd(博客園密碼)
這一步爲獲取博主信息,上面說到這步其實能夠省略,可是爲了下面的工具編寫,咱們依舊演示。
可見咱們成功獲取了blogid和用戶名(非博客名)
參數:
1)[string]blogid(通過測試,此項被忽略可是不能刪去對應標籤)
2)[string]username
3)[string]pwd
4)[struct]Post(此項是一個結構,具體參考文末的博客園文檔)
5)[bool]publish(是否發佈.1爲發佈,0爲不發佈)
這裏吐槽兩句,博客園的一篇文章給了這個方法的示例,可是我請求時老是顯示Request from client does not contain valid XML.
可是我提交的XML沒有錯誤,直到找到了MSDN上的一個示例,猛地看到encoding。
沒錯,post提交信息必須以UTF-8編碼,以前一直以gb2312提交,永遠提示錯誤。固然,若是不提交中文,編碼隨意~
演示:
顯示的字符串說明發布成功,字符串爲該文章的postid
博客頁面:
發佈成功,URL地址的最後就是剛剛獲取到的postid,內容也是剛剛提交的內容。
最重要的一步,也是坑我最久的一步搞定~
參數:
1)[string]blogid(ignored)
2)[string]username
3)[string]pwd
4)[int]numberOfPosts(獲取文章的數量)
這個是接下來我作工具想要的一個功能,用於查看是否同步到最新文章
演示(解析樹很長,截不完整,是對的):
用法同newPost只是要加一個postid的參數,這個在getRecentPost中能夠獲取到~
這是一個很是有用的接口,已知國內CTO,博客園,開源中國都支持此方法發佈文章。那麼就能夠寫出一個博客同步發表工具,做爲獨立博客流量的入口,提升了同步效率!
此次參考的文章感受都是2000年時代的,本身一點點查文檔研究也是不容易了……