April 16, 2004

tdiary2rss.cgi ソース

blog.bulknews.net: tdiary2rss.cgi
知り合いにしか教えていなかったのですが、任意の tDiary を RSS 化するCGIを公開しています。

興味ある人のために、ソースも公開。あんまキレイじゃない。

#!/usr/local/bin/perl -w

use strict;
use Cache::FileCache;
use CGI;
use Encode::compat;
use Encode;
use LWP::Simple;

use lib "/bulknews/lib";
use RSS::Simple;

my $cache = Cache::FileCache->new({
    namespace => "tdiary2rss",
    default_expires_in => 60 * 30,
});

my $itempat = <<'PAT';
<div class="section">
<h3><a href="(.*?)"><span class="sanchor">.*?</span>
</a> *(?:\[.*?\])?(.*?)</h3>(.*?)
</div>
PAT
    ;

my $q = CGI->new;
$q->charset("UTF-8");

my $url  = $ARGV[0] || $q->path_info;
$url =~ s!^/!!;

my $html;
unless ($html = $cache->get($url)) {
    $html = get($url);
    $cache->set($url => $html);
}
$html = decode("euc-jp", $html);

my $title = ($html =~ m!<title>(.*?)</title>!i)[0];

my $rss = RSS::Simple->new();
$rss->channel(
    title => $title,
    link  => $url,
);

while ($html =~ s/$itempat//s) {
    my($link, $title, $body) = ($1, $2, $3, $4, $5, $6);
    $title =~ s/<.*?>//g;
    my @date = $link =~ /(\d{4})(\d{2})(\d{2})/;
    $rss->add_item(
        dc => { date => "$date[0]-$date[1]-$date[2]T00:00:00+09:00" },
        link => $link,
        title => $title,
        content => { encoded => $body },
    );
}

print $q->header('text/xml'), encode("UTF-8", $rss->as_string);

RSS::Simple は適当にでっち上げた、XML::RSS 代替。なんとなく XML::RSS 使いたくなかったので。

Posted by miyagawa at April 16, 2004 06:10 PM | Permalink | Comments (1) | TrackBack(1)
Comments

link つけました。

Posted by: miyagawa on April 21, 2004 05:21 PM
Trackbacks
TrackBack URL for this entry: http://blog.bulknews.net/mt3/mt-tb.cgi/943
早速飛びつこうとしたら変換されない……と思ったら、既にテンプレートいじってました。
Excerpt: 早速飛びつこうとしたら変換されない……と思ったら、既にテンプレートいじってました。
Weblog: せかいのおわり(仮題)-おしまい雑記
Tracked: April 17, 2004 10:43 PM
Post a comment