2008年03月17日

「MT-Keystrokes プラグインを入れるとコメントが保留になってしまう」問題を乗り越える!

Movable Type のプラグイン、SpamLookup をうまく使うことによって、ブログ閲覧者にスパムを見られてしまう事態は避けられるようになった。
しかし、日に500件近いコメントスパムが来るため、結局 DB は圧迫されっぱなし。
こうなってくると、悪い人にはコメント/トラックバックさせないという強硬手段が必要になってくる。

そこで色々探すうちに、非常に有効なプラグインである「MT-Keystrokes」に(ようやく)出会った。

仕組みは簡単。
コメントのテキストエリアに文字を入力する or 「投稿」ボタンを押す、といった操作を経由していないコメントの投稿自体を失敗させるというもの。
投稿者側の閲覧設定で JavaScript が ON になっている必要があるが、うちのサイトは他の理由で既に ON の方しか歓迎していないので、問題ない。

以下あたりを見ると導入できる。

「導入できる」のだが…。
実はこの「MT-Keystrokes」、「導入したら全てのコメントが保留だって言われるようになった」との悲鳴が一部であがっている。

「保留だ」と言われるものの実際には保留状態にはならず、コメントが失われるという症状を示す。
私も同じ状態にハマったのだが、なんとか解決できたので、解決方法を以下にまとめておく。
#かなり今更だが…

原因の可能性は以下の四つ。

  1. 「keystrokes.pl」を正しい位置に配置できていない
  2. テンプレートを正しく修正できていない
  3. 正しいタイミングで「サイトを再構築」していない
    1・2を正しく実施してから再構築しないといけない。実施前ではダメ
  4. MT-Keystrokes のバージョンと MT のバージョンの相性が悪い

1〜3はいいとして、問題は4。
実は keystrokes-0.1.5.zip と keystrokes-0.1.4.zip、MT3.33 と MT3.2 では、組み合わせによって動作が異なる。

MT3.2 MT3.33
keystrokes-0.1.4 動作する(エラーログだけ出る) 動作する(正常ログだけ出る)
keystrokes-0.1.5 動作する(正常時に余計なエラーログが出る) 動作しない(ログには何もでない)
※ログの有無の原因は良く分からない

この動作の違いは keystrokes-0.1.5 の「keystrokes.pl」に含まれる以下の行にある。

$keystrokes = $q->param($FIELD_NAME) if $q->param($FIELD_NAME);
$eh->error("keystroke failed: " . $obj->email) if $LOG && $keystrokes < 1;
$eh->error("keystroke id: " . $obj->blog_id);
return $keystrokes > 0

この行は MT の仕様的に不必要というかマズイ記述。
MT3.2 では実装者の意図(≠MTの仕様)通りに動作してしまうが、MT.pm の run_callbacks あたりが変わった(と思われる)MT3.3 以降では、動作しないように(=仕様通りに)なったっぽい。
そこでその行をコメントアウトしてみると以下のようになった。

MT3.2 MT3.33
keystrokes-0.1.5 改 動作する(エラーログだけ出る) 動作する(正常ログだけ出る)

現在「MT-Keystrokes」のホームページのリンクからダウンロードできるのは keystrokes-0.1.4.zip になっている。
上のような結果による影響かも知れない。
keystrokes-0.1.5.zip は直接 URL を打てば入手できるので、入手後に上述の修正を入れれば、十分使える。
0.1.4 と 0.1.5 の違いは些細なので、気にならない方は 0.1.4 を使われると良いだろう。

ちなみにこのサイトは MT3.33。
エラー時のログが出ない(=引っかかったコメントスパムが確認できない)のが寂しいので、上述の部分を以下のように変更して使っている。

$keystrokes = $q->param($FIELD_NAME) if $q->param($FIELD_NAME);
$app->log({message => $app->translate("Comment save failed with [_1]",
		"keystroke failed"),
	blog_id => $obj->blog_id,
	class => 'comment',
	level => MT::Log::ERROR()
	}) if $LOG && $keystrokes < 1;
return $keystrokes > 0

「MT-Keystrokes」プラグインによって、ここ数日のコメントスパムは完全にシャットアウトされている。
フィルタリングの対象にさえならないという爽快感。
これで当サイトのコメントスパム対策は終了と言っていいだろう。

ちなみにこの「MT-Keystrokes」、MT4 系では動かないという説があるのだが…(つづく?)


投稿者 iiroty : 2008年03月17日 20:17 | トラックバック
コメント

はじめまして。
こちらの記事を参考に、MT3.36でMT-keystrokes0.1.5が動作するようになりました。
ありがとうございました。

Posted by: Zacky。 : 2008年03月19日 21:34

お役に立ててよかったです。
ちなみに MT4 ではそのままは使えないようです。
以降の際にはご注意ください。
とりあえず keystrokes.pl の66行目にあるバージョンチェックをコメントアウトしないといけないようですが、手元では試してないので、詳細は不明です。

Posted by: iiroty : 2008年03月20日 21:57

もうだいぶ古い記事なので恐縮ですが・・

半ばあきらめていたのですが、
記事どおりのkeystrokes.pl を以下のコメントアウトでいけました!
$eh->error("keystroke id: " . $obj->blog_id);

助かりました・・。
MT4.25で、動いてます。
バージョンチェックは3→4に書き換えるだけで
いけるようですねー。


Posted by: winky : 2009年05月18日 00:21
コメントする









名前、アドレスを登録しますか?