Akismet を導入してみる
以下の記事を参考に、自分の blog ツールに Akismet を導入してみました。手順について、軽くまとめておきます。
なお、動作確認は Rails 2.0.2 で行いました。
※この記事は個人利用の場合について記述しています。商用アプリケーションに Akismet を使う場合、ライセンス料が発生する可能性がありますが、それに関しては私は興味がないので調べていません。
akismet.rb を配置する
上記記事に akismet.rb へのリンクがあるので、自分のアプリケーションの RAILS_ROOT/lib ディレクトリに保存します。中身は特に書き換えないでも大丈夫です。
フィルタ用メソッドを定義する
記事内にもサンプルがありますが、 yield を使って書いてみました。コメントを作成するコントローラ内で、以下のメソッドを記述します。
def check_comment_for_spam(name, body) @akismet = Akismet.new(APP_CONFIG[:akismet_api_key], root_url) if @akismet.verifyAPIKey && @akismet.commentCheck(request.remote_ip, request.user_agent, request.env["HTTP_REFERER"], # http referer "", # permalink "comment", # comment type name, # author name "", # author email "", # author url body, # comment text {}) # other render :text => "このコメントはスパムとみなされています。", :status => 400 else yield end end
Akismet.new の引数は、それぞれ API キーと blog のアドレスを指定します。
API キーについてはそのまま書くのが嫌だったのでコンフィグとして定義しています。コンフィグの定義方法については以前の記事を参照してください。
また、 blog のアドレスについては書き換え不要な root_url を使っておくと、後で使いまわすときに楽だと思います。
後は、これを使ってコメントを作成するメソッドを記述します。
def create @comment = Comment.new(params[:comment]) check_comment_for_spam(@comment.name, @comment.body) do if @comment.save redirect_to @comment.entry else # コメントの投稿は entries/show から行っているものとする render :action => "../entries/show" end end end
動作を確認する
名前と本文に viagra-test-123 と入れてコメントを投稿してみます。うまく動作している場合、このコメントはスパムとみなされています、と表示されるはず。
スパムフィルタについては自分で開発すると死ぬほど面倒なので、可能な限り Akismet のようなよくできたフィルタを利用するべきでしょう。