勉強がてらCustomFeed::Pyaを作ってみた。

Plaggerを触ってみようと思ってずーっと放置してたのでそろそろ手を出してみる。

とりあえず自分で何か作ってみようと思いCustomFeed::Pyaなるものを勉強がてら作ってみた。

一応、SAPPORO Today: pya! の ATOM フィード。というのがあるみたいだけどとりあえずお構いなしで作ってみる。

で色々ソースを見てみたんだけどもう、意味わかんないす。

もうわかんないんで色々参考にしながらかなり適当に作ってみました。

 package Plagger::Plugin::CustomFeed::Pya;
 use strict;
 use base qw/Plagger::Plugin/;
 
 use Plagger::Mechanize;
 use URI::Escape;
 use Encode;
 
 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);
 }
 
 sub aggregate {
     my($self, $context, $args) = @_;
     
     my $url   = "http://pya.cc/";
     my $start = "http://pya.cc/kako.php";
     if( defined $self->conf->{keyword} ) {
         $start = sprintf q{http://pya.cc/kako.php?tpage=0&keywd=%s} , uri_escape($self->conf->{keyword});
     }
     
     my $mech = Plagger::Mechanize->new(cookie_jar => $self->cookie_jar);
     $mech->get($start);
     
     my $content = decode('utf-8', $mech->content);
     
     my $feed = Plagger::Feed->new;
     $feed->title('Pya!');
     $feed->link($url);
     
     my %category = map { $_ => 1 } @{ $self->conf->{category} || [] };
     my $category_all = !%category;
     
     my $regex = qr|<tr><td width='65' align='center' bgcolor='#[\da-fA-F]+'><SPAN CLASS='moji7'>([\w-]+)</SPAN></td><td colspan='3' width='400' bgcolor='#[\da-fA-F]+'><a href='(cnt2\.php\?uid=\d+)' target='_blank'><SPAN CLASS='moji5'>(.*?)</SPAN></a></td></tr>|;
     
     while( $content =~ /$regex/g ) {
         my $category = $1;
         my $link     = $2;
         my $title    = $3;
         
         if( $category_all || $category{$category} ){
             my $entry = Plagger::Entry->new;
             $entry->title($title);
             $entry->link($url.$link);
             $feed->add_entry($entry);
         }
     }
     
     $context->update->add($feed);
 }

こんな感じのやり方でいいのかなぁ。どこで何すればいいのかいまいちよくわかんなかった。

YAMLは、

   - module: CustomFeed::Pya
     config:
       # ネコ好きな人(タイトルが「nya」で終わるもの)
       keyword: %nya
       category:
         - Image
   
   - module: CustomFeed::Pya
     config:
       # エロ好きな人(タイトルが「(18+)」で始まるもの)
       keyword: (18+)
       category:
         - Video-P
         - Image

といった感じで。

keywordとcategoryは両方とも省略可能。

ソースを解析していく作業ってやっぱ面白いですね。