otsune's SnakeOil RSSフィード

python -c "print''.join([chr(x) for x in 111&1101,110+~-~11,10^11*11,110+~-~11,-~101,-~11^11*11,~-110,111&11*11,11+11+10,11|~-0110,1-~11^11*11,10^11*11,-~11^11*11,110,101])"

2006-07-31

Filter::Drk7jpTermsを書いた

| Filter::Drk7jpTermsを書いた - otsune's SnakeOil  を含むブックマーク はてなブックマーク - Filter::Drk7jpTermsを書いた - otsune's SnakeOil  Filter::Drk7jpTermsを書いた - otsune's SnakeOil  のブックマークコメント

404 Not Foundで解説されている http://app.drk7.jp/TermExtract.cgi?url= を使うプラグイン

package Plagger::Plugin::Filter::Drk7jpTerms;
use strict;
use base qw( Plagger::Plugin );

use Plagger::UserAgent;
use XML::LibXML;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' => \&update,
    );
}

sub update {
    my($self, $context, $args) = @_;

    # TODO: needs cache based on URL
    my $ua = Plagger::UserAgent->new;
    my $link = $args->{entry}->permalink;

    $context->log(debug => "calling Drk7jp Terms API for " . $link);
    my $res = $ua->get("http://app.drk7.jp/TermExtract.cgi?url=$link");

    unless ($res->is_success) {
        $context->log(error => "Drk7jp API failed: " . $res->status_line);
        return;
    }

    my @terms = eval { $self->parse_terms($res->content) };
    $context->log(info => "Terms for " . $args->{entry}->link . ": " . join(", ", @terms));

    for my $term (@terms) {
        $args->{entry}->add_tag($term);
    }
}

sub parse_terms {
    my($self, $xml) = @_;
    my $doc = XML::LibXML->new->parse_string($xml);

    my @terms;
    for my $node ( $doc->findnodes('/termextract/term/Value')->get_nodelist ) {
        my $term = $node->textContent;
        push @terms, $term if defined $term && $term ne '';
    }

    return @terms;
}

1;

__END__

=head1 NAME

Plagger::Plugin::Filter::Drk7jpTerms - drk7.jp Terms API for auto-tagging

=head1 SYNOPSIS

  - module: Filter::Drk7jpTerms

=head1 DESCRIPTION

This plugin queries Drk7.jp (L<http://app.drk7.jp/> for specific
terms used in entry body and auto-tag them.

=head1 AUTHOR

Tatsuhiko Miyagawa, Masafumi Otsune

=head1 SEE ALSO

L<Plagger>, L<http://www.drk7.jp/MT/archives/000626.html>

=cut

ぶっちゃけBulkfeedsTermsの改造。

アップデートすると必要になるCPANライブラリ

| アップデートすると必要になるCPANライブラリ - otsune's SnakeOil  を含むブックマーク はてなブックマーク - アップデートすると必要になるCPANライブラリ - otsune's SnakeOil  アップデートすると必要になるCPANライブラリ - otsune's SnakeOil  のブックマークコメント

  • XML::Feed
  • Term::Encoding
  • HTML::TreeBuilder::XPath
  • Time::Duration::Parse

XML::Feedは前から必要か。

トラックバック - http://subtech.g.hatena.ne.jp/otsune/20060731