「Movable Type 5.04 による新規サイトの構築」 という項目に書いたように,あたらしいブログをたちあげるのに MT5 をつかったが,そこで課題になったことのひとつはコメント・スパムを防止することだ. いろいろな方法があるが,これまでつかってきた keystrokes.pl というプログラムをつかうのが,投稿者の負担もすくなくて,よい. そこで,すこしばかりハックして,それがつかえるようにした.
Captcha という方法もあるが,これは投稿者に負担をかけるのでやめたい. Movable Type 3 をつかっているこのサイトでは keystrokes.pl というプラグインをつかってきたが,これは強力だ. これを今度もつかいたいが,そのままでは MT5 ではつかえないらしい. Web を検索してみると,いろいろと情報が錯綜している. しかし,やっと静的なブログ記事でつかえる,ただしい方法がわかった.
MT3 における keystrokes.pl (keystrokes-0.1.5.tar.gz または keystrokes-0.1.5.zip) というプログラムのつかいかたに関しては,Movabletype 3.3 コメントスパム対策 というページにくわしく記述されている. (英語の説明は MT-Keystrokes というページにあり,プログラムへのリンクもここにあるが,そのリンクはふるい.) 基本的にはこれにしたがえばよいが,MT5 のばあいにはもうひとつ,つぎの修正が必要である.
return 1 unless $MT::VERSION =~ m(^3\.);
この "3" を version 5 のときには "5",version 4 のときには "4" にする必要がある (「MT5.1の再構築 早し!!」 に書いてあるとおり).
[2011-3-26 追記]vvv
もうひとつ,おとしなあがあった.
上記の修正だけでは,サインインしていないひとがコメントを投稿したとき 「保留しました」 といわれるが,実はエラーのため投降した内容がうしなわれてしまうというバグがあった (サインインしていれば投稿することができるので,これまで気がつかなかった).
これをなおすには,「Hitorigoto? - コメントスパム対策 完結編・・か?」 などにあるように keystrokes.pl のつぎの行をコメントアウトする必要がある.
$eh->error("keystroke id: " . $obj->blog_id);
^^^
以下,Movabletype 3.3 コメントスパム対策 にある情報もかんたんにまとめておく. 必要な変更はつぎの 3 つである (いずれもパスは MT5 がインストールされたディレクトリからの相対パス).
- keystrokes.pl のコピー:
plugins というディレクトリに,上記のパッチをあてた keystrokes.pl をいれる. - コメントのテンプレートかきかえ:
コメントのテンプレート (MT5 では通常,管理画面のメニューで デザイン > テンプレート > テンプレートモジュール > コメント という順序で選択できる) を 3 箇所かきかえる. かきかえかたについては後述する. - コメントプレビューのテンプレートかきかえ:
コメントプレビューのテンプレート (MT5 では通常,管理画面のメニューで デザイン > テンプレート > システムテンプレート > コメントプレビュー という順序で選択できる) を,コメントと同様に 3 箇所かきかえる.
コメントとコメントプレビューにおいて,かきかえるのはつぎの 3 箇所である.
- form タグの直後に <$MTKeystrokes$> というタグを追記 (1 行挿入) する.
<form method="post" action="<$mt:CGIPath$><$mt:CommentScript$>" name="comments_form" id="comments-form" onsubmit="return mtCommentOnSubmit(this)">
<$MTKeystrokes$>
... - textarea タグに属性をひとつ追加する.
<textarea id="comment-text" name="text" rows="5" cols="50" onkeypress="keystrokes(this.form)" onfocus="mtCommentFormOnFocus()"> - 投稿ボタンをあらわす input タグに属性をひとつ追加する.
<input type="submit" accesskey="s" name="post" id="comment-submit" onclick="keystrokes(this.form)" value="投稿" />