読者です 読者をやめる 読者になる 読者になる

高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

残骸(XML::Atom::Feedの使い方など)

プログラミング

突然ですが、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のサンプルも他の人によってあげられているようですので、参考になりそうです。


最後に、当然ながら

  • XML::Atom以下モジュール(XML::Atomのアーカイブに入ってるもの)
  • XML::XPath以下モジュール(XML::Pathのアーカイブに入ってるもの)

が必要ですので、インストールされてない場合はCPANあたりから入手してください。

*1:リファレンスになかったので忘れてましたが、そのとき結果は@_にでも入ってたかもしれない