Plagger::Plugin::Subscription::Toranoana
よつばの。を見てやった。悪気はなかった。つーか最初はCustomFeedとして作ってたんだけど、Subscriptionにするならhttp://www.toranoana.jp/shop/newka/shop.htmlからリンク抽出して個別のリスト取得すればいいじゃんと思った。まあいいや。EntryFullTextはめんどくさいのでまたこんど。
とらのあなRSSをPlaggerで、をインスパイアー - はこべにっき ♨に準じて画像を入れることに。この方法は最初からやるべきだよなーと思ってたんだけど、EntryFullText使うのがPlagger wayなのかなと思っていろいろ試してみたもののCookieの寿命がシビアなせいでMechanizeするFilterを書かないとEntryFullText相当のものはできそうにないっぽいね。
つーか画像を入れるととたんに使えるようになるな。テレホタイムあたりに巡回しよ。
Toranoana.pm
package Plagger::Plugin::Subscription::Toranoana; use strict; use warnings; use base qw( Plagger::Plugin ); use Plagger::Util; use Plagger::Feed; use Plagger::Entry; use URI; use HTML::TreeBuilder::XPath; sub register { my ($self, $context) = @_; $context->register_hook( $self, 'subscription.load' => \&load, ); } sub load { my($self, $context) = @_; my @tora_newka_shops = @{$self->conf->{shop}}; my $day = $self->conf->{day} || _today(time); for my $shop (@tora_newka_shops) { my $feed = Plagger::Feed->new; $feed->aggregator( sub { $self->aggregate($context, $shop, $day); }); $context->subscription->add($feed); } } sub aggregate { my($self, $context, $shop, $day) = @_; my $newka_uri = URI->new("http://www.toranoana.jp/shop/newka/${day}/${shop}_all.html"); my $data = Plagger::Util::load_uri($newka_uri); my $tree = HTML::TreeBuilder::XPath->new; $tree->parse($data); my $path = '//body/div[3]/table'; my $booknodes; eval { $booknodes = $tree->findnodes($path); } or die $@; my $feed = Plagger::Feed->new; $feed->title("Toranoana\@$shop $day"); for my $book (@$booknodes) { $self->_add_entry($context, $feed, $book); } $context->update->add($feed); } sub _add_entry { my($self, $context, $feed, $book) = @_; my $html = $book->as_HTML('<>&'); if (my @table = ($html =~ m|<td[^>]*>([^<]*)</td>|g)) { my $book_id = $table[0]; if ( ($html =~ /color\: \#FF99FF/) and ($self->conf->{yaoi_block}) ) { $context->log(info => "$book_id is yaoi"); return; } my $book_dir = join '/', ($book_id =~ /^(\d{2})(\d{4})(\d{2})(\d{2})/); my $book_link = "http://www.toranoana.jp/mailorder/article/$book_dir/$book_id.html"; my $book_body = join '', map { "<img src=\"http://img.toranoana.jp/img/$book_dir/${book_id}-${_}.gif\" />" } (1..3); my $entry = Plagger::Entry->new; $entry->title($table[2]); $entry->link($book_link); $entry->body($book_body); $entry->author($table[1]); $entry->tags([$table[3]]); $feed->add_entry($entry); } } sub _today { my @t = localtime(shift); my $day = sprintf("%02d%02d", $t[4]+1, $t[3]); return $day; } 1;
config.yaml
global: plugin_path: - /Users/ec/lib/nolagger/nolagger timezone: Asia/Tokyo user_agent: cookies: /Users/ec/lib/cookies.txt plugins: - module: Subscription::Toranoana config: shop: - aki1 - bukuro - nagoya yaoi_block: 1 - module: Publish::Feed config: dir: /Users/ec/Sites/tora_rss format: RSS filename: %t.rss