Plagger::Plugin::Filter::POPFile v0.03
miyagawaさんにいろいろ助言をいただいてだいぶすっきり。Ruleの使い方がいまいちよくわかっていなかったのですが、これでPublish::POPFileはお蔵入りです。v0.02までのadd_tags_to_titleとdeleteについてはまた別プラグインで実装ということで。
# さらに指摘を受けたので微妙にverup.
# もひとつ気づいたことがあるので微妙にup.
package Plagger::Plugin::Filter::POPFile; use strict; use base qw( Plagger::Plugin ); our $VERSION = '0.03_02'; use XMLRPC::Lite; use File::Temp (); use Encode; sub register { my ($self, $context) = @_; $context->register_hook( $self, 'plugin.init' => \&connect_popfile, 'update.entry.fixup' => \&filter, 'update.fixup' => \&disconnect_popfile, ); } sub rule_hook { 'update.entry.fixup' } sub filter { my ($self, $context, $args) = @_; my $entry = $args->{entry}; my $filename = write_tmpfile($self, $context, $args); my $training = $self->conf->{training}; $training = 1 unless defined $training. my $bucket; if ($training) { $bucket = $self->{popfile}->call( 'POPFile/API.handle_message', $self->{popfile_session}, $filename, "$filename.out" )->result; } else { $bucket = $self->{popfile}->call( 'POPFile/API.classify', $self->{popfile_session}, $filename )->result; } $context->log(debug => $entry->permalink . ": $bucket"); $entry->add_tag($bucket); } sub connect_popfile { my ($self, $context, $args) = @_; $context->log(debug => "hello, POPFile"); $self->{popfile} = XMLRPC::Lite->proxy($self->conf->{proxy}); $self->{popfile_session} = $self->{popfile}->call( 'POPFile/API.get_session_key', 'admin', '' )->result; $context->log(debug => "session: $self->{popfile_session}"); $self->{popfile_tempdir} = File::Temp::tempdir( $self->conf->{tempdir} ? ( DIR => $self->conf->{tempdir} ) : (), CLEANUP => 1, ); } sub disconnect_popfile { my ($self, $context, $args) = @_; $context->log(debug => "good-bye, POPFile"); $self->{popfile}->call( 'POPFile/API.release_session_key', $self->{popfile_session} ); } sub write_tmpfile { my ($self, $context, $args) = @_; my $encoding = $self->conf->{encoding} || 'utf8'; my $entry = $args->{entry}; my $text = $entry->body_text; my ($fh, $filename) = File::Temp::tempfile( DIR => $self->{popfile_tempdir}, ); print $fh 'From: (', $entry->permalink, ') <plagger@localhost>', "\n", 'To: <plagger@localhost>', "\n", 'Subject: ', encode($encoding, $entry->title), "\n\n", encode($encoding, $text), "\n"; close $fh; return $filename; } 1; __END__ =head1 NAME Plagger::Plugin::Filter::POPFile - Categorize entries as spam et al =head1 SYNOPSIS - module: Filter::POPFile rule: module: Fresh mtime: path: /home/ishigaki/.plagger/fresh_rule autoupdate: 1 config: proxy: http://localhost:8081/RPC2 encoding: euc-jp training: 1 tempdir: /tmp =head1 CONFIG =over 4 =item proxy Your POPFile proxy URL. =item encoding Your POPFile encoding. Specify 'euc-jp' for Nihongo users. =item training Enables POPFile training (i.e. Adds entries to POPFile history). Defaults to true. =item tempdir (Optional) Temporary directory POPFile uses. Network directory might work, though I haven't tried yet. If you want to communicate with a remote POPFile (via Samba etc), try this. =back =head1 CAVEATS Don't forget to use Fresh rule while you're training POPFile. Otherwise your POPFile history would have a lot of duplicates. =head1 THANKS TO Tatsuhiko Miyagawa =head1 AUTHOR Kenichi Ishigaki =head1 SEE ALSO L<Plagger>, L<Plagger::Rule::Fresh>, POPFile =cut