【新館】ASP.NETでブログ記事の情報を自動取得する(コード編)

昨日は、我が「新館」において当ブログの記事を自動的に引っ張ってくる、といったことのあらましを書きましたので、今回は具体的なコードなど、メモメモしてみます。

Shinkan_park_04

XML-RPC.NETのライブラリへの参照を追加し、レスポンスのための構造体とメソッドをクラスファイルを作成して書きます。クラスファイル名はblogger.csとでもしておき、App_Codeフォルダに置きます。最初の4つのusing句はクラスファイル作成時に勝手に書かれているものなので、あえてそのままにしてあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CookComputing.XmlRpc;   // 追加

namespace Blogger
{
    public struct Post
    {
        public string userid;              // 投稿者のユーザID
        public DateTime dateCreated;       // 記事の投稿日時
        public string postid;              // 記事ID
        public string description;         // 記事の本文
        public string title;               // 記事の件名
        public string link;                // 記事 の URL (下記の permalink と同一)
        public string permaLink;           // permalink (ココログでは「固定リンク」)
        public string mt_excerpt;          // 概要
        public string mt_text_more;        // 追記
        public int mt_allow_comments;      // コメントを受け入れるか否か
        public int mt_allow_pings;         // トラックバック Ping を受け入れるか否か
        public string mt_convert_breaks;   // 改行の扱いをどうするか
        public string mt_keywords;
    }

    public interface IBlogger : IXmlRpcProxy
    {
        [XmlRpcMethod("metaWeblog.getPost")]
        Post getPost(
            string postid,
            string username,
            string password);
    }
}

Post構造体が、レスポンスを受け取るための構造体です。インタフェースとしてIBloggerがIXmlRpcProxyを継承して宣言されていますが、そこにてmetaWeblog.getPostへのメソッド呼び出しを定義しています。

以下は、実際にメソッド呼び出しを行うコードです。イベントハンドラなどにそのまま書きます。前後のコンテキストは省略していますが、メソッド呼び出しのためのプロキシを作成し、ココログのエンドポイントURLを設定、getPostメソッドの呼び出しを行っています。エンドポイントURLは、ココログフリーとそれ以外では異なります(ここはココログフリー以外)。

Blogger.IBlogger proxy = (BloggerAPI.IBlogger)
    CookComputing.XmlRpc.XmlRpcProxyGen.Create<Blogger.IBlogger>();
proxy.Url = "https://app.cocolog-nifty.com/t/api";  // ココログエンドポイント
Blogger.Post post = new Blogger.Post();
post = proxy.getPost(
    "99999",        // 記事ID
    "xxxxxxxxxxx",  // ココログID(@nifty ID)
    "ppppppppppp"); // パスワード
}
Label1.Text = String.Format("<li \"><a href=\"{0}\">{1}({2})</a></li>\n",
    post.permaLink, posr.title, post.dateCreated.ToShortDateString());

メソッド呼び出しが終了すれば、Post構造体から欲しいものだけ取り出すだけです。このコードでは一切の例外は考慮していませんが、記事IDが間違っている、認証に失敗した、などの場合には例外が発生しますから、適当にtry~catchブロックを作成しましょう。

実際のコードを見てみると、実にあっけないことがおわかりいただけると思います。なんて偉そうに言っていますが、XmlRpc.Netの利用には躊躇していたので、後押しをして下さったDoboWikiの管理人氏に感謝です。

ですが、実際に実装してみると、「やっぱり」という問題に突き当たります。そう、「遅い」のです。記事1件に付き1個のリクエストが出ますが、パラメータからもわかるように、毎回認証しています。また、レスポンスには記事そのものも含まれるなど、データ量もそれなりです。ですので、「新治市民の森」のように記事数が多いと、すべての記事について情報を取得するには数十秒かかります。

ということで、ここの方法で記事の情報は取得するにしろ、何かこちら側で対策を講じないととても使えたものではありません。次回は、この対策についてメモってみます。

コメント