PlaggerでTechnoratiのブログランキングTOP100のBlogを購読


technorati.jp

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 して Bloglineslivedoor 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