起因
最近老是被一些垃圾评论弄得火冒三丈,虽说已经设置了评论必须经过审核之后才会显示,但每次进入后台有成堆的垃圾评论,看着就心烦,于是就想用什么方法杜绝这些可恶的垃圾评论。首先想到的是禁止 IP 访问,在网上搜索一番后没有理想的解决方法,于是退而求其次利用验证码来抵挡垃圾!找了好多,有插件的,有直接代码的,有图片验证有滑动验证...... 五花八门的都有,最后选择的是——算术验证。至于选择算术验证的原因是:提高小学生的算术能力,哈哈!好啦废话不多说,老规矩,好东西就是要分享,我从不生产代码,我只是代码的搬运工
食用方法
打开 functions.php 文件,在文件最后面添加下面的代码:
// 算术验证评论
function themeInit($comment){$comment = spam_protection_pre($comment);
}
function spam_protection_math(){$num1=rand(1,50);
$num2=rand(1,50);
echo "<label for=\"math\" style=\"margin-top: 18px;float:left;width=350px;
\"> 请输入 <code>$num1</code>+<code>$num2</code> 的计算结果:</label>\n";
echo "<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\" style=\"height: 26px;width:50px;margin-top: 18px;margin-right: 14px;
\" placeholder=\"?\">\n";
echo "<input type=\"hidden\" name=\"num1\" value=\"$num1\">\n";
echo "<input type=\"hidden\" name=\"num2\" value=\"$num2\">";
}
function spam_protection_pre($comment, $post, $result){$sum=$_POST['sum'];
switch($sum){case $_POST['num1']+$_POST['num2']:
break;
case null:
throw new Typecho_Widget_Exception(_t('对不起: 请输入验证码。<a href="javascript:history.back(-1)"> 返回上一页 </a>','评论失败'));
break;
default:
throw new Typecho_Widget_Exception(_t('对不起: 验证码错误,请 <a href="javascript:history.back(-1)"> 返回 </a> 重试。','评论失败'));
}
return $comment;
}
保存好 functions.php 文件之后,再打开 comments.php 文件(如果主题自带评论文件的话就在 comments.php 添加),在
<button type="submit" class="submit" id="misubmit"> 发布 </button>
前面添加以下代码(当然也可以在自己喜欢的任意地方添加都可以)
<?php spam_protection_math();?>
修改样式
<label style=\"line-height:30px;\" for=\"math\"><code>$num1</code>+<code>$num2</code> =
</label>\n";
echo "<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\"
style=\"width:130px;float:right;\" placeholder=\" 计算结果:\">\n";
可以通过修改以上代码来简单的修改样式,其中 line-height:30px
是上下间距,size=\"25\"
是字体大小,width:130px
是边框的宽度,float:right;
是边框的位置,可以设置为 right(右)、left(左)、none(默认)等。
补充说明
之后我将 PHP 版本从 5.6 换成了 7.2 导致算术代码失效,所以又换了另一种代码。如下
/* 评论 算术验证码 */
function themeInit($comment){if ($comment->is('single')) {$comment = spam_protection_pre($comment);
}
}
function spam_protection_math(){$num1=rand(0,9);
$num2=rand(0,9);
echo "<label style=\"line-height:30px;\" for=\"math\"><code>$num1</code>+<code>$num2</code></label>\n";
echo "<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\" style=\"width:60px;float:left;\" placeholder=\" 计算结果:\">\n";
echo "<input type=\"hidden\" name=\"num1\" value=\"$num1\">\n";
echo "<input type=\"hidden\" name=\"num2\" value=\"$num2\">";
}
function spam_protection_pre($commentdata){$sum=$_POST['sum'];
switch($sum){case $_POST['num1']+$_POST['num2']:
break;
case null:
throw new Typecho_Widget_Exception(_t('有一道数学题还在等着你,往哪跑?<a href="javascript:history.back(-1)"> 回去算题 </a>✍','评论失败'));
break;
default:
throw new Typecho_Widget_Exception(_t('再给你一次按计算器的机会!<a href="javascript:history.back(-1)"> 重新计算 </a>','评论失败'));
}
return $commentdata;
}
原文出处
以上代码部分原文出自于:JDEAL
假如这是一条垃圾评论
试试看 2021-10-10