Yskin's Kill Spam Comments——直接删除匹配黑名单的评论

这两天垃圾评论越来越多了,以前一天20封,现在一天没上网,垃圾评论100多。每次临近过年的时候都会收到好多人的告诫,“快过年了,注意提防小偷啊,因为小偷也要抓紧干活准备过年嘛。”今天是圣诞节,过两天就是元旦了,国外的spammer是不是也在准备过年啊?

以前用的是重量级插件Spam Karma 2,不过已经停用好久了,SK2太重量级了,我的小Blog还用不上。这几个月一直用着WordPress自带的评论审查功能,在WordPress后台->选项->评论选项里可以找到。WordPress提供了两个功能,一个是“评论审查”,将符合审查关键词的评论的comment_approved值设为0,这样评论被缓冲,并不显示出来,等待管理员来处理。另一个是“评论黑名单”,将符合黑名单里的关键词的评论的comment_approved值设为"spam",这样评论不会显示,也不会在后台->管理->等待审查列表里显示出来。

用黑名单固然好,不用管理员处理,不过可能会误封一些正常评论,而且评论仍然在数据库里,还占用一个ID号。用评论审查呢,可以随时到等待审查列表里检查截获的垃圾评论,看一下,把误封的挑出来,其他的全部删除,这样不占用数据库空间。缺点是,还是被占掉一个ID号,而且垃圾评论会同时出现在管理->等待审查和管理->评论两个列表里,每次去看评论都要先去等待审查列表里清一下垃圾评论,也不是很方便。

于是就写了个小插件,解决一下这个问题。在"pre_comment_approved"那里hook一下,检测到评论被设置为spam就直接die(),hoho。

我的Blog只需要设置两个关键词:"...</strong>"和"[/url]",就可以屏蔽掉几乎全部垃圾评论了。

P.S. Merry Christmas. 昨晚平安夜,有没有放袜子在床尾啊?一定要白色棉袜子才行的哦。

Update:修改了一下,添加了一个功能,可以过滤所有包含"...</strong>"字样并且一个汉字都没有的评论。基本上带"[/url]"字样的评论都是针对那些使用UBB之类代码的Blog,可是WordPress本身不支持。带有"...</strong>"字样的,一般都是Trackback。好像有一些系统,甚至有些WordPress发送的Trackback的内容是以"<strong>...</strong>"开头的,不过我的Blog里目前只有7条是这样的。没仔细看WordPress源代码,好像大多数WordPress发送的Trackback不是这样的啊。黑名单只能过滤字符,不能做进一步的判断,所以我给插件加上一个功能,可以判断评论里是否有这样的字样,并且在评论不包含汉字的时候直接清除。这样基本上不会误删了。

写这个插件耗了不少时间,我也学到一些PHP知识。比如,表达式'spam'==true的结果是true,'spam'==0的结果是true。所以要用三个等号===进行判断才准确。还有WP的add_action()函数的用法,唉,复杂复杂。

Update2:到今天为止,这个插件用了整整半个月了。现在垃圾评论平均每天一条吧,插件的效果还算不错。

请移步到“Yskin's Kill Spam Comments”主页下载软件并查看更多信息。

