给文章评论增加验证码

· 2022-09-13
点点滴滴 程序设计 网站建设

换了这个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>

也就是把数字验证框的代码放到评论区的上方即可。

  • 本文作者:管理员
  • 本文链接:https://sirit.com.cn/archives/462/
  • 版权许可:知识共享署名-相同方式共享4.0国际许可协议
  • 友情提示:本文更新于2022年10月04日,已超过948天没有更新,若内容或图片失效,请留言反馈。
  • 《高分必败》锻炼记忆力的扑克游戏
  • 加了验证码,居然还有垃圾评论

仅有 1 条评论
  1. 叶开

    确实不错,简洁验证码 哈哈。

    不是验证码接口 也不是看不清的英文 哈哈 Makr!

    叶开 September 13th, 2022 at 02:17 pm回复
取消回复

说点什么?
Title
修改 functions.php 文件
修改 comments.php 文件
最终效果:
最新修改1004

本站已经运行0天 © 2005- 大嘴狗狗. - Typecho & Moricolor - 粤ICP备18101800号 - 粤公网安备44030402005553号