一部の方に好評なようなのでさらに Hack。blacklist ファイルを Comment 通知メールから更新できるようにしてみます。 以下のような mt-blacklist-append.cgi ファイルを mt.cgi とおなじとこにおきます。$blacklist は blacklist ファイルの絶対パス、$password は適当に決めてください。
miyagawa さんによるコメントスパム対策CGI。サーバ側でブラックリストを保持して不正コメントを URL ベースで拒否、コメント通知メールでブラックリストへの追加を行うという Hack。すばらしい。便利なので我が家にも導入しました。
MT コメントSPAM対策
http://blog.bulknews.net/mt/archives/000903.html
MT コメントSPAM Blacklist ファイル更新
http://blog.bulknews.net/mt/archives/000910.html
で、コメント通知メールからブラックリストへ追加する cgi であるところの mt-blacklist-append.cgi、ブラックリストへの URL 追加と同時にそのときついたスパムコメントを削除してしまったほうがより幸せな感じなので、Hacking the Hack。
Movable Type API を使ってコメントを削除して、該当のエントリと Main Index をリビルド。API があるので朝飯前。
#!/usr/local/bin/perl -w # mt-blacklist-append.cgi # written by Tatsuhiko Miyagawa (http://blog.bulknews.net/mt/archives/000910.html/) # modified by Naoya Ito <naoya@naoya.dyndns.org> use strict; use CGI; use FileHandle; use lib qw(/path/to/mt/lib); use MT; use MT::Entry; use MT::Comment; my $mt_cfg = "/path/to/mt/mt.cfg"; my $blacklist = "/path/to/blacklist"; my $password = "blahblah"; do_task(CGI->new); sub do_task { my $q = shift; $q->param('password') eq $password or return show_error($q, "Password mismatch"); my $out = FileHandle->new(">>$blacklist") or return show_erorr($q, "$blacklist: $!"); $out->print($q->param('url'), "\n"); $out->close; ## deleting a spammed comment from your database and rebuild the entry. my $mt = MT->new( Config => $mt_cfg ); my $comment = MT::Comment->load($q->param('id')) or return show_error($q, "Comment not found"); my $entry = MT::Entry->load($comment->entry_id) or return show_error($q, "Entry not found"); $comment->remove or return show_erorr($q, "Removing comment failed: " . $comment->errstr); $mt->rebuild_entry( Entry => $entry ) or return show_error($q, "Rebuliding entry failed: " . $mt->errstr); $mt->rebuild_indexes( BlogID => $entry->blog_id) or return show_error($q, "Rebuilding index failed: " . $mt->errstr); print $q->header, "Blacklist appended successfully."; } sub show_error { my($q, $msg) = @_; print $q->header, "Error: $msg"; }
追加したのは頭の方の Movable Type ライブラリ呼び出しの部分 (use lib 〜 use MT::Comment)、my $mt_cfg の一行、"deleting a spammed..." コメントから print $q->header の直前までの三箇所です。
改造に伴って、この cgi にコメントの ID を渡す必要があるので、MT/App/Comments.pm に加えた、メールに "Blacklist this URL?" を掲載するための箇所を編集します。
先の miyagawa さんのエントリ では 2.5系が対象で、2.6系と MT/App/Comments.pm のコードが異なっており、僕のはこんな風になってます。
243行目から、
$app->translate('URL:') . ' ' . $comment->url . "\n\n" .
$app->translate('Comments:') . "\n\n" . $comment->text . "\n\n" .
"Blacklist this URL?\n" .
$app->base . $app->path . "mt-blacklist-append.cgi?password=blahblah&url=" .
MT::Util::encode_url($comment->url) . "&id=" . $comment->id;
MT::Mail->send(\%head, $body);
といった具合です。
これで届いたメールに記載された URL をクリックすると、要らないコメントが削除されブラックリストが更新されます。
解説はしょりすぎですいません。
コメント削除の部分だけ拝借しました。ちょー便利。
Blacklistは追加したくない場合もありそうなので、
テンプレート編集でやってます。