浅析利用MetaWeblog接口同步多个博客

开发 前端
很多人有多个Blog,老是到处Ctrl+C Ctrl+V得绝非我等懒人所为。同步多个Blog,很轻易想到了运用Webservice。技术虽然简单,但有一个前提,需要博客运营方支持。本文将浅析如何利用MetaWeblog接口同步多个博客。

随着XML-RPC的越来越流行,MetaWeblog接口几乎成了目前最流行的离线Blog发送API.其能通过标准化的webservice接口,对任意blog进行添删改。目前,使用MetaWeblog接口发布离线博客客户端中流行的还是windows live writer。这里可以找到一些相关的设置方法。

话说回来,如何用metaweblog接口同步多个blog呢?当然你可以直接建立多个account来处理,但明显繁琐,也不符合我们diy的个性。

由于我自己个人Blog是完全自己写的,于是就不由想到了写一个metaweblog接口能使windows live writer连接上www.dumuzi.cn,再次它之上又增加了转发模块,转发其他Blog,一举多得。

调用 

调用MetaWeblog接口我用到了XML-RPC.NET,一个开源的.Net 库,用于处理XML-RPC。

相关的调用非常简单,网上也能找到相应的demo。只要实现IMetaWeblog接口中MetaWeblog 和Blogger 对应的api就行了。

接口

  1. public interface IMetaWeblog   
  2. {   
  3.     #region MetaWeblog API   
  4.  
  5.     [XmlRpcMethod("metaWeblog.newPost")]   
  6.     string AddPost(string blogid, string username, string password, Post post, bool publish);   
  7.  
  8.     [XmlRpcMethod("metaWeblog.editPost")]   
  9.     bool UpdatePost(string postid, string username, string password, Post post, bool publish);   
  10.  
  11.     [XmlRpcMethod("metaWeblog.getPost")]   
  12.     Post GetPost(string postid, string username, string password);   
  13.  
  14.     [XmlRpcMethod("metaWeblog.getCategories")]   
  15.     CategoryInfo[] GetCategories(string blogid, string username, string password);   
  16.  
  17.     [XmlRpcMethod("metaWeblog.getRecentPosts")]   
  18.     Post[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts);   
  19.  
  20.     [XmlRpcMethod("metaWeblog.newMediaObject")]   
  21.     MediaObjectInfo NewMediaObject(string blogid, string username, string password,   
  22.         MediaObject mediaObject);   
  23.  
  24.     #endregion   
  25.  
  26.     #region Blogger API   
  27.  
  28.     [XmlRpcMethod("blogger.deletePost")]   
  29.     [return: XmlRpcReturnValue(Description = "Returns true.")]   
  30.     bool DeletePost(string key, string postid, string username, string password, bool publish);   
  31.  
  32.     [XmlRpcMethod("blogger.getUsersBlogs")]   
  33.     BlogInfo[] GetUsersBlogs(string key, string username, string password);   
  34.  
  35.     [XmlRpcMethod("blogger.getUserInfo")]   
  36.     UserInfo GetUserInfo(string key, string username, string password);   
  37.  
  38.     #endregion   
  39. }  
  40.  
  41. 使用时只需建立一个类,MetaWeblog 实现其接口的相应方法就行了,这样客户端通过访问之即可post blog了  
  42.  
  43. public class MetaWeblog : XmlRpcService, IMetaWeblog   
  44.   {。。。。}  

给一个写blog的方法

  1. string IMetaWeblog.AddPost(string blogid, string username, string password,   
  2.     Post post, bool publish)   
  3. {   
  4.  
  5.     if (ValidateUser(username, password))   
  6.     {  
  7.  
  8. ………………省略N行写入自己Blog的内容…………………   
  9.  
  10. return postid;  
  11.  
  12.      }   
  13.      else   
  14.      {   
  15.      throw new XmlRpcFaultException(0, "Keyword is not valid!");   
  16.      }  
  17.  

值得注意的是,由于各blog的数据结构不同,可能导致部分接口调用时含义混淆,比如说string blogid原本是指通过GetUsersBlogs返回的当前用户的多个blog中对应的id,但某些blog却返回的是发送blog成功后返回的blog标记符,即postid

具体的可能需要根据不同blog具体分析。

转发

转发Blog则相对更为简单,只需定义个转发接口IMetaWeblogPost 即可

  1. public interface IMetaWeblogPost : IXmlRpcProxy   
  2.   {   
  3.       #region MetaWeblog API   
  4.  
  5.       [XmlRpcMethod("metaWeblog.newPost")]   
  6.       string AddPost(string blogid, string username, string password, Post post, bool publish);   
  7.  
  8.       [XmlRpcMethod("metaWeblog.getCategories")]   
  9.       CategoryInfo[] GetCategories(string blogid, string username, string password);   
  10.  
  11.       [XmlRpcMethod("metaWeblog.newMediaObject")]   
  12.       MediaObjectInfo NewMediaObject(string blogid, string username, string password,   
  13.           MediaObject mediaObject);   
  14.       #endregion   
  15.   } 

调用非常简单 以下给出AddPost方法的实现

  1. string IMetaWeblog.AddPost(string blogid, string username, string password,   
  2.   Post post, bool publish)   
  3.       {  
  4.  
  5. ………………省略N行写入自己Blog的内容…………………  
  6.  
  7.           if (true)//判断需要转发   
  8.           {   
  9.  
  10.               try   
  11.               {    
  12.                   weblogpost.Url = "http://www.cnblogs.com/yourname/services/metaweblog.aspx";   
  13.                   weblogpost.AddPost(blogid, name, password, post, publish);   
  14.               }   
  15.               catch   
  16.               {   
  17.                   throw new XmlRpcFaultException(0, "cnblogs sent failed!");   
  18.               }   
  19.           }   
  20.       } 

当然你可以定义一些比如同步删除,同步修改之类的功能使用。

通过以上2步,我们便能轻易通过MetaWeblog接口发送自己的blog同时让其转发其他Blog了

【编辑推荐】

  1. 多年网站开发积累的几点教训和忠告
  2. 08年10大最热门的网站开发技术
  3. 十大最吃香的网站开发技术
  4. Web 2.0巨头危机四伏 领先地位难持续
  5. Web 2.0应用10种商业模式
责任编辑:彭凡 来源: cnblogs
相关推荐

2009-09-01 18:29:24

C#实现多个接口

2009-09-23 17:28:55

Hibernate C

2011-11-19 15:53:59

虚拟化存储虚拟化网络虚拟化

2009-07-17 10:59:59

iBATIS接口

2009-08-27 17:33:51

Interface接口

2009-09-24 17:01:06

Javascript获

2009-08-31 17:02:28

C#接口编程

2021-05-13 07:58:05

JDBC接口PreparedSta

2011-12-31 09:37:36

虚拟化处理器虚拟化CPU

2009-08-27 17:59:56

C#接口定义

2010-01-14 17:13:53

C++接口

2009-08-31 16:48:02

C#实现IDispos

2009-08-07 08:53:52

C# ICloneab

2009-08-28 15:52:23

C#利用sharpzi

2011-05-23 11:19:26

2011-06-16 11:23:42

光纤弯曲损耗

2009-09-28 14:45:22

C#接口的定义

2009-11-04 09:18:12

ADO.NET _Re

2011-06-16 11:15:14

光纤微弯损耗

2009-08-24 15:12:13

C# 泛型接口
点赞
收藏

51CTO技术栈公众号