Akismetを使ったトラックバック・スパム対策

いい加減にトラックバック・スパムがうざくなってきたので対策してみました。COREBlog2におけるコメント&トラックバック・スパム対策に関しては、清水川さんが纏めてくれているので、それを参考にAkismetというWordPress標準の対策機能を使ってSPAM判定をするようにしました。

1. akismet.py をダウンロードしてパスの通った所(/usr/lib/python2.3など)に置く

2. akismet.pyをZope環境から呼び出せるように設定

[Zopeのディレクトリ]/Products にGlobalModulesという名前のディレクトリを作成
下記の内容の __init__.py というファイルを中に作成
from Products.PythonScripts.Utility import allow_module
allow_module("akismet")

3. WordPressのアカウントを登録して、APIキーを取得

APIキーは、http://wordpress.com/signup/ でサインアップするとメールで送られてきます。

4. ZMIから portal_skins/COREBlog2/tbping を編集して、太字部分のコードを追加
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.utils import log
import akismet

cbtool = getToolByName(context, 'coreblog2_tool')

REQUEST = context.REQUEST
form = REQUEST.form
RESPONSE = context.REQUEST.RESPONSE
entry = context

excerpt = ''
if form.has_key('excerpt'):
    excerpt = form['excerpt']

title = cbtool.convert_charcode(form['title'])
blog_name = cbtool.convert_charcode(form['blog_name'])
excerpt = cbtool.convert_charcode(excerpt)

#Try to add trackback
try:
    #Check SPAM
    is_spam = False
    my_api_key = "xxxxxxxxxxx"
    try:
        real_key = akismet.verify_key(my_api_key, context.absolute_url())
        if real_key:
            is_spam = akismet.comment_check(my_api_key,
                          context.absolute_url(),
                          REQUEST.getClientAddr(),
                          REQUEST.get('HTTP_USER_AGENT', ''),
                          comment_type="trackback",
                          comment_author_url=form['url'],
                          comment_content=form['excerpt'].encode('utf-8'))
    except Exception, e:
        log( 'COREBlog2/tbping: '
                     'akismet exception occured, %s' % e )
    if is_spam:
        raise RuntimeError, 'akismet judged as SPAM. %s' % form['url']
    #Send notify mail if need
    if context.getSend_trackback_notification():
        try:
            to_addr   = context.getNotify_to()
            from_addr = context.getNotify_to()
これで問題のトラックバック・スパムは、ほぼ防げているようです。でも、自分でテストした感じでは、問題のないトラックバックもスパムと判定して弾いちゃうことがあるようです。とりあえず、これでしばらく様子をみますが、”ここはまずいんじゃないの”とか”もっと良い方法があるよ”とかのツッコミは大歓迎。


関連リンク:
Akismet in Python and API docs


Leave a comment





このエントリーのはてなブックマーク (-)