Django中使用极验Geetest滑动验证码过程解析

下面是“Django中使用极验Geetest滑动验证码过程解析”的完整攻略。

什么是极验Geetest滑动验证码

极验Geetest滑动验证码是一种可以保障网站安全性的验证机制。通过综合分析用户行为特征,实现对机器人和人机协作攻击的防御。

Django中使用极验Geetest滑动验证码的步骤

1. 获取验证码

使用极验Geetest需要先到极验官网注册账号,创建后可以获得一个极验ID和一个极验KEY。之后,将极验ID和极验KEY填写到网站后端代码中,以便使用Geetest API。

在Django中,可以通过如下代码来获取验证码。

# 导入Geetest的Python SDK
from geetest import GeetestLib

# 极验ID和KEY,可以在官网申请
captcha_id = 'YOUR_CAPTCHA_ID'
private_key = 'YOUR_PRIVATE_KEY'

# 初始化GeetestLib实例
gt_lib = GeetestLib(captcha_id, private_key)

# 获取Captcha所需的参数
status, challenge = gt_lib.pre_process(client_ip)

# 返回响应给前端
response_data = {'success': status, 'challenge': challenge}
return JsonResponse(response_data)

2. 校验验证码

获取到验证码后,接下来需要在前端渲染并验证。例如,在登录页面添加滑动验证码。

{% extends 'base.html' %}

{% block content %}
<div class="geetest" data-gt="{{challenge}}" data-success="onGeetestSuccess"></div>
<span id="geetest_tips" class="text-danger"></span>
{% endblock %}

{% block js %}
<!-- 引入Geetest前端文件 -->
<script src="https://static.geetest.com/static/tools/gt.js"></script>
<script>
    var handler = function (captchaObj) {
        // 将获取到的验证码渲染到对应的元素中
        captchaObj.appendTo('.geetest');
        captchaObj.onReady(function () {
            // 获取到验证码后,放开表单的提交按钮
            $("#submit-btn").removeAttr('disabled');
        });
        captchaObj.onSuccess(function () {
            // 校验成功后,执行此方法设置提示信息
            $("#geetest_tips").text("");
        });
        captchaObj.onError(function () {
            // 校验失败后,执行此方法设置提示信息
            $("#geetest_tips").text("请正确拼合验证码");
        });
        // 在点击提交按钮时,执行此方法校验验证码
        $('#login-form').submit(function () {
            captchaObj.verify();
            return false;
        });
    };
    // 在DOM加载完成后,执行此方法初始化Geetest
    $(document).ready(function () {
        var params = {
            gt: '{{challenge}}',
            challenge: '{{geetest_challenge}}',
            product: 'popup',
            offline: !{{success}}
        };
        initGeetest({
            // 请将isProd设置为True时,切换为正式接口
            isProd: false,
            // 以下为极验官方提供的公共接口,不得修改
            gt: params.gt,
            challenge: params.challenge,
            offline: params.offline,
            new_captcha: true,
            product: params.product,
            width: "300px"
        }, handler);
    });
</script>
{% endblock %}

前端与后端的校验交互主要借助了Geetest提供的API。在Django的后端代码中,需要接收前端传回来的滑动结果,并进行校验。

# 接收前端传来的滑动结果
geetest_challenge = request.POST['geetest_challenge']
geetest_validate = request.POST['geetest_validate']
geetest_seccode = request.POST['geetest_seccode']

# 验证滑动结果
success = gt_lib.success_validate(geetest_challenge, geetest_validate, geetest_seccode, client_ip)

# 返回校验结果
response_data = {'success': success}
return JsonResponse(response_data)

至此,Django中使用极验Geetest滑动验证码的流程就完成了。

示例说明

示例一:简单登录页应用

我们可以通过添加一个简单的登录页面来演示Geetest的使用。

首先,在views.py中定义验证码获取、校验的方法。

from geetest import GeetestLib

# 极验ID和KEY,可以在官网申请
captcha_id = 'YOUR_CAPTCHA_ID'
private_key = 'YOUR_PRIVATE_KEY'

# 初始化GeetestLib实例
gt_lib = GeetestLib(captcha_id, private_key)


# 获取验证码的方法
def get_captcha(request):
    client_ip = request.META['REMOTE_ADDR']
    status, challenge = gt_lib.pre_process(client_ip)
    response_data = {'success': status, 'challenge': challenge}
    return JsonResponse(response_data)


