Days of Liris
2005/06/27
COREBlogのコメントスパム対策
Author: liris
-
Modified: 2005/06/27 13:31
Tag:
dev
コメントスパムが鬱陶しかったので、COREBlogのコメントスパム対策です。なんか、こんなことばっかやっているな・・・。と言うのは置いておくとして、以前(去年)はspamassasignを使ってスパムの判定をしていましたが、これはメンテナンスがめんどくさいです。と言うか、スパムフィルタをメール以外に応用してみたかったので作ってみただけです。それで、COREBlogのバージョンをあげたりしている間にいつのまにかパッチを当てるのを忘れてしまい、パッチを探せばいいのですが、まあ、新たに対応しました。
以前はスパムフィルタを使っていましたが、実際に運用すると単にBlacklistでやれば十分なような気がしていたので、今回はBlacklistでフィルタすることにしました。単純な戦略で十分効果があるような気がします。とりあえず、2週間弱動かしていて、まあ、いい感じです。trackbackについても、もう少しスパムらしきものが増えれば同様の処理をするかも。
動作原理は、コメントが追加されるとmethodsの下のPython Scriptをコールして返り値をみて、moderateにするかどうかを判定します。
COREBlogに対するパッチは↓。
実際の判定はPython Scriptで行うので、methodsの下にPython ScriptをaddCommentPreHookという名前で追加します。Python Scriptにした理由は、やってみたかったから。と言うのと、判定の方法を簡単に変えて実験しやすいようにと言う理由です。スクリプトの内容は
後は、methodsのフォルダのPropertyにlinesでbuzz_wordsと言うプロパティを追加して、その中に禁止単語を書いていきます。僕の所は、とりあえず、poker、casinoという単語が入っています。
関数に渡された引数をstrで文字列にしています。まあ、これで十分かもしれませんが、その気になれば、emailやurlでフィルタできるかな・・・。返り値がNone以外であればmoderateフラグがセットされます。これだけです。
でも、Pythonスクリプトからmethodsじゃなくって、COREBlogのフォルダのpropertyを取得したかったのに、やりかたがわからない。と言うか、調べていない。どうやるんだろう?
と言うことで、車輪はオーダーメイドの使い捨てでした。
以前はスパムフィルタを使っていましたが、実際に運用すると単にBlacklistでやれば十分なような気がしていたので、今回はBlacklistでフィルタすることにしました。単純な戦略で十分効果があるような気がします。とりあえず、2週間弱動かしていて、まあ、いい感じです。trackbackについても、もう少しスパムらしきものが増えれば同様の処理をするかも。
動作原理は、コメントが追加されるとmethodsの下のPython Scriptをコールして返り値をみて、moderateにするかどうかを判定します。
COREBlogに対するパッチは↓。
diff -r -u COREBlog.orig/Entry.py COREBlog/Entry.py
--- COREBlog.orig/Entry.py 2005-05-03 01:22:00.000000000 +0900
+++ COREBlog/Entry.py 2005-06-23 00:08:12.000000000 +0900
@@ -44,6 +44,7 @@
from ObjectBase import ObjectBase,Trackback,Comment,SendingTrackback
from utility import make_unique, \
call_addcomment_hook,call_addtrackback_hook, \
+ call_checkcommentspam_hook, \
send_ping, \
convert_charcode, \
get_string_part,split_in_newline, \
@@ -501,6 +502,11 @@
moderated = 0
except:
pass
+
+ force_moderate = call_checkcommentspam_hook(self.aq_parent,comment_id,self.id,v_h(title),v_h(author), \
+ v_c(body),v_h(email),v_h(url))
+ if force_moderate is not None:
+ moderated = 0
#check values
if REQUEST:
diff -r -u COREBlog.orig/utility.py COREBlog/utility.py
--- COREBlog.orig/utility.py 2005-05-03 01:22:00.000000000 +0900
+++ COREBlog/utility.py 2005-06-23 00:13:29.000000000 +0900
@@ -158,12 +158,12 @@
except:
pass
#no hook object
- return
+ return None
try:
if hook_obj:
#call the hook
- hook_obj(dic)
+ return hook_obj(dic)
except Exception,e:
try:
import zLOG
@@ -207,6 +207,19 @@
call_script(site,"methods/addCommentHook",d)
+def call_checkcommentspam_hook(site,id,parent_id,title,author,body, \
+ email,url):
+ d = {}
+ d["id"] = id
+ d["parent_id"] = parent_id
+ d["title"] = title
+ d["author"] = author
+ d["body"] = body
+ d["email"] = email
+ d["url"] = url
+
+ return call_script(site,"methods/addCommentPreHook",d)
+
def call_addtrackback_hook(site,id,parent_id,title,excerpt,url,blog_name):
d = {}
実際の判定はPython Scriptで行うので、methodsの下にPython ScriptをaddCommentPreHookという名前で追加します。Python Scriptにした理由は、やってみたかったから。と言うのと、判定の方法を簡単に変えて実験しやすいようにと言う理由です。スクリプトの内容は
try:
buzz_words = container.getProperty("buzz_words")
s = str(d)
for w in buzz_words:
if s.find(w) >= 0:
return "buzz"
return None
except:
return None
後は、methodsのフォルダのPropertyにlinesでbuzz_wordsと言うプロパティを追加して、その中に禁止単語を書いていきます。僕の所は、とりあえず、poker、casinoという単語が入っています。
関数に渡された引数をstrで文字列にしています。まあ、これで十分かもしれませんが、その気になれば、emailやurlでフィルタできるかな・・・。返り値がNone以外であればmoderateフラグがセットされます。これだけです。
でも、Pythonスクリプトからmethodsじゃなくって、COREBlogのフォルダのpropertyを取得したかったのに、やりかたがわからない。と言うか、調べていない。どうやるんだろう?
と言うことで、車輪はオーダーメイドの使い捨てでした。
COREBlog1.2.1
Author:
清水川記
-
Modified: 2005/11/18 10:24
コメントスパム対策
Author:
山の家Blog
-
Modified: 2006/10/12 23:50
仮設運用中は対策は行うつもりは無かったのだけど、最近はあまりにもスパムの量が多いので、スパムフィルタの機能を追加しました。
「Days of
Liris」の「COREBlogのコメントスパム対策」に記載されていた、単語でスパムをフィルタリングするパッチを適用。
さて、効果の程はどんなものかな。
がリリースされました。今回のリリースを境にメンテナンスモードに入ると言うことで、これまでの延長線上での機能追加はこれが最後になるようです。
ということで、さっそく今回のリリースで追加された
コメントやトラックバックの追加前にフックメソッドを呼び出す
機能を使ってみました。