MetaWeblogAPI C# コード サンプル
この C# サンプルでは、MetaWeblog API でサポートされているすべてのメソッドの使い方を示します。
例
この C# コード サンプルでは、MetaWeblog API でサポートされているすべてのメソッドの使い方を示します。このサンプルを利用して、ブログ記事のテキストや属性を外部プログラムで取得したり設定したりできます。このサンプルでは、クライアント アプリケーションとブログ サーバー間の通信に XML-RPC プロトコルが使用されます。
using System;
using CookComputing.XmlRpc;
using System.Net;
namespace MetaWeblogApi
{
/// <summary>
/// この構造体はユーザーのブログに関する情報を表します。
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct UserBlog{
public string url;
public string blogid;
public string blogName;
}
/// <summary>
/// この構造体はユーザーに関する情報を表します。
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct UserInfo{
public string url;
public string blogid;
public string blogName;
public string firstname;
public string lastname;
public string email;
public string nickname;
}
/// <summary>
/// この構造体は、getCategories() メソッドによって返される可能性のある
/// カテゴリに関する情報を表します。
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct Category{
public string description;
public string title;
}
/// <summary>
/// この構造体は、editPost()、getRecentPosts()、および getPost() メソッドによって返される
/// 可能性のある記事に関する情報を表します。
/// </summary>
[XmlRpcMissingMapping(MappingAction.Ignore)]
struct Post {
public DateTime dateCreated;
public string description;
public string title;
public string postid;
public string[] categories;
}
/// <summary>
/// このクラスを使用することにより、MetaWeblog API を介して MSN スペース上のブログと
/// プログラムで対話することができます。
/// </summary>
[XmlRpcUrl("https://storage.msn.com/storageservice/MetaWeblog.rpc")]
class MsnSpacesMetaWeblog :XmlRpcClientProtocol {
/// <summary>
/// 最近の下書きのブログ記事と下書き以外のブログ記事を、投稿日時の降順で並べ替えて返します。
/// </summary>
/// <param name="blogid"> 記事の作成先がユーザーのブログであることを示す "MyBlog" という文字列にする必要があります。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <param name="password"> ユーザーの秘密のキーワード。</param>
/// <param name="numberOfPosts"> 返す記事の数。最大値は 20 です。</param>
/// <returns></returns>
[XmlRpcMethod("metaWeblog.getRecentPosts")]
public Post[] getRecentPosts(
string blogid,
string username,
string password,
int numberOfPosts){
return (Post[]) this.Invoke("getRecentPosts", new object[]{ blogid, username, password, numberOfPosts});
}
/// <summary>
/// ブログに新しい記事を投稿します。
/// </summary>
/// <param name="blogid"> 記事の作成先がユーザーのブログであることを示す "MyBlog" という文字列にする必要があります。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <param name="password"> ユーザーの秘密のキーワード。</param>
/// <param name="post">更新するコンテンツを表す構造体。</param>
/// <param name="publish"> false の場合、下書きの記事です。</param>
/// <returns> 新しく作成された記事の postid。</returns>
[XmlRpcMethod("metaWeblog.newPost")]
public string newPost(
string blogid,
string username,
string password,
Post content,
bool publish){
return (string) this.Invoke("newPost", new object[]{ blogid, username, password, content, publish});
}
/// <summary>
/// ブログ上の既存の記事を編集します。
/// </summary>
/// <param name="postid"> 更新する記事の ID。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <param name="password"> ユーザーの秘密のキーワード。</param>
/// <param name="post">更新するコンテンツを表す構造体。</param>
/// <param name="publish"> false の場合、下書きの記事です。</param>
/// <returns> 常に true を返します。</returns>
[XmlRpcMethod("metaWeblog.editPost")]
public bool editPost(
string postid,
string username,
string password,
Post content,
bool publish){
return (bool) this.Invoke("editPost", new object[]{ postid, username, password, content, publish});
}
/// <summary>
/// ブログから記事を削除します。
/// </summary>
/// <param name="appKey"> この値は無視されます。</param>
/// <param name="postid"> 更新する記事の ID。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <param name="password"> ユーザーの秘密のキーワード。</param>
/// <param name="post">更新するコンテンツを表す構造体。</param>
/// <param name="publish"> この値は無視されます。</param>
/// <returns> 常に true を返します。</returns>
[XmlRpcMethod("blogger.deletePost")]
public bool deletePost(
string appKey,
string postid,
string username,
string password,
bool publish){
return (bool) this.Invoke("deletePost", new object[]{ appKey, postid, username, password, publish});
}
/// <summary>
/// ユーザーのスペースに関する情報を返します。ユーザーがスペースを持っていない場合は、空の配列が返されます。
/// </summary>
/// <param name="appKey"> この値は無視されます。</param>
/// <param name="postid"> 更新する記事の ID。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <returns> ユーザーの各ブログを表す構造体の配列。ユーザーが持つことができるスペースは 1 つだけであり、スペース内のブログは 1 つであるため、この配列に格納される構造体は最大で 1 つです。</returns>
[XmlRpcMethod("blogger.getUsersBlogs")]
public UserBlog[] getUsersBlogs(
string appKey,
string username,
string password){
return (UserBlog[]) this.Invoke("getUsersBlogs", new object[]{ appKey, username, password});
}
/// <summary>
/// ユーザーの基本情報を返します (名前、電子メール アドレス、ユーザー ID など)。
/// </summary>
/// <param name="appKey"> この値は無視されます。</param>
/// <param name="postid"> 更新する記事の ID。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <returns> ユーザーのプロフィール情報が格納された構造体。
/// 各構造体には、"nickname"、"userid"、"url"、"e-mail"、"lastname"、および "firstname"
/// フィールドがあります。</returns>
[XmlRpcMethod("blogger.getUserInfo")]
public UserInfo getUserInfo(
string appKey,
string username,
string password){
return (UserInfo) this.Invoke("getUserInfo", new object[]{ appKey, username, password});
}
/// <summary>
/// ブログの特定の記事を返します。
/// </summary>
/// <param name="postid"> 更新する記事の ID。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <param name="password"> ユーザーの秘密のキーワード。</param>
/// <returns> 常に true を返します。</returns>
[XmlRpcMethod("metaWeblog.getPost")]
public Post getPost(
string postid,
string username,
string password){
return (Post) this.Invoke("getPost", new object[]{ postid, username, password});
}
/// <summary>
/// ブログで使用されているカテゴリの一覧を返します。
/// </summary>
/// <param name="blogid"> 記事の作成先がユーザーのブログであることを示す "MyBlog" という文字列にする必要があります。</param>
/// <param name="username"> ユーザーのスペースの名前。</param>
/// <param name="password"> ユーザーの秘密のキーワード。</param>
/// <returns> 構造体の配列。1 つのカテゴリにつき 1 つの構造体が格納されます。このカテゴリごとの構造体のそれぞれに "description" フィールドがあり、ここにカテゴリ名が格納されます。</returns>
[XmlRpcMethod("metaWeblog.getCategories")]
public Category[] getCategories(
string blogid,
string username,
string password){
return (Category[]) this.Invoke("getCategories", new object[]{ blogid, username, password});
}
/// <summary>
/// アプリケーションのメイン エントリ ポイント。
/// </summary>
[STAThread]
static void Main(string[] args) {
MsnSpacesMetaWeblog mw = new MsnSpacesMetaWeblog();
string username = "!Space3*Pqc3*yUo00Y0!";
string password = "mYsEcReTwOrD";
mw.Credentials = new NetworkCredential(username, password);
try{
// Space3Pqc3yUo00Y0
Post post = new Post();
post.categories = new string[]{"テスト投稿"};
post.title = "テスト 3";
post.description = "これは 3 回目のテスト投稿です。";
post.dateCreated = DateTime.Now;
string id = mw.newPost("MyBlog", username, password, post, true);
post.title = "テスト 3 (誤字修正済み)";
mw.editPost(id, username, password, post, true);
post = mw.getPost(id, username, password);
Console.WriteLine("'{0}' というタイトルの記事 (投稿日時: '{1}') が編集されました。", post.title, post.dateCreated);
/* ブログで使用されているカテゴリの一覧を表示します。 */
Category[] categories = mw.getCategories("MyBlog", username, password);
foreach(Category c in categories){
Console.WriteLine("カテゴリ:{0}", c.description);
}
/* 最近の 10 件の記事のタイトルを表示します。 */
Post[] posts = mw.getRecentPosts("MyBlog", username, password, 10);
foreach(Post p in posts){
Console.WriteLine("記事タイトル:{0}", p.title);
}
mw.deletePost(String.Empty, id, username, password, true);
Console.WriteLine("'{0}' というタイトルの記事が削除されました。", post.title);
/* ユーザーのブログに関する情報を取得します。 */
UserBlog[] blogs = mw.getUsersBlogs(String.Empty, username, password);
foreach(UserBlog b in blogs){
Console.WriteLine("'{0}' の URL は {1} です。", b.blogName, b.url);
}
/* ユーザーに関する情報を取得します。 */
UserInfo user = mw.getUserInfo(String.Empty, username, password);
Console.WriteLine("{0} {1} ({2}) は、URL が {3} であるスペースの所有者です。", user.lastname, user.firstname, user.email, user.url);
}catch(XmlRpcFaultException xrfe){
Console.WriteLine("エラー:{0}", xrfe.FaultString);
}
Console.ReadLine();
}
}
}