« 32y+2d | ホーム | すてきなさむしんぐにゅ »

2007年4月10日

知り合いのサイトを勝手にRSS化してみる

Bloglinesを使い始めてRSSでWWWめぐりするのがらくちんになってきたので勢いに任せてというか現実逃避的にPlaggerで知り合いのページをRSS化してみた。余計な御世話とも言うが。

WWW初期のころからずっと続けてる個人ページなんかだとずっとつかってる日記アプリなどが使いやすくてしかも手製だからRSS導入しようにも、なんてときにはこうやって自前で規則性とってcrawler的な何かを回してやるのが手っ取り早い。しかしPlaggerわけがわからん。。。SubscriptionとかPublishとかFilterとか何を使って何を組み合わせればいいのか、きれいさっぱりだ。まあ、ろくにdocumentも読まずcookbookあたりを斜め読みするだけで済ませて力技で使ってしまおうとする俺が一番いけない。うん。

Plagger/Plugin/CustomFeed/Lapis.pm

package Plagger::Plugin::CustomFeed::Lapis;
use strict;
use base qw( Plagger::Plugin );

use LWP::UserAgent;
use HTML::Selector::XPath;
use HTML::TreeBuilder::XPath;

use Encode 'decode';

sub register {
    my($self, $context) = @_;
    $context->register_hook($self,
                            'subscription.load' => \&load,
                            );
}

sub load {
    my($self, $context) = @_;

    my $feed = Plagger::Feed->new;
    $feed->aggregator( sub{ $self->aggregate(@_) } );
    $context->subscription->add( $feed );
}

my $base_url = 'http://lapis.dameda.net/d/';
my $title = 'nomad, nomad';
my $xpath = q|//div[@class="articles-body"]//p|;

sub aggregate {
    my($self, $context, $args) = @_;

    my $ua = LWP::UserAgent->new;
    my $resp = $ua->get($base_url);

    my $tree = HTML::TreeBuilder::XPath->new;
    my $content = decode('euc-jp', $resp->content);
    $tree->parse($content);

    my $nodes = $tree->findnodes($xpath);

    my $feed = Plagger::Feed->new;
    $feed->type('lapis');
    $feed->url($base_url);
    $feed->title($title);
    $feed->description($title);

    foreach my $n (@$nodes) {
        my $a = $n->findnodes(q|./a[@name!=""]|)->[0];
        my $title = $a->attr('name');
        my $url   = $a->attr('href');

        my $entry = Plagger::Entry->new;
        $entry->title($title);
        $entry->link($base_url . $url);
        $entry->author('tatenyon');
        $entry->date(substr($title, 0, 8));
        $entry->body( $n->as_XML );

        $feed->add_entry($entry);
    }

    $context->update->add($feed);
}

1;

config.yaml

global:
  assets_path: ./assets
  timezone: Asia/Tokyo
  #level: debug
plugins:
  - module: CustomFeed::Lapis
  #- module: Publish::Debug
  - module: Publish::Feed
    config:
      format: RSS
      dir: ./
      filename: lapis.xml

トラックバック(0)

トラックバックURL: http://foursics.jp/cgi-bin/mt/mt-tb.cgi/80

コメントする