XML::RSS::JavaScript

ついでに周辺技術なんかを小出しにして見ようかと思う。そんなに大したものは使っていないし、大した事をやってはいないのだが。(というか、私の腕ではこれが限界。)

初期のfeed mergeでは、JavaScript出力にはXML::RSS::JavaScriptというモジュールを使った。今はTemplate-Toolkitに独自のHTML::Template的なインターフェースを被せたもので、テンプレート出力している。それはともかく、XML::RSS::JavaScriptだ。

名前の通り、RSSJavaScriptに変換して出力するモジュールだ。XML::RSSを継承しているので、直接パースからJavaScript化までを行なう事が出来る。表示に自由度は無いが、何かのRSSを気軽にJavaScriptに変換してウェブページに貼り付けたい、なんて用途の時には楽が出来そうだ。

例えば、JavaScript出力のRSSリーダーを作って、自家製『ホームページ』(もちろん、ブラウザ起動時のデフォルトページ)に貼り付けておくとかするのも面白いかも。

#!/usr/bin/perl
use strict;
use utf8;
use Encode;
use LWP::UserAgent;
use XML::RSS::JavaScript;

##

my $url = 'http://d.hatena.ne.jp/aql/rss';
my $js = './rss.js';

##

my $req = new HTTP::Request ('GET', $url);
$req->if_modified_since( (stat $js)[9] );
# GETにif-modified-sinceヘッダを付けておくと、更新されていない時に304が返ってくる。
# HTTP::Requestのif_modified_sinceメソッドは、エポック秒を入れると整形してくれる。

my $ua = new LWP::UserAgent;
my $res = $ua->request($req);

if( $res->code == 200 ){
my $rss = new XML::RSS::JavaScript;
$rss->parse( encode('utf-8', $res->content) );
$rss->save_javascript( $js, 10, 0 ); # 最新10件のタイトルのみ出力
}

exit;

これはファイル書き出しなので、crontabに登録して定期的に動かすと良い。printとas_javascriptメソッドを使えば直接出力も出来るので、CGIベースにも出来る。(更新された時はファイル出力と標準出力を行い、更新されていない時はファイルから入力して素通しする、とか。)XML::RSS::JavaScriptのドキュメントには、LWP::Simpleを使ったもっとシンプルなサンプルがあるが、トラフィック軽減の為にはif-modified-sinceヘッダやHEADによるチェックなんかを行なったほうが良いだろう。ともかく、XML::RSS::JavaScriptだけで、ちょっとしたユーティリティが作れるという話。

何でこんなのを書いているかというと、xptのクローラーのエッセンスがまさにこれだからだ。xptのクローラーは、得た情報をRDBに照らして重複をまとめたり等々いろいろやるのだが、取得からパースまではほとんどこんな感じである。