首页 » 建站手册 » Typecho纯代码给你的评论添加算术验证

Typecho纯代码给你的评论添加算术验证

谷歌已收录,更新于2018年12月27日; 如遇到问题,请留言及时通知站长; 欢迎加入 三生三世,讨论各种问题!

说明

很多人都有被全英文类似评论的经历,站长最讨厌这类情况。以往,我们都通过插件反垃圾评论;或者极验证啥的,用户验证比较麻烦,比如手机端这类的。站长这里提供一种100以内加法验证,合理有效防止机器垃圾评论。具体实现原理,访客进入页面,php函数首先生成两个随机数,然后把你给的答案比对。如果没填写验证码,反馈无验证码;如果验证码错误,反馈验证码错误。所以,大致上,一个函数实现随机数生成以及前台表单生成,一个函数用于验证,另一个函数用于反馈给评论结果。

function.php

请打开主题function.php文件,在第二行或者最后一行等合理为止插入如下代码

//算术验证评论
function themeInit($comment){
$comment = spam_protection_pre($comment);
}
function spam_protection_math(){
    $num1=rand(1,49);
    $num2=rand(1,49);
    echo "<label 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:218px\" 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;
}

comments.php

然后打开主题comments.php文件,在适当为止插入如下代码,一般插入在提交评论按钮前;当然访客提交评论跟登录用户提交评论一共有两个地方,站长选择在访客评论提交按钮前插入如下代码。这样,访客评论需要算术验证,站长就不用验证了!

<?php spam_protection_math();?>

Typecho纯代码给你的评论添加算术验证

css相关

关于css部分,由于每个人主题不一样,这里就无法给出统一css代码了。可以自行F12,通过float:left或者float:right调整布局,关于宽度之类的,请直接在function.php文件中插入的算术验证代码中修改,代码中给了示例style="width:218px"

结果展示

站长只给访客做了算术验证处理,这样方便回复你们,省了计算过程!如果你们觉得100以内太难了,请修复function.php中添加的代码中rand后面的数字范围。

Typecho纯代码给你的评论添加算术验证

一个只会魔改主题,而不会制作主题的站长,专业扒各种网站的各种样式。希望每一位来到这里的访客,都能拿到你们需要的资源!

发表评论

