« 「これはすごい」「これはひどい」のデータ構造をPlaggerのconfigだけで作る | メイン | sqliteのdbの文字コードを変換する »

Plagger::Plugin::Filter::AddHatenaBookmarkTagsCount

エントリーに対して指定したはてなブックマークのタグがいくつ付いているかを数えて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: []

トラックバック

このエントリーのトラックバックURL:
http://yusukebe.com/mt/mt-tb.cgi/2169

この一覧は、次のエントリーを参照しています: Plagger::Plugin::Filter::AddHatenaBookmarkTagsCount:

» はてブでみんながほしいと感じた記事がひとめでわかる「これ☆ほしい」を作ってみた 送信元 ゆーすけべー日記
つい先日「iPod Touch」などを衝動買いしてしまった僕ですが、 そんな物欲をさらに加速させるようなサイト「これ☆ほしい」を作ってみました。... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


ブログSEO対策:track word seo