突然ですが、Perlではてなブックマークを受信して、フィードを解析しようと思ったときの残骸。こどもの日だってのに何やってんの?という件についてはつっこんではいけません。
# ダウンロード my $req = HTTP::Request->new(GET => $feed_url); my $res = LWP::UserAgent->new->request($req)->content; # フィードを開く my $feed = XML::Atom::Feed->new(\$res); my @entries = $feed->entries; print FILE "entries of $feed_url\n"; foreach my $entry(@entries){ my %hash; $hash{title} = $entry->title; my @rellink = grep {$_->rel eq 'related'} $entry->link; $hash{link} = $rellink[0]->href if(@rellink); $hash{body} = $entry->summary; $hash{issued}= $entry->issued; print FILE "\ttitle: $hash{title}\n"; print FILE "\tlink: $hash{link}\n"; print FILE "\tsummary: $hash{body}\n"; print FILE "\tissued: $hash{issued}\n"; print FILE "\n"; } my @feedlink = grep {$_->rel eq 'next'} $feed->link; $feed_url = $feedlink[0]->href if(@feedlink); print FILE "nextfeed: $feed_url \n\n"; print "finished next $feed_url \n\n";
$feed_urlというのは、見てのとおりフィードのURLです。
まあ、XML::Atom::Feedを使えば、こんな感じであんまりXMLを意識せずに、いろんなことができますよ ということはよく分かりました。XML::Atom::Utilというものを使えばissuedをPerlタイムに変換できるようですが、こっちは動きませんでしたね(内部で使用しているDateTime.pmが、どこかでエラーを起こしている様子)。
注意しなければなと思ったのは、ソース内で2回出てくるgrepの部分。
結果は一個しか期待していないので、別にスカラーコンテキストでもいいやと思ったら大間違い。grepの戻り値は、スカラーコンテキストの場合結果の個数になってしまうのです。こういう関数がちょくちょくあったりするのが、Perlの癖のあるところですね*1。
はてな側には結構負荷がかかりますが…。blummyのように、クリックしただけでブックマークを取得、タグごとに分類して、リンクから飛べるようにしてくれるようなブックマークレットがあると楽だなあ…と思ったんですけどね。そういうのはやっぱり別ソフトで作らなきゃだめかなあ。
なお、ここではソースを一部しかあげていませんが、それ以外の部分のソースはを参考にしました。
最近はPOSTのサンプルも他の人によってあげられているようですので、参考になりそうです。
最後に、当然ながら
が必要ですので、インストールされてない場合はCPANあたりから入手してください。
*1:リファレンスになかったので忘れてましたが、そのとき結果は@_にでも入ってたかもしれない