美文网首页
阿里云淘宝拖动验证码高仿

阿里云淘宝拖动验证码高仿

作者: Bill_Wang | 来源:发表于2016-08-14 14:46 被阅读2834次

效果图

淘宝或者阿里云上经常能看到鼠标拖动的验证码出现


阿里云验证码

一直想自己实现,今天整理了下网上资料,找到了QapTcha这个插件,或者说一个模板。今天就用他来实现一个简单的拖动验证码。

废话不多说,上代码:

工程结构

主页面(核心代码)

...

    <body>
        <div class="container">
            <h1>高仿淘宝拖动验证码</h1>
            <form method="post" action="#">
                <fieldset>
         

                    <div id="QapTcha" class="QapTcha"></div>
                    
                    <input type="submit" name="submit" value="提交表单" />
                </fieldset>
            </form>
        </div>
        
...
  
        <script type="text/javascript">
            $(document).ready(function () {
                $('.QapTcha').QapTcha({ disabledSubmit: true,autoSubmit:false, autoRevert: true, txtLock: "请按住滑块,拖动到最右侧", txtUnlock: '验证通过', PHPfile: 'QapTcha.jquery.php' });
            });
        </script>

    </body>
</html>

Qaptcha脚本

jQuery.QapTcha = {
    build: function(options) {
        var defaults = {
            txtLock: '已上锁 :表单不能提交,请拖动上方箭头到最右侧解锁',//未解锁文字
            txtUnlock: '已解锁锁 : 表单能提交',//解锁成功文字
            disabledSubmit: true,//未解锁提交按钮无效
            autoRevert: true,//是否自动回弹
            PHPfile: 'php/Qaptcha.jquery.php',//验证服务器
            autoSubmit: false//是否自动提交
        };
        if (this.length > 0) return jQuery(this).each(function(i) {
            var opts = $.extend(defaults, options),
                t = $(this),
                form = $('form').has(t),
                Clr = jQuery('<div>', {
                    'class': 'clr'
                }),
                bgSlider = jQuery('<div>', {
                    'class': 'bgSlider'
                }),
                bgMasks = jQuery('<div>', {
                    'class': 'bgMasks'
                }),
                Slider = jQuery('<div>', {
                    'class': 'Slider'
                }),
                Icons = jQuery('<div>', {
                    id: 'Icons'
                }),
                TxtStatus = jQuery('<div>', {
                    'class': ' TxtStatus dropError TxtStatusFont',
                    text: opts.txtLock
                });
         
            if (opts.disabledSubmit) form.find('input[type=\'submit\']').attr('disabled', 'disabled');
            //美化拖动验证,模仿淘宝
            bgSlider.appendTo(t);//添加验证背景
            Icons.insertAfter(bgSlider);
            Clr.insertAfter(Icons);
            Slider.appendTo(bgSlider);//添加滑块
            bgMasks.appendTo(bgSlider);//添加上层遮罩
            TxtStatus.appendTo(bgSlider);//添加文字
            t.show();

            Slider.draggable({//滑块添加滑动
                drag: function(event, ui) {//拖动回调
                    $(bgMasks).width(bgSlider.width() - ui.position.left)
                },
                revert: function(event, ui) {//验证回弹
                    if (opts.autoRevert) {
                        if (parseInt(Slider.css("left")) > (bgSlider.width() - Slider.width() - 3)) return false;
                        else return true
                    }
                },
                revertDuration: 15,
                containment: bgSlider,
                axis: 'x',//横向
                stop: function(event, ui) {//推动结束回调
                    if (ui.position.left > (bgSlider.width() - Slider.width() - 3)) {
                        $.ajax({//拖动到头给服务器发消息
                            type: "post",
                            async: "async",
                            data: {
                                action: 'qaptcha',
                            },
                            url: opts.PHPfile,
                            dataType: "json",
                            success: function(data) {
                                if (!data.error) {
                                    Slider.draggable('disable').css('cursor', 'default');
                                    TxtStatus.text(opts.txtUnlock).addClass('dropSuccess').removeClass('dropError');
                                    Slider.addClass('SliderSuccess');
                                    Icons.css('background-position', '-16px 0');
                                    form.find('input[type=\'submit\']').removeAttr('disabled');//提交按钮可用
                                    if (opts.autoSubmit) form.find('input[type=\'submit\']').trigger('click');
                                } else {
                                    alert(data.error);
                                    refurbishValidate(t);
                                }
                            },
                            beforeSend: function() {//提交前设置加载图标
                                var htmLoading = '<span>加载中...</span><div class="loader"><div class="ball-spin-fade-loader"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div></div>';
                                TxtStatus.html(htmLoading).addClass('dropSuccess').removeClass('dropError')
                            },
                            complete: function(XMLHttpRequest, textStatus) {
                                isAjaxing = false;
                                $("#btn_loading").css('display', 'none')
                            },
                            error: function(e) {
                                alert('验证失败');
                                refurbishValidate(t);
                            }
                        });
                    } else {
                        while (bgMasks.width() <= bgSlider.width()) {
                            $(bgMasks).width(bgMasks.width() + Slider.width())
                        }
                        $(bgMasks).width(bgMasks.width() - Slider.width())
                    }
                }
            });
        })
    }
};
jQuery.fn.QapTcha = jQuery.QapTcha.build;

