前回の続き。
実は feedback プラグインを導入した最大の動機が、Akismet による強力なスパム対策。既に WordPress に標準で提供され (有効化は必要ですが) 実績を上げているとなれば、Blosxom でも使いたくなるというのが人情というもので(?)
実際に有効化するためには、Net::Akismet という Perl モジュールが必要です。モジュールがインストールできる環境にあればインストール、でなければ blosxom.cgi 本体と同じ階層に Net
というディレクトリを作り、その下に Akismet.pm を置いても OK です。API Key の取得も忘れずに (取得方法の解説サイト)。
/cgi-bin + blosxom.cgi
|
- /Net - Akismet.pm
で、実際にスパムと判断されそうな適当なコメント (“casino” とか “poker” とかのキーワードを入れたもの) を投稿してみましたが…普通に通ってしまいます。アレ? ローカルでやってるからダメなの? なら実際に構築したサイトの方でテスト。
…やっぱり普通に通ってしまいます。適当な他のサイトからスパムっぽいコメントを拾ってきて、そのままコピペして投稿しても通ってしまう。ダメじゃん。
で、サーバのエラーログを見てみますと、何か Use of uninitialized value in string eq
ていうエラーが一杯出てる。「初期化されていない変数が比較に使われてる」というエラーだそうで。エラーが出てる部分のプラグインのスクリプトは:
return 1 if $akismet->check(%fields) eq 'true';
ということは、$akismet->check(%fields)
が初期化されていないって事でしょうか? その少し前のコードにて:
# Attempt to connect to the Askimet service.
my $akismet = Net::Akismet->new(KEY => $wordpress_api_key,
URL => $blosxom::url);
unless ($akismet) {
warn "feedback: Akismet key verification failed\n";
return 0;
}
# Set up fields to be verified. Note that we do not use the REFERRER,
# PERMALINK, or COMMENT_AUTHOR_EMAIL fields supported by Akismet.
my %fields = (USER_IP => $ENV{'REMOTE_ADDR'});
if ($is_comment) {
$fields{COMMENT_TYPE} = 'comment';
$fields{COMMENT_CONTENT} = $$params_ref{'comment'};
$fields{COMMENT_AUTHOR} = $$params_ref{'name'};
$fields{COMMENT_AUTHOR_URL} = $$params_ref{'url'};
} else {
$fields{COMMENT_TYPE} = 'trackback';
$fields{COMMENT_CONTENT} =
$$params_ref{'title'} . "\n" . $$params_ref{'excerpt'};
$fields{COMMENT_AUTHOR} = $$params_ref{'blog_name'};
$fields{COMMENT_AUTHOR_URL} = $$params_ref{'url'};
}
ってやってるんだけど。で、上記と同じように %fields を埋めたテストスクリプトを書いて走らせてみると、どうも $akismet->check(%fields)
が undef
を返しているようです。うーん…という訳で、Net::Akismet の和訳ドキュメントを読んでみると:
- COMMENT_USER_AGENT
必須。コメント投稿者のユーザーエージェント文字列を示します。
ってなってる。改めて先のコードを見直すと、%fields に USER_IP
は設定されてるけど、COMMENT_USER_AGENT
が設定されていません。なるほど、必須パラメータが抜けてるので、undef
を返してるんですね。という訳で、コードを以下のように手直し。
my %fields = (USER_IP => $ENV{'REMOTE_ADDR'});
# 追加部分
$fields{COMMENT_USER_AGENT} = $ENV{'HTTP_USER_AGENT'}
これで改めてテストコメントを投稿しますと、今度はちゃんと弾いてくれました。ほっ。
次回は、コメントの処理まわりをもう少し弄ってますので、その辺の解説を。でも一旦この話題はしばらく休むかも。