淺析利用MetaWeblog接口同步多個博客
隨著XML-RPC的越來越流行,MetaWeblog接口幾乎成了目前最流行的離線Blog發(fā)送API.其能通過標準化的webservice接口,對任意blog進行添刪改。目前,使用MetaWeblog接口發(fā)布離線博客客戶端中流行的還是windows live writer。這里可以找到一些相關(guān)的設(shè)置方法。
話說回來,如何用metaweblog接口同步多個blog呢?當然你可以直接建立多個account來處理,但明顯繁瑣,也不符合我們diy的個性。
由于我自己個人Blog是完全自己寫的,于是就不由想到了寫一個metaweblog接口能使windows live writer連接上www.dumuzi.cn,再次它之上又增加了轉(zhuǎn)發(fā)模塊,轉(zhuǎn)發(fā)其他Blog,一舉多得。
調(diào)用
調(diào)用MetaWeblog接口我用到了XML-RPC.NET,一個開源的.Net 庫,用于處理XML-RPC。
相關(guān)的調(diào)用非常簡單,網(wǎng)上也能找到相應(yīng)的demo。只要實現(xiàn)IMetaWeblog接口中MetaWeblog 和Blogger 對應(yīng)的api就行了。
接口
- public interface IMetaWeblog
- {
- #region MetaWeblog API
- [XmlRpcMethod("metaWeblog.newPost")]
- string AddPost(string blogid, string username, string password, Post post, bool publish);
- [XmlRpcMethod("metaWeblog.editPost")]
- bool UpdatePost(string postid, string username, string password, Post post, bool publish);
- [XmlRpcMethod("metaWeblog.getPost")]
- Post GetPost(string postid, string username, string password);
- [XmlRpcMethod("metaWeblog.getCategories")]
- CategoryInfo[] GetCategories(string blogid, string username, string password);
- [XmlRpcMethod("metaWeblog.getRecentPosts")]
- Post[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts);
- [XmlRpcMethod("metaWeblog.newMediaObject")]
- MediaObjectInfo NewMediaObject(string blogid, string username, string password,
- MediaObject mediaObject);
- #endregion
- #region Blogger API
- [XmlRpcMethod("blogger.deletePost")]
- [return: XmlRpcReturnValue(Description = "Returns true.")]
- bool DeletePost(string key, string postid, string username, string password, bool publish);
- [XmlRpcMethod("blogger.getUsersBlogs")]
- BlogInfo[] GetUsersBlogs(string key, string username, string password);
- [XmlRpcMethod("blogger.getUserInfo")]
- UserInfo GetUserInfo(string key, string username, string password);
- #endregion
- }
- 使用時只需建立一個類,MetaWeblog 實現(xiàn)其接口的相應(yīng)方法就行了,這樣客戶端通過訪問之即可post blog了
- public class MetaWeblog : XmlRpcService, IMetaWeblog
- {。。。。}
給一個寫blog的方法
- string IMetaWeblog.AddPost(string blogid, string username, string password,
- Post post, bool publish)
- {
- if (ValidateUser(username, password))
- {
- ………………省略N行寫入自己Blog的內(nèi)容…………………
- return postid;
- }
- else
- {
- throw new XmlRpcFaultException(0, "Keyword is not valid!");
- }
- }
值得注意的是,由于各blog的數(shù)據(jù)結(jié)構(gòu)不同,可能導(dǎo)致部分接口調(diào)用時含義混淆,比如說string blogid原本是指通過GetUsersBlogs返回的當前用戶的多個blog中對應(yīng)的id,但某些blog卻返回的是發(fā)送blog成功后返回的blog標記符,即postid
具體的可能需要根據(jù)不同blog具體分析。
轉(zhuǎn)發(fā)
轉(zhuǎn)發(fā)Blog則相對更為簡單,只需定義個轉(zhuǎn)發(fā)接口IMetaWeblogPost 即可
- public interface IMetaWeblogPost : IXmlRpcProxy
- {
- #region MetaWeblog API
- [XmlRpcMethod("metaWeblog.newPost")]
- string AddPost(string blogid, string username, string password, Post post, bool publish);
- [XmlRpcMethod("metaWeblog.getCategories")]
- CategoryInfo[] GetCategories(string blogid, string username, string password);
- [XmlRpcMethod("metaWeblog.newMediaObject")]
- MediaObjectInfo NewMediaObject(string blogid, string username, string password,
- MediaObject mediaObject);
- #endregion
- }
調(diào)用非常簡單 以下給出AddPost方法的實現(xiàn)
- string IMetaWeblog.AddPost(string blogid, string username, string password,
- Post post, bool publish)
- {
- ………………省略N行寫入自己Blog的內(nèi)容…………………
- if (true)//判斷需要轉(zhuǎn)發(fā)
- {
- try
- {
- weblogpost.Url = "http://www.cnblogs.com/yourname/services/metaweblog.aspx";
- weblogpost.AddPost(blogid, name, password, post, publish);
- }
- catch
- {
- throw new XmlRpcFaultException(0, "cnblogs sent failed!");
- }
- }
- }
當然你可以定義一些比如同步刪除,同步修改之類的功能使用。
通過以上2步,我們便能輕易通過MetaWeblog接口發(fā)送自己的blog同時讓其轉(zhuǎn)發(fā)其他Blog了
【編輯推薦】