前回の記事XRM-RPC.NET を .NET 4.0以降用にビルドするで XRM-RPC.NET を .NET 4.0 環境で使用できるようにアセンブリを使用しました。 XRM-RPC仕様の書式に従った MetaWeblog API を使用して、ブログを投稿してみます。

検証環境は次の通りです

  • Visual Studio 2012 Ultimate, .NET 4.5 コンソールプログラム
  • 自サイトで構築した Wordpress に対して記事を投稿

今回はWordpress に対して記事を投稿しますが、様々なブログサービスがXRM-RPCのエンドポイントを提供しているようです。

他のブログサービスでの XRM-RPC エンドポイント "ブログ XML-RPC エンドポイント" など検索ワードにして調べてください。

1. Wordpress で外部ツールからの記事投稿を可能にする

Wordpress にログインして 管理画面のサイドメニューの 設定→投稿設定を表示します。 リモート投稿のセクションで、XRM-RPC(WordPress, Movable TYpe, ...) にチェックを入れます。変更を保存してXRM-RPCエンドポイントへの の Metaeblog API によるリモート投稿を有効にします。

2. サンプルクライアントプログラムの作成

Visual Studio 2012 を起動します。コンソールプロジェクトを作成してください。参照の追加で、XRM-RPC.NET を .NET 4.0以降用にビルドするで作成した CookComputing.XmlRpV2.dll を追加します。

MetaWeblogAPI を定義するインタフェースを定義します。コンソールプロジェクトに インタフェースクラスを追加します。今回は IMetaWeblogAPI.cs という名前で作成しています。次のように編集します。MetaWeblogAPI の定義方法は XRM-RPC.NET のドキュメントや サンプルソースのコメントに記載した MetaWeblog API リファレンスを参考にしています。interface に XrmRpcUrlAttribute を修飾しています。そこで エンドポイントのURL を設定していますが、動的に設定することもできます。サンプルで設定しているエンドポイントは各環境に合わせて適切なUrlに変更してください。

    using CookComputing.XmlRpc;

    /// <summary>
    /// RFC: MetaWeblog API を参考にAPIを定義
    /// http://xmlrpc.scripting.com/metaWeblogApi.html
    /// 
    /// サーバー向けのAPI定義として、ダウンロードした XRM-RPC.NET 
    /// のinterfaceフォルダ内のMetaWeblogAPI.cs も参考になる
    /// 
    /// MetaWeblog API リファレンス
    /// http://msdn.microsoft.com/ja-jp/library/bb259697.aspx
    /// </summary>
    [XmlRpcUrl("http://localhost/blog/xmlrpc.php")]
    public interface IMetaWeblogAPI : IXmlRpcProxy
    {
        [XmlRpcMethod("metaWeblog.newPost",Description = "ブログを新規投稿.返り値は postid")]
        string newPost(
          string blogid,
          string username,
          string password,
          Post post,
          bool publish);
    }

    [XmlRpcMissingMapping(MappingAction.Ignore)]
    public struct Post
    {
        [XmlRpcMissingMapping(MappingAction.Error)]
        [XmlRpcMember(Description = "タイトル.")]
        public string title;
        [XmlRpcMissingMapping(MappingAction.Error)]
        [XmlRpcMember(Description = "説明.")]
        public string description;
        [XmlRpcMissingMapping(MappingAction.Error)]
        [XmlRpcMember(Description = "投稿日時.")]
        public DateTime dateCreated;
        [XmlRpcMissingMapping(MappingAction.Ignore)]
        [XmlRpcMember(Description = "カテゴリ.")]
        public string[] categories;
    }

今回は Wordpress をテストしましたが、fc2 で投稿を試す場合、 newPost の返り値は int である必要があるようです。

既定で作成される Program.cs を次のように編集します。重要な処理は XrmRpcProxyGen.Create<IMetaWeblogAPI>() メソッドです。本処理でプロキシクラスが生成されます。作成されたプロキシには Url プロパティがあるので、本Urlを変更することで動的にエンドポイントのアドレスを変更できます。

    using CookComputing.XmlRpc;

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                IMetaWeblogAPI proxy = XmlRpcProxyGen.Create<IMetaWeblogAPI>();

                string blogid = null;
                string username = "testuser";
                string password = "testpassword01xa";
                bool publish = true;
                Post post = new Post
                {
                    dateCreated = DateTime.Now,
                    title = "テスト投稿タイトル",
                    description = "<h1>test投稿</h1>"
                };

                blogid = proxy.newPost(string.Empty, username, password, post, publish);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
            }
        }
    }

プログラムを実行して投稿ができることを確認します。

3. まとめ

説明は以上です。誤り、指摘点などありましたらご連絡ください。