首页 > 工具技巧 > 让博客不用Anti-Spam插件一样没有垃圾评论

让博客不用Anti-Spam插件一样没有垃圾评论

工具技巧 , ,

写博客的人最讨厌的就是垃圾评论了。以前开博才不到半年没有装反垃圾评论插件的时候,平均一天会收到5条左右的垃圾评论,而且一看显然是机器人提交的,后来不得不找插件防着。现在网络上最常见的反垃圾评论插件就是加验证码了。让用户每次发表评论的时候都输入验证码。稍微用户体验好点的就只在用户第一次评论的时候才需要验证码,以后就不需要了。但这种方式很容易和那些缓存插件冲突,而且让用户多输入一个验证码感觉也挺无奈的。

后来我就用了WP-SpamFree插件。据说这插件是利用Cookie和Javascript互相配合来实现防范垃圾评论的,细节我没有去深究,不是很清楚。之前观察过一阵子他记录的调试日志,确实是能够100%的拦截垃圾评论,没有误报。

但前阵子这个插件突然大罢工了,随便怎么评论都说我的留言有问题,通不过。经过一番瞎折腾之后,发现又无缘无故好了。但是我对这插件开始有了不信任感~

我后来就在想,与其用别人现成的插件来实现反垃圾评论,为什么不自己实现一个简单易用,而又适合自己实际情况的反垃圾评论机制呢?

我对评论机器人软件不是很熟悉,猜想大概他们会维护一个庞大的博客列表,然后定时去爬取上面的网页,分析页面,找到上面的评论表单——可能是有特征识别,也可能不管三七二十一找到表单就算,然后填写其中的各个字段,最后提交表单。所以如果我把评论表单的提交地址给删了,那么评论机器人找不到提交地址或者找到错误的提交地址,就无法成功提交评论了。那真正的用户如何评论呢?我可以在表单加载完之后立刻通过Javascript动态更新评论表单的提交地址就行了

代码修改非常简单,打开主题文件夹中,找到评论表单所在的模板文件,一般是在comments.php中。

<form action="/wp-comments-post.php" method="post" id="commentform">
...
</form>

这是未修改之前的代码。将其action属性的值改为空字符串。然后在结束标签下面添加一行Javascript。如下所示:

<form action="" method="post" id="commentform">
...
</form>
<script type="text/javascript">
    document.getElementById("commentform").action = "/wp-comments-post.php";
</script>

OK,这样代码重构完之后就和原来的一样了。

但是这样带来的问题就是,如果对方浏览器禁用了Javascript,那么他也无法评论了。对于我来说,这个比例基本可以忽略。当然,这个方法并不是万金油,不能抵挡所有垃圾评论。毕竟我没有广泛研究过评论机器人的工作原理,有可能人家就是使用自动化脚本模拟用户打开浏览器,输入网址然后填写评论,这也说不准。但是经过半个多月的试验,这个方法还算是比较靠谱的。至今没有见过一条机器人评论。有兴趣的朋友也可以试试。

——Kevin Yang

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. w.vela
    | #1

    这样在js里裸着操作DOM有一定危险。比如ie下有时候会出现『该页无法显示』的弹窗,就是这样在DOM没加载完时就试图操作DOM的后果(当然只改一个属性其实还好,只要没对DOM做手术,有时候也会因情况复杂而侥幸逃过一劫)。
    所以好的习惯应该是,只要涉及到DOM的,都放到onload事件里,省的有时候就搞出很难检查的莫名其妙bug,这样的缺点也明显,如果有图没加载下来就挺难过的。不过也可以自己包装一下onload方法,比如jQuery的domready之类的哈:)

    • Kevin Yang
      | #2

      恩,之前我也遇到过在body未加载完的时候就调用document.body.appendChild结果IE下报错。所以后来包到onload函数中执行。但是onload的最大缺点是需要等待所有资源包括图片加载完毕之后才触发(Chrome的实现忽略了图片的加载,这是比较糟糕的)。不过仅仅是修改dom属性应该不会有什么关系,而且我还是在标签闭合之后才修改的,应该是安全的。
      我看了jQuery的实现,是用了DomContentLoaded事件,我以前以为这个事件是和onload等价的,后来才知道这个事件是专门为了解决onload的缺点而规定的。可惜兼容性问题不好弄。

  2. | #3

    不错,学习了

  1. 暂时没有trackbacks.