.NET(C#)でXML-RPCを使ってブログに投稿する

Moonmile Solutions Blog » .NET(C#)でRSSフィードを受信する
http://www.moonmile.net/blog/archives/1234

の続きで、今度は wordpress に投稿するAPI な話。

モノ的には、XML-RPC.Net
http://www.xml-rpc.net/

を使って、wordpress にコマンドラインから投稿ができるところまで作ります。

■xml-rpc.net をダウンロード&ビルド

最初に、http://www.xml-rpc.net/ から、ライブラリをダウロードします。現時点では、Version 2.4.0 ですね。

このzipファイルを解凍して、プロジェクトを見ると、xmlrpc なるプロジェクトがあるので、ビルドします。

ここで注意が必要なのは、そのままビルドしようとすると、

エラー 1 アセンブリ ‘D:\work\kidtwi\src\ReadRSS\xmlrpc\obj\Debug\CookComputing.XmlRpcV2.dll’ を署名しているときに暗号に失敗しました — ‘キー ファイル ‘..\CookComputing.key’ の読み込み中にエラーが発生しました — 指定されたファイルが見つかりません。 ‘ xmlrpc

のようなエラーが発生します。これは署名ファイルを探しているときにファイルがないというエラーなので、本来ならば署名ファイルを用意するべきなのですが、面倒なので、

AssemblyInfo.cs ファイルの該当箇所をコメントアウトします。

[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile(“..\\CookComputing.key”)]
[assembly: AssemblyKeyName(“”)]

これでビルドをすればOK。

対象のフレームワークは、ツールに合わせて「.NET Framework 4」などに変更すればよいでしょう。

■xmlrpcプロジェクトを参照設定する

ツール用のプロジェクトを作って、先のxmlrpcプロジェクトを参照設定します。

あるいは、できあがった CookComputing.XmlRpcV2.dll を参照設定します。

■xmlrpcプロジェクトを参照設定する

投稿時のコードの全文はこれです。

using CookComputing.XmlRpc;
namespace AutoPost
{
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            // コンソールから取得
            string title = Console.In.ReadLine();
            string content = Console.In.ReadToEnd();
            // 投稿
            pg.BllogerNewPost(title, content);
        }

        // ユーザー名
        string username = “<ブログのユーザー名>”;
        // パスワード
        string password = “<ブログのパスワード>”;
        // 投稿先のURL
        string url = “<投稿先のURL>”;

        public void BllogerNewPost(string title, string content)
        {
            //プロキシクラスのインスタンスを作成
            IBlogger proxy = (IBlogger)
                CookComputing.XmlRpc.XmlRpcProxyGen.Create(
                typeof(IBlogger));
            //URLを指定
            proxy.Url = url;

            int id = 0;
            // content を生成
            content = string.Format(“<title>{0}</title>”, title)
                + string.Format(“<category>{0}</category>”, 3)
                + content;
            try
            {
                //blogger.getRecentPostsを呼び出す
                id = proxy.newPost(
                    “”,             // WordPressの場合は無視
                    “1”,            // 念のため1にしておく
                    username,
                    password,
                    content,
                    false);
            }
            catch (Exception ex)
            {
                Console.WriteLine(“エラー:” + ex.Message);
                return;
            }

            //結果を表示する
            Console.WriteLine(“id: ” + id);
        }

    public interface IBlogger : IXmlRpcProxy
    {
        /// <summary>
        /// 新規投稿
        /// </summary>
        /// <param name=”appkey”>無視</param>
        /// <param name=”blogid”>無視</param>
        /// <param name=”username”>ユーザー名</param>
        /// <param name=”password”>パスワード</param>
        /// <param name=”content”>本文</param>
        /// <param name=”publish”>公開するかどうか</param>
        /// <returns>エントリのIDを返す</returns>
        [XmlRpcMethod(“blogger.newPost”)]
        int newPost(
            string appkey,
            string blogid,
            string username,
            string password,
            string content,
            bool publish );
    }
}

キーポイントは、

  • プロキシクラスを作る(IBloggerのところ)
  • メソッドは、XmlRpcMethod で属性として指定する。
  • 実行時に、XmlRpcProxyGen クラスでプロキシを生成する。

XML-RPC で呼び出す時のメソッドは、XmlRpcMethod 属性で指定しますが、blogger api では、タイトルと本文を

<title>タイトル<title>本文…

な感じで書きます。

カテゴリも指定する場合は、

<title>タイトル<title><category>1</category>本文…

このように、カテゴリIDを指定します。

※ このカテゴリIDを取得するのが一苦労なんですよね……データベースを直接見るか、wordpressのapiを使ってリストを呼び出して調べるか、という方法になります。カテゴリの一覧を取得する方法は後日。

このソースでは、標準入力から投稿用のデータを入れています。

最初の一行目はタイトル
<p>二行目から本文を書きます。</p>
<p>そのまま投稿されるのでHTML形式で書いておきます。</p>
<ul>
<li>こんな風に
<li>箇条書きとかも書けますね。
</ul>

こういう形で、1行目はタイトル、続く2行目からは本文になります。本文は、そのまま表示されるのでHTML形式で書いておきます。

■投稿を実行する

実際に投稿をしてみると、

D:\work\kidtwi\src\ReadRSS\AutoPost\bin\Debug>AutoPost.exe  < post1.txt
id: 1279

こんな風に、投稿に成功したときには、IDを返してくれます。

■参照先

結構参考にしたので、並べておきます。

XML-RPCとは何ぞや?の話とかは、こちらをどうぞ。

[WordPress] XML-RPC を使用する方法 | Sun Limited Mt.
http://www.syuhari.jp/blog/archives/1373
MovableType で使える XML-RPC API
http://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.html
XML-RPC wp ≪ WordPress Codex
http://codex.wordpress.org/XML-RPC_wp
どぼんさんのメールマガジン
http://dobon.net/vb/melma/dotnet74.txt

ここでは、wordpress を対象にしましたが、Blogger の場合は、Google からも API が提供されています。

Developer’s Guide: .NET – Blogger APIs – Google Code
http://code.google.com/intl/ja/apis/blogger/docs/2.0/developers_guide_dotnet.html

 

カテゴリー: 開発 パーマリンク