http://rpc.cnblogs.com/metaweblog/webenh

在网上闲逛,突然对博客的接口感兴趣,经考察,多数博客都对metaWeblog Api 提供了支持,虽然windows live writer是好用,不过出于对这个接口的好奇,也想自己做个能发博客的小工具.

到处浏览资料,用了一个下午终于成功发布了一篇简陋版博客:)。其实很简单,方法对了很快就连上了。

一、要引用的DLL【网上提供的示例多包含了这个DLL】

MetaWeblog API调用-LMLPHP

二、要实现的数据结构

MetaWeblogCode【如不想看代码请自行折叠】


  1 using System;
  2 using CookComputing.XmlRpc;
  3 
  4 namespace metaWeblogTest
  5 {
  6 
  7     #region 微软MSN网站 使用的 MetaWeblog API.
  8     /// 这个结构代表用户的博客基本信息
  9     /// </summary>
10     [XmlRpcMissingMapping(MappingAction.Ignore)]
11     public struct UserBlog
12     {
13         public string url;
14         public string blogid;
15         public string blogName;
16     }
17 
18 
19     /// <summary> 
20     /// 这个结构代表用户信息
21     /// </summary> 
22     [XmlRpcMissingMapping(MappingAction.Ignore)]
23     public struct UserInfo
24     {
25         public string url;
26         public string blogid;
27         public string blogName;
28         public string firstname;
29         public string lastname;
30         public string email;
31         public string nickname;
32     }
33 
34 
35     /// <summary> 
36     /// 这个结构代表博客分类信息
37     /// 这后面的getCategories()方法会取到CATEGORY数据。
38     /// </summary> 
39     [XmlRpcMissingMapping(MappingAction.Ignore)]
40     public struct Category
41     {
42         public string description;
43         public string title;
44     }
45 
46     /// <summary>  47     /// 这个结构代表博客( 文章 )信息。 48     /// 这后面的 editPost()方法, getRecentPosts()方法 和 getPost()方法 会取倒POST数据 .  49     /// </summary>  50     [XmlRpcMissingMapping(MappingAction.Ignore)] 51     public struct Post 52     { 53         public DateTime dateCreated; 54         public string description; 55         public string title; 56         public string postid; 57         public string[] categories; 58     } 59     #endregion 60  61  62     #region 网站:http://msdn.microsoft.com/en-us/library/aa905670.aspx 63     ///// <summary>  64     ///// 微软MSN网站 使用的 MetaWeblog API.  65     ////  网站:http://msdn.microsoft.com/en-us/library/aa905670.aspx 66     ///// </summary>  67     public class M_MetaWeblog : XmlRpcClientProtocol 68     { 69  70  71         /// <summary>  72         /// Returns the most recent draft and non-draft blog posts sorted in descending order by publish date.  73         /// </summary>  74         /// <param name="blogid"> This should be the string MyBlog, which indicates that the post is being created in the user’s blog. </param>  75         /// <param name="username"> The name of the user’s space. </param>  76         /// <param name="password"> The user’s secret word. </param>  77         /// <param name="numberOfPosts"> The number of posts to return. The maximum value is 20. </param>  78         /// <returns></returns>  79         /// TODO:得到最近发布的帖子 80         [XmlRpcMethod("metaWeblog.getRecentPosts")] 81         public Post[] getRecentPosts( 82         string blogid, 83         string username, 84         string password, 85         int numberOfPosts) 86         { 87  88             return (Post[])this.Invoke("getRecentPosts", new object[] { blogid, username, password, numberOfPosts }); 89         } 90  91  92         /// <summary>  93         /// Posts a new entry to a blog.  94         /// </summary>  95         /// <param name="blogid"> This should be the string MyBlog, which indicates that the post is being created in the user’s blog. </param>  96         /// <param name="username"> The name of the user’s space. </param>  97         /// <param name="password"> The user’s secret word. </param>  98         /// <param name="post"> A struct representing the content to update. </param>  99         /// <param name="publish"> If false, this is a draft post. </param>  100         /// <returns> The postid of the newly-created post. </returns>  101         /// TODO:增加一个最新的帖子 102         [XmlRpcMethod("metaWeblog.newPost")] 103         public string newPost( 104         string blogid, 105         string username, 106         string password, 107         Post content, 108         bool publish) 109         { 110  111             return (string)this.Invoke("newPost", new object[] { blogid, username, password, content, publish }); 112         } 113  114         /// <summary>  115         /// Edits an existing entry on a blog.  116         /// </summary>  117         /// <param name="postid"> The ID of the post to update. </param>  118         /// <param name="username"> The name of the user’s space. </param>  119         /// <param name="password"> The user’s secret word. </param>  120         /// <param name="post"> A struct representing the content to update. </param>  121         /// <param name="publish"> If false, this is a draft post. </param>  122         /// <returns> Always returns true. </returns>  123         /// TODO:更新一个帖子 124         [XmlRpcMethod("metaWeblog.editPost")] 125         public bool editPost( 126         string postid, 127         string username, 128         string password, 129         Post content, 130         bool publish) 131         { 132  133             return (bool)this.Invoke("editPost", new object[] { postid, username, password, content, publish }); 134         } 135  136         /// <summary>  137         /// Deletes a post from the blog.  138         /// </summary>  139         /// <param name="appKey"> This value is ignored. </param>  140         /// <param name="postid"> The ID of the post to update. </param>  141         /// <param name="username"> The name of the user’s space. </param>  142         /// <param name="password"> The user’s secret word. </param>  143         /// <param name="post"> A struct representing the content to update. </param>  144         /// <param name="publish"> This value is ignored. </param>  145         /// <returns> Always returns true. </returns>  146         /// TODO:删除一个帖子 147         [XmlRpcMethod("blogger.deletePost")] 148         public bool deletePost( 149         string appKey, 150         string postid, 151         string username, 152         string password, 153         bool publish) 154         { 155  156             return (bool)this.Invoke("deletePost", new object[] { appKey, postid, username, password, publish }); 157         } 158  159  160         /// <summary>  161         /// Returns information about the user’s space. An empty array is returned if the user does not have a space.  162         /// </summary>  163         /// <param name="appKey"> This value is ignored. </param>  164         /// <param name="postid"> The ID of the post to update. </param>  165         /// <param name="username"> The name of the user’s space. </param>  166         /// <param name="password"></param> 167         /// <returns>
An array of structs that represents each of the user’s blogs. The array
will contain a maximum of one struct, since a user can only have a
single space with a single blog. </returns>  168         /// TODO:得到用户的博客清单 169         [XmlRpcMethod("blogger.getUsersBlogs")] 170         public UserBlog[] getUsersBlogs( 171         string appKey, 172         string username, 173         string password) 174         { 175  176             return (UserBlog[])this.Invoke("getUsersBlogs", new object[] { appKey, username, password }); 177         } 178  179         /// <summary>  180         /// Returns basic user info (name, e-mail, userid, and so on).  181         /// </summary>  182         /// <param name="appKey"> This value is ignored. </param>  183         /// <param name="postid"> The ID of the post to update. </param>  184         /// <param name="username"> The name of the user’s space. </param>  185         /// <param name="password"></param> 186         /// <returns> A struct containing profile information about the user.  187         /// Each struct will contain the following fields: nickname, userid, url, e-mail,  188         /// lastname, and firstname. </returns>  189         /// TODO:得到用户信息 190         [XmlRpcMethod("blogger.getUserInfo")] 191         public UserInfo getUserInfo( 192         string appKey, 193         string username, 194         string password) 195         { 196  197             return (UserInfo)this.Invoke("getUserInfo", new object[] { appKey, username, password }); 198         } 199  200  201         /// <summary>  202         /// Returns a specific entry from a blog.  203         /// </summary>  204         /// <param name="postid"> The ID of the post to update. </param>  205         /// <param name="username"> The name of the user’s space. </param>  206         /// <param name="password"> The user’s secret word. </param>  207         /// <returns> Always returns true. </returns>  208         /// TODO:获取一个帖子 209         [XmlRpcMethod("metaWeblog.getPost")] 210         public Post getPost( 211         string postid, 212         string username, 213         string password) 214         { 215  216             return (Post)this.Invoke("getPost", new object[] { postid, username, password }); 217         } 218  219         /// <summary>  220         /// Returns the list of categories that have been used in the blog.  221         /// </summary>  222         /// <param name="blogid"> This should be the string MyBlog, which indicates that the post is being created in the user’s blog. </param>  223         /// <param name="username"> The name of the user’s space. </param>  224         /// <param name="password"> The user’s secret word. </param>  225         /// <returns>
An array of structs that contains one struct for each category. Each
category struct will contain a description field that contains the name
of the category. </returns>  226         /// TODO:得到博客分类 227         [XmlRpcMethod("metaWeblog.getCategories")] 228         public Category[] getCategories( 229         string blogid, 230         string username, 231         string password) 232         { 233  234             return (Category[])this.Invoke("getCategories", new object[] { blogid, username, password }); 235         } 236     } 237     #endregion 238 } 239 

三、图示【调用API发送第一篇简单博客】

MetaWeblog API调用-LMLPHP

——————————————————————————————————————————

资源链接:

http://www.xmlrpc.com/spec   英文的xml-rpc规范
RFC: MetaWeblog API   MetaWeblog API 规范

http://www.duduwolf.com/post/41.asp  中文翻译的xml-rpc规范(感谢翻译者:滴水)

http://www.XML-RPC.Net XML-RPC的.NET 实现,其中有最新.net2.0的XML-RPC实现的下载

MetaWeblogAPI and MSN Spaces  MSDN上关于MetaWeblog API及MSN Spaces接口的说明及.NET示例

04-13 22:07