首页 » 建站手册 » 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纯代码给你的评论添加算术验证

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

发表评论

已有 40 条评论

  1. Quanyin Quanyin说道:

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

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

  2. ubaeusebohh ubaeusebohh说道:

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

  3. 1123qwsq 1123qwsq说道:

    回家啊无穷的完全失去我

  4. 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怎么修改才能达到你网站的效果呢,谢谢。

  5. 青鱼 青鱼说道:

    不判断是否填写答案

    1. 枂下 枂下说道:

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

    2. 枂下 枂下说道:

      判断啦

      1. 青鱼 青鱼说道:

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

        1. 枂下 枂下说道:

          国外的

        2. 枂下 枂下说道:

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

          1. 青鱼 青鱼说道:

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

  6. 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没问题吗,谢谢

  7. Jdeal Jdeal说道:

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

  8. 阿凯哟 阿凯哟说道:

    厉害啊。。。

    1. 枂下 枂下说道:

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

  9. ohmyga ohmyga说道:

    dalao牛逼!

    1. 枂下 枂下说道:

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

  10. Ellshedge Ellshedge说道:

    Zithromax At Publix Propecia O Rogaine Cialis Red Bull viagra Zithromax Sharp Stomach Pain Comment Se Procurer Du Cytotec Canadian Pharmacies Retin A Where To Order Legally Progesterone Website Cod Accepted cialis 5mg best price Viagra From Canida Ou Acheter Du Cialis En Belgique Acheter Cialis Discount France Cialis Vendita Acquistare Cialis Qualityrx Supplier Is Cephalexin A Quinolone Antibiotic viagra prescription Order Propecia Discount Keflex Dose Wound Infection

    1. 枂下 枂下说道:

      Is this an advertisement?
      You can insert advertisements on the website.
      One hundred dollars a month will do.
      In this way, my visitors will see your website.

返回主页看更多
赏杯咖啡给站长 支付宝 扫一扫