#!/usr/bin/perl use strict; use warnings; use File::Find; use Getopt::Long; my $review_all = 0; my $verbose = 0; my $pattern; GetOptions ('all!' => \$review_all, 'verbose!' => \$verbose, 'pattern=s' => \$pattern); my $wb_dir = "bogus" my $wordpress_api_key = "bogus" my $akismet = Net::Akismet->new(KEY => $wordpress_api_key, URL => "bogus); my @deletes = (); my @renames = (); find(\&process_wb_file, ($wb_dir)); print ("DELETES: \n ", join("\n ", @deletes), "\n\n"); print ("RENAMES: \n ", join("\n ", @renames), "\n\n"); unlink($_) for @deletes; rename($_.".new", $_) for @renames; sub process_wb_file { return unless m/\.wb$/; if (defined $pattern) { return unless m/$pattern/; } open (my $fh, "<", $File::Find::name) or (warn("Can't open $File::Find::name: $!"), return); my %param; my $good_stuff = ""; my $current = ""; my $spammed = 0; foreach my $line (<$fh>) { $current .= $line; $line =~ /^(.+?): (.*)$/ and $param{$1} = $2; if ( $line =~ /^-----$/ ) { my %fields = (USER_IP => $param{'ip'}); if ($param{'excerpt'}) { $fields{COMMENT_TYPE} = 'trackback'; $fields{COMMENT_CONTENT} = $param{'title'} . "\n" . $param{'excerpt'}; $fields{COMMENT_AUTHOR} = $param{'blog_name'}; $fields{COMMENT_AUTHOR_URL} = $param{'url'}; } else { $fields{COMMENT_TYPE} = 'comment'; $fields{COMMENT_CONTENT} = $param{'title'} . "\n" . $param{'comment'}; $fields{COMMENT_AUTHOR} = $param{'name'}; $fields{COMMENT_AUTHOR_URL} = $param{'url'}; } # REFERRER, PERMALINK, COMMENT_AUTHOR_EMAIL my $verdict = $akismet->check(%fields); if ('true' eq $verdict) { print "Found spam in $File::Find::name\n"; use Data::Dumper; print Data::Dumper->Dump([\%fields]); print "Verify as spam and remove? [yn] "; my $answer = ; if ($answer !~ /[yY]/) { $akismet->ham(%fields); $good_stuff .= $current; } else { $spammed = 1; } } else { if ($review_all) { print Data::Dumper->Dump([\%fields]); print "Is this spam? [yn] "; my $answer = ; if ($answer !~ /[yY]/) { $good_stuff .= $current; } else { $akismet->spam(%fields); $spammed = 1; } } else { $good_stuff .= $current; } } $current = ""; } } close ($fh); if ($verbose) { print "\n\nGood stuff in $File::Find::name is\n$good_stuff\n\n"; } if ($good_stuff eq "") { push @deletes, $File::Find::name; } elsif ($spammed) { push @renames, $File::Find::name; open (my $new, ">", $File::Find::name . ".new"); print $new $good_stuff; close $new; } } package Net::Akismet; use 5.006; use warnings; use strict; use integer; use LWP::UserAgent; use HTTP::Request::Common; our $VERSION = '0.01'; # # my $akismet = Net::Akismet->new( # KEY => 'secret-baba-API-key', # URL => 'http://example.blog.net/', # ) or die('Key verification failure!'); # # my $verdict = $akismet->check( # USER_IP => '10.10.10.11', # COMMENT_CONTENT => 'Run, Lola, Run, the spam will catch you!', # COMMENT_AUTHOR => 'dosser', # COMENT_AUTHOR_EMAIL => 'dosser@subway.de', # REFERRER => 'http://lola.home/', # ) or die('Is the server here?'); # # if ('true' eq $verdict) { # # print "I found spam. I am a spam-founder!\n"; # } # sub new { my $that = shift; my $class = ref $that || $that; my %params = @_; my $self = \%params; my $UA_SUFFIX = "Akismet Perl/$VERSION"; $self->{ua} = LWP::UserAgent->new() or return undef; my $key = $self->{KEY} or return undef; my $url = $self->{URL} or return undef; my $agent = $params{USER_AGENT}? "$params{USER_AGENT} | " : ''; $self->{ua}->agent($agent.$UA_SUFFIX); bless $self, $class; return $self->_verify_key()? $self : undef; } sub _verify_key { my $self = shift; my $response = $self->{ua}->request( POST 'http://rest.akismet.com/1.1/verify-key', [ key => $self->{KEY}, blog => $self->{URL}, ] ); ($response && $response->is_success() && 'valid' eq $response->content()) or return undef; return 1; } sub check { my $self = shift; $self->_submit('comment-check', {@_}) or return undef; ('true' eq $self->{response} || 'false' eq $self->{response}) or return undef; return $self->{response}; } sub spam { my $self = shift; return $self->_submit('submit-spam', {@_}); } sub ham { my $self = shift; return $self->_submit('submit-ham', {@_}); } sub _submit { my $self = shift; my $action = shift || 'comment-check'; my $comment = shift; $comment->{USER_IP} || return undef; my $response = $self->{ua}->request( POST "http://$self->{KEY}.rest.akismet.com/1.1/$action", [ blog => $self->{URL}, user_ip => $comment->{USER_IP}, user_agent => $self->{ua}->agent(), referrer => $comment->{REFERRER}, permalink => $comment->{PERMALINK}, comment_type => $comment->{COMMENT_TYPE}, comment_author => $comment->{COMMENT_AUTHOR}, comment_author_email => $comment->{COMMENT_AUTHOR_EMAIL}, comment_author_url => $comment->{COMMENT_AUTHOR_URL}, comment_content => $comment->{COMMENT_CONTENT}, ] ); ($response && $response->is_success()) or return undef; $self->{response} = $response->content(); return 1; } 1;