给文章评论增加验证码
换了这个Moricolor
主题之后,收到许多垃圾评论,都是全英文的,发的都是链接图片之类的东西,因为我开启了评论审核,所以一进后台就看到一大堆的垃圾评论。手动删除了几次,心想这也不是办法,总得解决一下,网上的解决办法,大致有几类:
- 使用 Typecho 插件:有点麻烦,需要额外安装插件;
- 增加汉字验证:提交时判断输入内容是否有汉字,一刀切,有点武断;
- 是否中文浏览器:要是全英文的办公环境,还得来回切换浏览器的设置;
- 增加验证码:在评论区增加验证码。
选择了“增加验证码”,常见的就是增加一道口算题,如下图所示:
代码参考文章:Typecho纯代码算术验证码加强版
我根据他的代码,结合网站主题进行了部分修改(顺便说一句,Typecho后台可以直接改主题代码,真方便):
修改 functions.php 文件
第一步:找到 function themeInit() 代码处:
在该函数的最后增加一行代码:
$comment = spam_protection_pre($comment, $post, $result);
第二步:来到 functions.php 文件末尾:
增加下面两个函数的代码:
function spam_protection_math() {
$num1 = rand(1, 15);
$num2 = rand(1, 15);
echo "<input type=\"text\" name=\"sum\" value=\"\" id=\"sum\" tabindex=\"4\" style=\"flex:1\" class=\"form-control input-sm flat\" placeholder=\" $num1 + $num2 = ? \">\n";
echo "<input type=\"hidden\" name=\"num1\" value=\"$num1\">";
echo "<input type=\"hidden\" name=\"num2\" value=\"$num2\">";
}
function spam_protection_pre($comment, $post, $result) {
if ($_REQUEST['text'] != null) {
If($_POST['num1'] == null || $_POST['num2'] == null) {
throw new Typecho_Widget_Exception(_t('验证码异常.', '评论失败'));
} else {
$sum = $_POST['sum'];
switch ($sum) {
case $_POST['num1'] + $_POST['num2'] : break;
case null:
throw new Typecho_Widget_Exception(_t('请输入计算结果...', '评论失败'));
break;
default:
throw new Typecho_Widget_Exception(_t('计算错误,请重新输入计算结果.', '评论失败'));
}
}
}
return $comment;
}
上图中的绿色粗线是我修改过后的代码,一个是用 placeholder 把提示文字放到 input 框里面;另一个是修改 class,让它与我的网站主题保持一致。
修改 comments.php 文件
在 comments.php 文件中,找到 input 输入框的位置:
在最后一个 input 后面,输入下面的代码,如下图所示:
<?php spam_protection_math();?>
最终效果:
最新修改1004
经过使用才发现,数字验证框没放对位置,登录之后导致看不到验证框,修改的代码如下:
<div class="tbox">
<?php spam_protection_math();?>
<textarea rows="3" name="text" id="textarea" class="form-control flat" onkeydown="if(event.ctrlKey&&event.keyCode==13){document.getElementById('csubmit').click();return false};" placeholder="写下您对此的评论吧~" required><?php $this->remember('text', false); ?></textarea>
</div>
也就是把数字验证框的代码放到评论区的上方即可。
确实不错,简洁验证码 哈哈。
不是验证码接口 也不是看不清的英文 哈哈 Makr!