FcPreviewプラグイン公開

こちらのエントリーで紹介したコメントスパム対策は、直接MTのソース自体に手を入れる必要があるため、実際のところちょっと人には勧めにくいし、バージョンアップ等した時に同じように再度修正しないといけないため面倒臭いです。
ということで、一念発起してプラグイン化に挑戦してみました。
しかしプラグイン作成については、基本的なものはSix Apartのサイトにもあるものの、なかなか突っ込んだ情報が見つからず、結局はMTのソースを解析したり先達の公開しているプラグインのソースを参考にさせてもらったりで、色々試行錯誤することに・・・
まぁそうやって苦労しながらも、なんとか思ったような動作をするものができました!
基本的に自分の使用環境でしか確認できないので、他の人の環境でも上手く動くのか不安ですが、良ければ興味のある方はお試しください。
ダウンロード:mt-fcpreview.lzh (ヘルプ
以降技術的なメモランダム。


このプラグインでは2種類の機能を実装しています。
・コメントプレビュー時にハッシュコードを生成して挿入するための変数タグ。
・コメントpost時にハッシュコードを確認する処理。
変数タグについて、実装の仕方自体はチュートリアルもあるので簡単そうでしたが、実際はコメントの内容の取得にちょっと試行錯誤が必要でした。
まずそもそもコメントの内容をどうやって取ったらいいのか、そのものズバリ書いてある情報が見つけられず・・・
これはソースを見れば分かるように

my $comment = $ctx->stash('comment_preview');

というようにして、引数のコンテキストオブジェクトからコメントオブジェクトを引っ張ってくることで解決しました。
その後で引っかかったのが、メールアドレスとコメント本文。
メールアドレスには、TypeKeyでサインインしていた場合に通常のアドレス形式ではなく、何かハッシュ化されたような文字列が入るようで、これはpost時には渡されない(?)ためこの文字列を除外する必要がありました。
コメント本文にはHTMLコード等もそのままの入力テキストが入ってました。
これはプレビュー画面が表示される時には、設定によってHTMLコードを削除されたりエンコードされたテキストになってpost時にもそれが渡ります。
それでそのままのテキストを使用すると、プレビュー時とpost処理時で内容が異なってしまう場合があるため、設定に関係なくHTMLコードを削除するようにしました。
あとこの変数タグは元々MTCommentFieldsタグの代わりにもなるよう、MT::Template::ContextHandlersのソースから該当部分をそのままコピーしています。(何かマズかったりするかしら? ^^;)
post処理時の実装には少し悩みました。
最初はCommentThrottleFilterのコールバックにして一応上手く動いたものの、これだとエラーメッセージが標準のシステムメッセージ固定で変更できず、ちょっと相応しくないなぁということで代替手段を探しました。
が、コールバックとして実装する良い方法が見つからずどうしようかと思っていたところで、参考になるプラグインを見つけました。
そのプラグインはTB・コメントフィルター用プラグインの「quasi-spamfilter」です。
これのCommentLongErrorメソッドの実装を参考にさせていただきました(というかそのまんまですが ^^;)。
ちょっとトリッキーな方法なのかなという気もしますが、今のところこれより上手い方法が分からないのでこれで行くことにしました。
あとの懸念は今後のバージョン(今MT4.0のβ版が公開されてますが)でも使えるのかどうか・・・
そのうち試してみようかな?
(※追記)MT4用の修正版はこちら>FcPreviewプラグイン改

コメント

コメントする