RSSフィードをアグリゲートしたい。Perlで。

Plagger....という選択肢が頭をよぎったが、Debian GNU/Linux Sarge だとパッケージが無いのでパス。

簡単なスクリプトで済むのがいいな……ということで探してみたら、XML-RSS-Aggregate - search.cpan.org というのが見つかった。小さいライブラリっぽいので、これを使ってみる。

This module is unmaintained and no longer works very well. The author (and I) recommend that you use XML::Feed now.

XML-RSS-Aggregate reviews - CPAN Ratings (Gamma):

「このモジュールはメンテされてないしちゃんと動かないよ。作者もXML::Feedをお勧めしてる」というレビューがみつかった……まぁ、とりあえず使ってみよう。

Aggregate.pm を見た感じでは、


use strict;
use XML::RSS;
use base 'XML::RSS';
 
use Date::Parse;
use LWP::Simple 'get';
use HTML::Entities 'encode_entities';

というライブラリ依存。

Debian GNU/Linux Sarge ではこれぐらいインストールしておけばよさそう。


# apt-get install libxml-rss-perl
# apt-get install libtimedate-perl
# apt-get install libwww-perl

で、UTF-8, 改行=LF なスクリプトを記述。


# あいうえお
use XML::RSS::Aggregate;
 
my $rss = XML::RSS::Aggregate->new(
 
  # parameters for XML::RSS->channel()
  title   => 'NI-Lab.',
  link  => 'http://www.nilab.info/',
  sort_by => sub {
    $_[0]->{dc}{subject}  # default to sort by dc:date
  },
  uniq_by => sub {
    $_[0]->{title}      # default to uniq by link
  }
);
 
# parameters for XML::RSS::Aggregate->aggregate()
$rss->aggregate(
  sources => [ qw(
    http://www.nilab.info/zurazure2/index.xml
    http://www.nilab.info/cheapjap/index.rdf
    http://www.nilab.info/wiki/index.xml
  ) ],
);
$rss->save("nilab.xml");

"Wide character in print at /usr/share/perl5/XML/RSS.pm line 1615." とか言われつつも何とかひとつにまとめることができたっぽい。
ただ、時系列順に並んでいない。ダメじゃん。
sort by dc:date だからかなぁ。
rss1.0 では <dc:date> を使っていたけど、rss2.0では <pubDate> だからダメなのかな。

XML-RSS-Aggregate のソースコード見てもよくわかんないや。

# 時間があったら XML::Feed 試してみるということで。


コメント

きょうNI-Lab.で、スクリプトパスしたいです。

tags: zlashdot Perl Feed Perl

Posted by NI-Lab. (@nilab)