zoukankan      html  css  js  c++  java
  • 浅析利用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就行了。

    接口

    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 实现其接口的相应方法就行了,这样客户端通过访问之即可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的内容…………………   
     
    return postid;  
     
         }   
         else   
         {   
         throw new XmlRpcFaultException(0, "Keyword is not valid!");   
         }  
     
    }

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

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

    转发

    转发Blog则相对更为简单,只需定义个转发接口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   
      }

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

    string IMetaWeblog.AddPost(string blogid, string username, string password,   
      Post post, bool publish)   
          {  
     
    ………………省略N行写入自己Blog的内容…………………  
     
              if (true)//判断需要转发   
              {   
     
                  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接口发送自己的blog同时让其转发其他Blog了

    原文地址:http://www.jianfangkk.com/aspnet/201510/286

  • 相关阅读:
    提取 Microsoft.ReportViewer.ProcessingObjectModel.dll Microsoft.ReportViewer.DataVisualization.dll 等dll(转贴)
    Windows API 逐个逐个学(0) MessageBox
    asp程序员使用asp.net中服务器控件的困惑
    SQLServer 存储过程中不拼接SQL字符串实现多条件查询
    工作学习笔记
    c#3.0/3.5 中的一些新特性
    firefox中使用ctrl+0解决了一个调试很长时间的问题
    使用Nunit进行单元测试
    asp.net 用户控件和自定义控件总结
    Visual Studio 2008 无法启动调试.找不到Microsoft Internet Explorer
  • 原文地址:https://www.cnblogs.com/jianfangkk/p/5107958.html
Copyright © 2011-2022 走看看