Favorite Blogchecker

mixi を使って一番便利と感じたのが、マイミクメンバーの日記が更新された時に、更新情報が自動でトップページに表示されるという機能。更新された日記だけ読みに行けばいいので、毎回自分でページを開いて更新をチェックする手間が省けてかなりいい感じです。

んで、便利なモンは取り入れちゃえ! ってなわけで、りぐも真似してブログの更新チェッカを作ってみました。

システムの概要はざっとこんな感じです。

1.登録したブログの RSS を取得
2.取得した複数の RSS をそれぞれのアイテムに対し更新日時順にソートし、一まとめにした RSS を作成
3.作成した RSS から、最新の更新履歴を取り出しブログパーツとして書き出す

言葉で仕様書にまとめるとたったこれだけなんですが、オリジナルでつくるとなるかなりたいへんだったんですよー。今回はそのまとめです。

まず、RSSの取得と解析。これはほんとうは Plagger でやりたかったんですが、エアリス君 (Vine Linux 3.2) では Plagger のインストールを完了できなかった (Vine4 ではできたんですけどね…)ので断念。
取得だけなら、LWP::Simple などのHTTPでデータを取得するモジュールを使えば簡単にできるんですが、問題なのは解析。最初は XML::RSS モジュールを使ってがんばっていたんですが、RSS って要は XML なわけで、定義さえ追加すればけっこうフリーフォーマットなんで、一部解析できない RSS とかでてくるんですよねー。

そんなこんなで手詰まり気味だったときに出会ったのが XML::FeedPP というモジュール。
これは、標準で多くの RSS に対応しており、RSS 以外にも Atom や RDF も使えて、さらに未対応の要素にも独自に簡単に対応することができるので、慣れればかなり使いやすいです。しかも XML::TreePP 以外のモジュールが不要で、pm ファイルを置くだけで使えるというのもいい感じです。

で、FeedPP を導入することで、RSS の取得と解析はオッケー・・・に思えたんですが、タイムゾーンの罠が。更新時間を世界標準時 (UTC とかGMT) で記述している RSS と、日本標準時 (JST) で記述している RSS があるために、普通に時間でソートすればずれがでてくるんです。
色々と探してみましたが、うまい方法がみつからなかったので、perl の力技で UTC を JST に変換させて対応。

perl は独学なので、コードに保障はありませんが、↓みたいなことをやってます。

use Time::Local;
my $j = 0;
foreach my $item ( $feed->get_item() ) {
    my $strtmp = $item->pubDate(),;
    $j++;
    # 最後の1文字がZなら...
    if ( substr($strtmp, -1, 1) eq 'Z') {
        # UTC2JST
        my $strYYYY = substr($strtmp, 0, 4);
        my $strMM = substr($strtmp, 5, 2);
        my $strDD = substr($strtmp, 8, 2);
        my $strhh = substr($strtmp, 11, 2);
        my $strmm = substr($strtmp, 14, 2);
        my $strss = substr($strtmp, 17, 2);
        
        #1970年からの経過秒数を取得
        my $ttime = timelocal($strss, $strmm, $strhh,
           $strDD, $strMM -1, $strYYYYY);
        
        #UTC->JST = +9:00
        $ttime += 32400;
        
        $item->pubDate( $ttime );
    }
}

HTMLの書き出しは、まぁ適当に。

で、最後の問題が、ブログへの組み込み。
手っ取り早いのは IFRAME タグを使って HTML の中に別のHTMLを埋め込ませる方法。ただ、IFRAME タグは個人的に使いたくなかったので、phpspot開発日誌さんのところで説明されている IFRAMEを使わずにHTMLファイルから他のHTMLファイルを読み込む方法を採用。
一番スマートなのは Movable Type のプラグインとして作り込むことなんですが、さすがにプラグイン作成の仕様書を読んでまで作る気力はなかったので…。

そんなこんなでようやく完成したのが、このブログの左上においている「Favorite Blogchecker」です。制作時間約3日。

もっとも、BlogPeople のように、すでに同じようなことをサービスとして提供しているサイトは数多くあるので、それらを使うことが一番手っ取り早かったりもするわけですが……。
まぁ、今の業界で仕事している以上は、新しい技術への興味・探究心と、チャレンジ精神がなくなったら終わりだと思うので、自分でやることに意味があるんですよー (負け惜しみ

投稿者: りぐ 日時: 2006年12月15日 00:36
カテゴリ: [CGI(perl)]