エントリーに対して指定したはてなブックマークのタグがいくつ付いているかを数えてmetaに設定するPlaggerのFilter Plugin。 例えば、『はてなブックマーク - タグ 「perl」を含む注目エントリー』のRSSからさらに、特定のタグ「plagger」とか「catalyst」とかをつけられたエントリーを探すのに便利かも。 オプションでrateにも強引に突っ込むことができます。 foreachが3重になってちょっとかっこ悪いけど、こんな感じです。
package Plagger::Plugin::Filter::AddHatenaBookmarkTagsCount;
use strict;
use base qw( Plagger::Plugin );
our $VERSION = '0.01';
sub register {
my ($self, $context) = @_;
$context->register_hook(
$self,
'plugin.init' => \&init_add_hatena_bookmark_tags_count,
'update.entry.fixup' => \&filter,
);
}
sub init_add_hatena_bookmark_tags_count {
my ($self, $context, $args) = @_;
$self->{meta_name} = $self->{conf}->{meta_name} || "tatena_tags_count";
}
sub filter {
my ($self, $context, $args) = @_;
my $uri = "http://b.hatena.ne.jp/entry/rss/" . $args->{entry}->link;
my $content = Plagger::Util::load_uri(URI->new($uri),$self);
# parse by XML::LibXML because Plagger::FeedParser can't get dc:subject
my $parser = XML::LibXML->new;
my $doc = $parser->parse_string($content);
my @items = $doc->findnodes("//*[local-name()='item']");
foreach my $item (@items){
my $user = $item->findvalue("*[local-name()='title']/text()");
my @subjects = $item->findnodes("dc:subject");
foreach my $subject (@subjects){
foreach my $tag (@{$self->conf->{tags}}){
my $str = $subject->findvalue("./text()");
$str =~ s/\*//g;
if (lc($tag) eq lc($str)){
$args->{entry}->meta->{$self->{meta_name}} ++;
}
}
}
}
$args->{entry}->date(pop(@items)->findvalue("./dc:date/text()"));
$args->{entry}->rate($args->{entry}->meta->{$self->{meta_name}})
if $self->conf->{add_count_to_rate} && $args->{entry}->meta->{$self->{meta_name}};
}
1;
__END__
=head1 NAME
Plagger::Plugin::Filter::AddHatenaBookmarkTagsCount - add specified Hatena Bookmark tags count
=head1 SYNOPSIS
- module: Filter::AddHatenaBookmarkTagsCount
config:
tags:
- plagger
- catalyst
add_count_to_rate: 1 # optional
meta_name: hatebu_count # optional
=head1 AUTHOR
Yusuke Wada
=head1 SEE ALSO
L<Plagger>
=cut
config.yamlの例
global:
timezone: Asia/Tokyo
plugins:
- module: Subscription::Config
config:
feed:
- url: http://b.hatena.ne.jp/t/perl?mode=rss&sort=hot&threshold=3
- module: Filter::AddHatenaBookmarkTagsCount
config:
tags:
- plagger
- catalyst
- dbix
- dbic
add_count_to_rate: 1
- module: Publish::Serializer
config:
dir: ./
serializer: YAML
filename: %i.yaml
Serializerで見た結果より
- author: ~
body: ' アプリを作ってると色々ログ系をDBに保存しておきたかったりするのですが...'
date: 2007-08-24T17:06:25+09:00
enclosures: []
feed_link: http://b.hatena.ne.jp/t/perl
id: http://d.hatena.ne.jp/nekokak/20070824/1187941930
link: http://d.hatena.ne.jp/nekokak/20070824/1187941930
meta:
tatena_tags_count: 9
rate: 9
summary: ' アプリを作ってると色々ログ系をDBに保存しておきたかったりするのですが、...'
tags:
- ormap
- MySQL
- Perl
- dbic
title: 'Hatena::Diary::Neko::kak 500 Internal Server Error - DBICでテーブル名切替の術'
widgets: []

