PlaggerでTechnoratiのブログランキングTOP100のBlogを購読
OPML吐いて欲しいよなぁと思いつつも、Plagger ならこんな感じの config で取れる。
plugins: - module: Subscription::XPath config: url: http://www.technorati.jp/pop/blogs/ xpath: //a[@class="url" and not(@class="fn")]
あとはそのまま Publish::Gmail するなり、Publish::OPML して Bloglines や livedoor Reader に登録するなりすると。
んーすげー簡単。
http://www.technorati.com/pop/blogs/ でも動く。
そういえば、CustomFeed::Script があるなら、Subscription::Script とかあってもいいと思った。
XPathできれいに取れない場合とか、ぜんぜん別のところからとってくるとか。
あんまりそんなパターンないと思うけど。
適当だけどなんかこんな感じで。
package Plagger::Plugin::Subscription::Script; use strict; use base qw(Plagger::Plugin); use Plagger::Feed; use Plagger::Entry; use YAML (); sub register { my($self, $context) = @_; $context->register_hook( $self, 'subscription.load' => \&load, ); } sub load { my ($self, $context, $args) = @_; my $script = $self->conf->{script}; $context->log(debug => "Executing '$script'"); my $output = qx($script); if ($?) { $context->log(error => "Error happend while executing '$script': $?"); return; } my $conf = eval { YAML::Load($output) }; if ($@) { $context->log(error => "Failed to parse as YAML. Can't determine output format of $script"); return; } for my $f (@{$conf->{feed}}) { my $feed = Plagger::Feed->new; $feed->$_($f->{$_}) for keys %$f; $context->subscription->add($feed); } return 1; } 1;
あと、Subscription::HTMLSelector とかちょっとほしいかなぁ。
package Plagger::Plugin::Subscription::HTMLSelector; use strict; use warnings; use base qw(Plagger::Plugin::Subscription::XPath); use HTML::Selector::XPath qw(selector_to_xpath); sub load { my ($self, $context) = @_; $self->conf->{xpath} = selector_to_xpath(delete $self->conf->{selector} || '//a'); $self->SUPER::load($context); } 1; __END__ =head1 NAME Plagger::Plugin::Subscription::HTMLSelector - Subscription list with HTML::Selector::XPath =head1 SYNOPSIS - module: Subscription::HTMLSelector config: selector: a.url url: http://example.com/mySubscriptions.xhtml =head1 DESCRIPTION This plugin extracts subscriptions out of XHTML content, using CSS Selector to find links. =head1 AUTHOR Jiro Nishiguchi =head1 SEE ALSO L<Plagger>, L<HTML::Selector::XPath> =cut