MTBanASCII: コメントSPAM対策を MT3 に移植: blog.bulknews.net
ということで MT3.1 の CommentFilter コールバックを利用して、ASCII or Latin-1 のコメントを拒否またはモデレートするプラグイン MTBanASCII を作成しました。

導入してみました。

今までTypeKeyに登録している方しか受け付けないようにしていたのですが、
どうもコメントが激減してしまいました…。
というか、TypeKey導入後はほぼ同じ3人の方(自分も含め(笑))しかコメントしてくれません。

コメントが書かれない理由としては「TypeKeyを打つのが面倒」、「そもそもTypeKeyの認知度が低い」 というのが挙げられそうです。
あ、あと1つ、
「記事がコメントするまでの記事ではない…」
;-)

上記の理由なのだとは思うのですが、コメントが少ないと書いてる側としても
淋しい気持ちになるのでどうしようかと思っていたところ、
宮川さんがのASCII banのプラグインを公開していたので早速導入をしてみた。
これはコメントがASCIIかLatin-1だったらspamと判定して書き込みを出来なくしたり、モデレートにしてしまうプラグインとなっています。

んで早速インストール。
でも、ちゃんとpluginsディレクトリに置いたのですがどうもうまくいかないのでいろいろと調べてみたら
どうやら、テキスト判定がうまくできてないことがわかった。

テキストのASCII or Latin-1の判定が自分の環境ではうまくいかなかったので、
下記のようにutf8::decode()を使ってutfフラグをonにするように変更を加えました。

my $text = $comment->text;

my $text = utf8::decode($comment->text);

#ちなみに、Encode::decode_utf8()でも同様に動くようです。
#いまだにこのutfフラグがいまいちわかってない…。

ということで、TypeKeyとかいらなくなったので、じゃんじゃんコメント下さい。
ソース全体は下記です。
って元ソースから一行しか変えてませんが…。
package MT::Plugin::BanASCII;
# mt-ban-ascii.pl
# - Deny or moderate ASCII or Latin-1 comments using MT3 CommentFilter API
#
# Author:  Tatsuhiko Miyagawa 
# License: same as Perl
# Arranged by Yoshiki Kurihara 
#

use strict;
our $VERSION = "0.90";

# 'deny' or 'moderate'
our $Method = "moderate";

use MT;
use MT::Plugin;

my $plugin = MT::Plugin->new({
    name => "BanASCII v$VERSION",
    description => "Deny or moderate ASCII or Latin-1 comments",
});

MT->add_plugin($plugin);
MT->add_callback('CommentFilter', 2, $plugin, \&handler);

sub handler {
    my($eh, $app, $comment) = @_;
    my $text = utf8::decode($comment->text);
    if ($text =~ /^[\x00-\xff]+$/) {
        $app->log("ASCII or Latin-1 comment from " .
                  $app->remote_ip . ": " . $Method);
        no strict 'refs';
        return $Method->($app, $comment);
    }
    return 1;
}

sub moderate {
    my($app, $comment) = @_;
    $comment->visible(0);
    return 1;
}

sub deny {
    my($app, $comment) = @_;
    return 0;
}

1;