function refurbishValidate(ctrl) {//重置表单
    ctrl.html("");
    ctrl.QapTcha({
        disabledSubmit: true,
        autoSubmit: false,
        autoRevert: true,
        txtLock: "请按住滑块,拖动到最右侧",
        txtUnlock: '验证通过',
        PHPfile: 'Qaptcha.jquery.php'
    })
}

//服务端验证

<?php
session_start();


$aResponse['error'] = false;
    
if(isset($_POST['action']))
{
    if(htmlentities($_POST['action'], ENT_QUOTES, 'UTF-8') == 'qaptcha')#确认是qaptcha发送的action
    {

        //这里可以进一步对参数分析以验证正确性
        echo json_encode($aResponse);
    }
    else
    {
        $aResponse['error'] = true;
        echo json_encode($aResponse);
    }
}
else
{
    $aResponse['error'] = true;
    echo json_encode($aResponse);
}

源码仓库
效果预览

只是对模板的一个简单应用,后台并没有做复杂验证,阿里云的验证要比这个复杂的多,后天可以大致判断是否是人操作。
这里没有加这类判断,只加了滚动,有兴趣的朋友可以自己加入自己的验证逻辑!

相关文章

  • 阿里云淘宝拖动验证码高仿

    淘宝或者阿里云上经常能看到鼠标拖动的验证码出现 一直想自己实现,今天整理了下网上资料,找到了QapTcha这个插件...

  • ios demo别人整理的

    常用的demo,包括获取验证码、AVPlayer、AFNetworking、Masnory、高仿微信、高仿网易、K...

  • iOS demo汇集

    常用的demo,包括获取验证码、AVPlayer、AFNetworking、Masnory、高仿微信、高仿网易、K...

  • 阿里小程序云应用上线了,有哪些看点?

    3月21日,在2019阿里云峰会·北京上,阿里巴巴旗下的阿里云、支付宝、淘宝、钉钉、高德等联合发布“阿里巴巴小程序...

  • 阿里小程序云应用上线了,有哪些看点?

    3月21日,在2019阿里云峰会·北京上,阿里巴巴旗下的阿里云、支付宝、淘宝、钉钉、高德等联合发布“阿里巴巴小程序...

  • “阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和10

    3月21日,在2019阿里云峰会·北京站上,阿里巴巴旗下的阿里云、支付宝、淘宝、钉钉、高德等联合发布“阿里巴巴小程...

  • 高仿Instagram拖动条

    之前做项目的时候,有个图片编辑页面,用到拖动条添加编辑效果。老板很喜欢Instagram那种拖动条的效果,0点从中...

  • 如何保证游戏线路的稳定性

    1 问题由来 之前第一款游戏上线不久,就接到DDOS攻击的勒索邮件。于是上了阿里云高仿。现在第三款游戏也接入了高仿...

  • Python爬虫杂记-操控鼠标

    头一段时间做了某网站的滑动验证码, 用的是阿里的滑动验证码。用自动化模拟滑块的拖动, 然而尝试了多种方法, 仍没能...

  • 阿里云验证码发送

    实现阿里云的短信验证码服务实现的功能 1.开通阿里云短信服务 添加签名和模板 下面写代码来实现短信验证码的发送 c...

网友评论

      本文标题:阿里云淘宝拖动验证码高仿

      本文链接:https://www.haomeiwen.com/subject/azmysttx.html