已有 42 条评论

  1. Eltrac Eltrac说道:

    Mark! 下次水主题的时候就把这玩意加上。

    1. 枂下 枂下说道:

      emmm,我在数据恢复那篇文章里,有重写过这个。这篇有那么一丢丢错误。

  2. Quanyin Quanyin说道:

    很不错的验证方式,已经用上了
    不过并没有防住垃圾评论?看到你这篇文章依然有许多垃圾评论?

    PS:更换了域名,烦请大佬更换下友链地址,原来为quanyin.xyz,现在域名为 imtqy.com,烦请把网站链接更改为 https://www.imtqy.com,多谢

  3. ubaeusebohh ubaeusebohh说道:

    http://theprettyguineapig.com/amoxicillin/ - Amoxil Amoxicillin 500mg Capsules lye.pmto.black1ce.com.yat.pz http://theprettyguineapig.com/amoxicillin/

  4. 1123qwsq 1123qwsq说道:

    回家啊无穷的完全失去我

  5. yhsiao yhsiao说道:

    博主,我跟你使用的是同一款主题,添加了你的代码之后报错,能否给个详细说明,详细。

    1. 枂下 枂下说道:

      这个主题function里定义了 themeInit,所以你需要合并。你可以看下本页面评论区,里面有详细方法。

      1. yhsiao yhsiao说道:

        这一行 $comment = spam_protection_pre($comment); 合并进去,剩下的代码放到function的最后吗?我这样操作了报错。

        1. 枂下 枂下说道:

          慢慢看教程摸索吧。

          1. yhsiao yhsiao说道:

            能否把你的comments文件发我参考一下,谢谢。

        2. 枂下 枂下说道:

          $comment = spam_protection_pre($comment, $post, $result);
          用上面这个,有些主题要三个参数的

          1. yhsiao yhsiao说道:

            function改好了,comments怎么修改才能达到你网站的效果呢,谢谢。

  6. 青鱼 青鱼说道:

    不判断是否填写答案

    1. 枂下 枂下说道:

      好像是不行啦,大概是更新了主题忘记改了

    2. 枂下 枂下说道:

      判断啦

      1. 青鱼 青鱼说道:

        你的邮件连垃圾箱都不进,直接被屏蔽!

        1. 枂下 枂下说道:

          国外的

        2. 枂下 枂下说道:

          垃圾箱都不进的吗,我这里倒是可以收到

          1. 青鱼 青鱼说道:

            刚看到,一封进垃圾箱,一封被屏蔽!哪里的主机,比我的崩溃还严重!

  7. Jdeal Jdeal说道:

    Fatal error: Cannot redeclare themeInit() 提示这个额

    1. 枂下 枂下说道:

      打赏方式在文末,有支付宝跟微信

      1. Jdeal Jdeal说道:

        好的,小红包,不成敬意

    2. 枂下 枂下说道:

      我用的别人的框架,轻量化。如果你的与pjax冲突,可以这样,下面的重载fancybox,你去网上查查吧。

      $(document).on('pjax:complete', function() { 重载fancybox函数 });

    3. 枂下 枂下说道:

      先搜索下你的function.php,看看是不是已经定义了themeInit

      1. Jdeal Jdeal说道:

        额,是的,求解决方法额

        1. 枂下 枂下说道:

          $comment = spam_protection_pre($comment, $post, $result);
          对啦,个别主题需要用这个。如果还报错,就改成这个

          1. Jdeal Jdeal说道:

            博主大大怎么没有打赏界面额,还想发个小红包呢,还有博主大大,你的文章点击图片出现的暗箱效果,是用的fancybox吗,我网站用的fancybox,但是全站开启的pajx,必须要刷新一遍网页才可以使用,不然只能关闭PAJX,有什么方法可以同时开启pajx,并且能使用图片弹窗么

          2. Jdeal Jdeal说道:

            果然报错了,哈哈,改成这个可以使用了,谢谢博主大大

        2. 枂下 枂下说道:

          function themeInit($archive){
          Helper::options()->commentsMaxNestingLevels = 999;
          if ($archive->is('archive')) {
          $archive->parameter->pageSize = 12;
          }
          $comment = spam_protection_pre($comment);
          }

        3. 枂下 枂下说道:

          把我这的themeInit里的内容,合并到你那里
          function themeInit($comment){
          你主题自带的内容
          $comment = spam_protection_pre($comment);
          }

          1. Jdeal Jdeal说道:

            博主,我原来的functions文件里自定义的是
            function themeInit($archive){
            Helper::options()->commentsMaxNestingLevels = 999;
            if ($archive->is('archive')) {
            $archive->parameter->pageSize = 12;
            }
            }
            ,现在是直接
            function themeInit($comment){
            Helper::options()->commentsMaxNestingLevels = 999;
            if ($archive->is('archive')) {
            $archive->parameter->pageSize = 12;
            }
            $comment = spam_protection_pre($comment);
            }
            这样吗,因为一开始$archive,现在变成了$comment没问题吗,谢谢

  8. Jdeal Jdeal说道:

    博主大大,添加到functions之后保存时报错额

  9. 阿凯哟 阿凯哟说道:

    厉害啊。。。

    1. 枂下 枂下说道:

      RAW主题现在已经有这功能了

  10. ohmyga ohmyga说道:

    dalao牛逼!

    1. 枂下 枂下说道:

      我现在一看都邮件是这篇文章的评论,就以为是广告

最近动态查看

    利用短代码实现了文章正文任意位置插入[googleads],前端自动变为谷歌广告。这样,文章过长时,可以随意插入广告了。
返回主页看更多
赏杯咖啡给站长 支付宝 扫一扫