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