# 校验验证码的方法
def check_captcha(request):
    geetest_challenge = request.POST['geetest_challenge']
    geetest_validate = request.POST['geetest_validate']
    geetest_seccode = request.POST['geetest_seccode']
    client_ip = request.META['REMOTE_ADDR']
    success = gt_lib.success_validate(geetest_challenge, geetest_validate, geetest_seccode, client_ip)
    response_data = {'success': success}
    return JsonResponse(response_data)


# 登录视图方法
def login(request):
    # 访问登录页面时,调用此方法获取验证码并渲染
    if request.method == 'GET':
        return render(request, 'login.html')

    # 获取登录表单并校验滑动验证码
    username = request.POST['username']
    password = request.POST['password']
    success = request.POST.get('success', False)
    if not success:
        raise ValueError("请先完成滑动验证码")
    # 校验用户名和密码
    # ...

    # 登录成功后返回首页
    return redirect('index')

然后,我们在login.html中添加表单和验证码元素。

{% extends 'base.html' %}

{% block content %}
<form id="login-form" action="{% url 'login' %}" method="post">
    {% csrf_token %}
    <div class="form-group">
        <label for="username">用户名</label>
        <input type="text" class="form-control" id="username" name="username" placeholder="请输入您的用户名">
    </div>
    <div class="form-group">
        <label for="password">密码</label>
        <input type="password" class="form-control" id="password" name="password" placeholder="请输入您的密码">
    </div>
    <div class="form-group">
        <div class="geetest" data-gt="" data-success="onGeetestSuccess"></div>
        <span id="geetest_tips" class="text-danger"></span>
    </div>
    <button id="submit-btn" type="submit" class="btn btn-primary" disabled>登录</button>
</form>
{% endblock %}

{% block js %}
<script src="https://static.geetest.com/static/tools/gt.js"></script>
<script>
    var handler = function (captchaObj) {
        $("#submit-btn").removeAttr('disabled');
        captchaObj.appendTo('.geetest');
        captchaObj.onReady(function () {
            $("#submit-btn").removeAttr('disabled');
        });
        captchaObj.onSuccess(function () {
            $("#geetest_tips").text("");
        });
        captchaObj.onError(function () {
            $("#geetest_tips").text("请正确拼合验证码");
        });
        $('#login-form').submit(function () {
            captchaObj.verify();
            return false;
        });
    };
    // 在DOM加载完成后,执行此方法初始化Geetest
    $(document).ready(function () {
        var params = {
            gt: '{{challenge}}',
            challenge: '{{geetest_challenge}}',
            product: 'popup',
            offline: !{{success}}
        };
        initGeetest({
            isProd: false,
            gt: params.gt,
            challenge: params.challenge,
            offline: params.offline,
            new_captcha: true,
            product: params.product,
            width: "300px"
        }, handler);
    });
</script>
{% endblock %}

最后,在urls.py中添加登录路由。

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.login, name='login'),
]

示例二:带参数的验证码应用

为了让读者更好的理解Geetest的使用,这里再给出一个带参数的验证码示例。这个示例中,我们要在验证码页面中实现拖动图片生成唯一标识,然后在后端验证(此处省略验证代码)。

在前端代码中,我们需要使用Geetest的initGeetest()方法,将参数传递给极验服务器。

{% extends 'base.html' %}

{% block content %}
<div class="row">
    <div class="col-md-6">
        <h5 class="text-muted">请按照先后顺序,拖动底部的图标</h5>
    </div>
    <div class="col-md-6">
        <div id="geetest_lib"></div>
    </div>
</div>
{% endblock %}

{% block js %}
<script src="https://static.geetest.com/static/tools/gt.js"></script>
<script>
    $(document).ready(function () {
        var handler = function (captchaObj) {
            captchaObj.onSuccess(function () {
                console.log(captchaObj.getValidate());
            });
            captchaObj.appendTo("#geetest_lib");
        };
        initGeetest({
            // 这里写入完整的参数值
            gt: "5528e23e1f179fdc175fc2d5519f6a0d",
            challenge: "51aec58a20e3421d2ba3f80461d9f6f5",
            product: "popup",
            width: "100%",
            offline: false,
            new_captcha: false,
            protocol: "https://",
            api_server: "api.geetest.com/",
            https: true,
            type: "slide",
            theme: "gc",
            lang: "zh-cn",
            cleanup: false,
            sliding_code_iv: "\u6ed1\u52a8\u63a7\u4ef6",
            passtime_iv: "\u8fc7\u53bb\u65f6\u95f4",
            img_click_iv: "\u70b9\u51fb\u56fe\u7247",
            fullpage: true
        }, handler);
    });