本文共有 19 条评论Yskin's Kill Spam Comments——直接删除匹配黑名单的评论


  1. 1 conpeo

    “所以要用三个等号===进行判断才准确。”

    真的?php 编程有用三个等号?

  2. 2 yskin

    可以参考PHP文档-比较运算符。3个等号叫做全等运算符,在两边值一样而且类型也一样时才返回true。

  3. 3 小马

    Akismet能解决99%以上的问题。黑名单还要自己加,比较麻烦。

    1. 4 yskin

      强烈同意!黑名单只有加两个就能解决95%的垃圾评论,Akismet在每次有人发评论时都要连接Akismet服务器进行检测,但是不用人工做处理,反而是最不麻烦的。

      你,真的不担心连接服务器过程中出错或超时导致评论发不出来吗?

  4. 5 Wady

    今天我做类似修改的时候也想到要 hook 到 pre_comment_approved 那,但没多少时间做,所以写了几种方法不行就暂时放弃了。改天时间多点的时候再修改了。

  5. 6 Wady

    咯咯……以前我用 LBS 博客程序的时候就是通过屏蔽 [url= 和 href 来达到屏蔽广告的目的。因为直接贴网址,在最终输出时会自动转换成连接,只有广告评论才会用到 [url= 和 href 。再加上屏蔽一切无中文的评论内容,基本上除非被恶意攻击不然就天下清净了。这个方法也给我用在WP 上和你想到一块去了,呵呵。

    垃圾引用都是通过搜索引擎查找页面上的引用地址或者套用程序的引用地址格式进行机器批量发送的,所以我在地址上增加一个key值,每成功被引用依次KEY就随机更换成新的数字串。另外引用地址输出也改成了JS输出,需要点击才能显示出来。 WP 的引用地址也有固定格式,不知道以后会不会成为垃圾源,到时候在说了。

    1. 7 yskin

      嗯,WordPress也是URL自动转成链接。

      另外,你的Blog里屏蔽不含中文评论的代码好像是抄了WordPress论坛里alonefly的吧,有很大的问题啊。给你发了email了,快去收邮件去。

      SK2有个什么JavaScript载荷的功能,好像也是在输出评论对话框时输出一个变量,发表评论时检查这个变量。

      P.S. 上一个评论不是对你说的。我刚到数据库里改了一下,让它乖乖地躺在要回复的评论的下面,嘿嘿。

  6. 8 Wady

    WordPress 是保存是自动转成连接,最终输出的时候会有 href 。所以无法用 href 做关键字屏蔽。我说的 LBS 是在输出到页面上时才转换成的连接,保存的内容还是个普通的地址字串,呵呵。

    另外你搞混了一点,我就是论坛的 alonefly。那是我以前用 LBS 的称谓。后来找了个老婆不再 alone fly 了才改的名。论坛上我有写昵称是 Wady 的。

    关于这个正则,起先在网上找到的时候后面的回复有说这个不是UTF8编码的中文。但我自己测试貌似又成了……可能是其他原因造成的,所以我犀利糊涂的就用这个了。甚至后来在老婆的博客上这样写测试不成功改成了 ereg() 那段我都没想起这个事来。毕竟还是学平面的,编程是个爱好而已,不精啊。

  7. 9 Wady

    LBS程序算是我的入门博客甚至我也是通过研究这个程序的编写来学懂 ASP 的,接着因为工作问题要学 PHP 所以也准备利用 wordpress 学学。从我刚到 wordpress 中文论坛的时候就看到你那段对 ASP,对国内博客程序,对 IE用户的言论,所以有些不爽,并进行了跟贴反驳,不过忘了最后结果怎么样了,总之自己一直有些不太服气。嘿嘿……

    PHP 的学习一直不够顺利,以前做的ASP博客的插件经常要招些人来问这问哪,分心不少。国内也好难买到相关的书,最少贵阳大小书店都有去过根本没见着,全是 asp、.net、JSP、JAVA之流。缺少系统的学习所以现在对 PHP 的了解很零碎,仅仅因为 ASP 那的一些基础会点语法而已,然后通过PHP手册查查函数,太多,头晕。

  8. 10 yskin

    ...我也是,缺少对PHP系统的学习啊。

    我觉得学东西还是不要看国内的书比较好,国内的书大多讲的很浅。还是PHP手册好一些。平常有不懂的,写一些试验程序测试一下就知道了。调试的时候用var_dump(),也很不错呀。

  9. 11 小马

    我对Akismet的机理不懂。难道Akismet服务器连接不上会导致留言消失?
    我想不应该丢失,应该还会在后台呆着,等着我手工审核,呵呵。
    如果这样的话,根本不用担心什么。
    Akismet非常棒,到现在为止我的Blog上还没出现过Spam,感觉非常好。

  10. 12 yskin

    。。。你可真会自我安慰。

    可是我看了Akismet的源代码,难道我看错了?Akismet在"preprocess_comment"那儿hook,并且连接服务器,这时连评论的内容还没有被处理呢。

    当然,反spam嘛,自己用得开心就好。不过,如果一个人发了评论,他发完了就闪人了,如果评论没出来,也许他会认为是管理员开了评论审核。而你管理员这边,看不到评论,也就不知道有评论丢失。所以,如果没有收到访客通过别的途径,比如email,发来抱怨的话,恐怕你是不可能知道丢了评论的。

  11. 13 interjc

    还是sk2好,我就喜欢强大的东西

  12. 14 tcitc081

    请教一下trackback的spam ,yskin大哥是怎么防范的?

  13. 15 yskin

    就用文章所说的插件咯,检测到不含中文的Trackback,直接清除掉不再写入数据库。

  14. 16 choocksal

    I’d prefer reading in my native language, because my knowledge of your languange is no so well. But it was interesting! Look for some my links:

  15. 17 Hosting

    3个等号叫做全等运算符,在两边值一样而且类型也一样时才返回true。

  1. 1 CODE|源码 » WordPress antispam
    Pingback2007-2-13 12:49 下午
  2. 2 TCITC_BLOG
    Trackback2007-3-8 2:35 下午

请留下您的评论: