hatena2opml

例によってコピペの産物。
はてなアンテナが出力するLIRS形式のリストからひたすら RSS Auto Discovery し、OPMLで出力します。

#!/usr/bin/perl 

use strict;
use HTML::TokeParser;
use XML::OPML;
use LWP::Simple;
use URI;

our $HATENA_ID = 'tnx';
our $LIRS_URL  = "http://a.hatena.ne.jp/$HATENA_ID/source?mode=lirs";

my $lirs = get($LIRS_URL) or die $!;
my $opml = XML::OPML->new(version => "1.1");

$opml->head(
    title => "Hatena::Antenna::$HATENA_ID",
    ownerName => $HATENA_ID,
);

for (split(/\n/, $lirs)) {
    my @array = split(/,/);
    my $base  = $array[5];
    my $title = $array[6];
    my $rss  = undef;

    my $html = get($base) or next;
    my $parser = HTML::TokeParser->new(\$html);
    while (my $token = $parser->get_tag("link")) {
        my $attr = $token->[1];
        if ($attr->{rel} eq 'alternate' && $attr->{type} eq 'application/rss+xml') {
            $rss = $attr->{href};
            last;
        }
    }

    if ($rss) {
        $opml->add_outline(
            title   => $title,
            text    => $title,
            type    => 'rss',
            htmlUrl => $base,
            xmlUrl  => URI->new_abs($rss,$base),
        );
    }
#   else {
#       $opml->add_outline(
#           title   => $title,
#           text    => $title,
#           type    => 'html',
#           htmlUrl => $base,
#       );
#   }
}

print $opml->as_string();

$ hatena2opml.pl > hatena.opmlな感じで。出力後はUTF-8に変換が必要です。
お分かりのとおり実行にはやたら時間がかかります。
RSSを配信していない、若しくはオートディスカバリーできないサイトについて「type="html"」という形で出力したのですが、bloglinesに突っ込んだら挙動がおかしくなってしまって、編集とかできなくなってしまいました。うわーん。(上のソースではコメントアウトしてます)