</script>
{% endblock %}

将此页面保存为template/captcha.html,并在views.py中定义一个视图函数。

from django.shortcuts import render


def captcha(request):
    return render(request, 'captcha.html')

最后,在urls.py中添加该路由。

from django.urls import path
from . import views

urlpatterns = [
    path('captcha/', views.captcha, name='captcha'),
]

打开浏览器,访问http://127.0.0.1:8000/captcha/即可看到验证码页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中使用极验Geetest滑动验证码过程解析 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 如何在Python中删除MongoDB数据库中的数据?

    以下是在Python中删除MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已MongoDB数据库,并已创建使用数据库和集合,同时需要安Python的驱动程序,例如pymongo。 步骤1:导入模块 在Python中使用pymongo模块连接MongoDB数据库。以下是导入p…

    python 2023年5月12日
    00
  • 基于Python编写一个刷题练习系统

    基于Python编写一个刷题练习系统 系统需求分析 根据题目要求,我们需要开发一个刷题练习系统,具体要求如下: 系统需要包含多种题型,包括但不限于选择题、填空题、简答题等 系统需要能够随机生成试题,每次生成的试题都需要保证题型和数量的随机性 系统需要能够自动批改试卷并输出成绩 系统需要支持用户自主选择题目类型和难度 系统设计 数据库设计 我们需要一个数据库来…

    python 2023年5月19日
    00
  • Python使用tkinter加载png、jpg等图片

    加载png、jpg等图片可以让Python的GUI界面更加活泼和美观。在Python中使用tkinter加载图片的方法有多种,下面将详细讲解其中两种常用的方法。 1. 使用PIL模块加载图片 PIL(Python Imaging Library)是Python的一个图像处理库,可以用来打开、保存、创建、修改各种格式的图片。下面演示如何使用PIL来加载图片。 …

    python 2023年5月19日
    00
  • 菜鸟使用python实现正则检测密码合法性

    菜鸟使用Python实现正则检测密码合法性 本攻略将详细讲解如何使用Python实现正则检测密码合法性,包括如何正则表达式匹配密码规则、如何使用re模块进行密码测。 正则表达式匹配密码规则 在Python中我们可以使用正则表达式匹配密码规则。下面是一个例子,演示如何使用正则表达式匹配密码规则: import re password = ‘Abc123456’…

    python 2023年5月14日
    00
  • 使用Python 正则匹配两个特定字符之间的字符方法

    以下是“使用Python正则匹配两个特定字符之间的字符方法”的完整攻略: 一、问题描述 在Python中,我们可以使用正则表达式来匹配两个特定字符之间的字符。本文将详细讲解如何使用Python正则表达式来匹配两个特定字符之间的字符。 二、解决方案 2.1 使用正则表达式匹配两个特定字符之间的字符 在Python中,我们可以使用正则表达式中的“(?<=.…

    python 2023年5月14日
    00
  • 【NLP教程】用python调用百度AI开放平台进行情感倾向分析

    目录 一、背景 二、操作步骤 2.1 创建应用 2.2 获取token 2.3 情感倾向分析 三、其他情感分析 四、讲解视频 一、背景 Hi,大家!我是 @马哥python说 ,一名10年程序猿。 今天我来演示一下:通过百度AI开放平台,利用python调用百度接口进行中文情感倾向分析,并得出情感极性分为积极、消极还是中性以及置信度结果。 二、操作步骤 首先…

    python 2023年4月25日
    00
  • Python在字符串中处理html和xml的方法

    在Python中,我们可以使用内置的字符串处理方法来处理HTML和XML。下面是一些常用的方法和示例: 1. 使用内置的html和xml模块 Python内置了html和xml模块,这些模块提供了一些方法来处理HTML和XML字符串。下面是一些示例: 示例1:使用html模块转义HTML字符串 import html html_string = ‘<h…

    python 2023年5月15日
    00
  • Python创建文件和追加文件内容实例

    针对Python创建文件和追加文件内容,以下是完整的攻略: 1. 创建文件 在Python中,可以通过文件操作模块(os和os.path模块)和文件对象操作模块(open函数)来创建文件。 1.1 使用os方式创建文件 import os # 打开(创建)一个文件(’w’代表写入方式) file = open(‘example.txt’, ‘w’) # 向文…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部