Akismet を導入してみる

以下の記事を参考に、自分の blog ツールに Akismet を導入してみました。手順について、軽くまとめておきます。
なお、動作確認は Rails 2.0.2 で行いました。

※この記事は個人利用の場合について記述しています。商用アプリケーションに Akismet を使う場合、ライセンス料が発生する可能性がありますが、それに関しては私は興味がないので調べていません。

http://soakedandsoaped.com/articles/2006/10/01/how-to-protect-a-rails-application-against-spam-with-akismet

API キーを取得する

http://wordpress.com/signup/

このアドレスから WordPress のユーザ登録を行い、届いたメールを確認します。登録時は Just a username, please. をチェックしておきましょう。

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 のようなよくできたフィルタを利用するべきでしょう。