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

yizhihongxing

下面是“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中plot实现即时数据动态显示方法

    Python中可视化图形库matplotlib中的plot函数可以实现即时数据动态显示。要实现此功能,我们需要使用matplotlib的animation模块和FuncAnimation函数。 下面是完整攻略: 步骤1:导入必要的库 首先,我们需要导入必要的Python库,包括matplotlib和numpy: import matplotlib.pyplo…

    python 2023年5月19日
    00
  • 教你快速上手Selenium爬虫,万物皆可爬

    教你快速上手Selenium爬虫,万物皆可爬 简介 Selenium是一个自动化测试工具,除了用于浏览器测试外,它也可以被用于网络爬虫中。Selenium驱动程序可以模拟人类用户在网页上的操作,例如:点击链接、滚动页面、填写表单、执行JS代码等。Selenium可以在各大主流浏览器中实现自动化操作,包括Chrome、Firefox、Edge、Safari等。…

    python 2023年5月14日
    00
  • python多线程使用方法实例详解

    Python多线程使用方法实例详解 什么是多线程 多线程是指程序中包含多个执行基本单位的并发执行,每个基本单位称为一个线程,“多线程”就是在同一个程序中运行多个线程完成不同的任务。 Python多线程使用方法 Python的多线程实现是通过threading模块来实现的,其步骤如下: 步骤1:导入threading模块 import threading 步骤…

    python 2023年6月6日
    00
  • python实习总结(yeild,async,azwait和协程)

    Python实习总结 本文将介绍在Python实习中所了解到的yield、async、await和协程的知识点以及如何使用它们。 yield和生成器 yield是一种特殊的关键字,它可以让函数暂停执行,并将函数的当前状态保持下来。yield常用于生成器中,生成器可以用来迭代一组数据,而不用事先生成整组数据,这样可以节省内存空间。以下是yield的示例代码: …

    python 2023年5月13日
    00
  • 分享13个非常有用的Python代码片段

    下面是详细的“分享13个非常有用的Python代码片段”的攻略。 一、简述(Introduction) 首先,需要在文档的开头简述一下这篇文章的目的和主题。对于这个主题,我们将会分享13个非常有用的Python代码片段,这些代码片段可以帮助Python程序员提高代码效率和优化代码结构。 二、代码片段列表(Code snippets list) 接下来,我们需…

    python 2023年5月30日
    00
  • Python赋值逻辑的实现

    下面是Python赋值逻辑实现的完整攻略。 Python赋值逻辑实现 Python的赋值逻辑实现是通过变量引用机制来实现的。当我们将一个对象赋值给一个变量时,实际上是将这个对象的引用赋值给了这个变量。 变量引用 变量引用是Python中的一种机制,它指的是变量名和对象之间的关联关系。当我们将一个对象赋值给一个变量时,实际上是将这个对象的引用赋值给了这个变量。…

    python 2023年5月19日
    00
  • python字典setdefault方法和get方法使用实例

    当使用字典时,有时需要对不存在的键进行操作,这时候使用 get 方法可能会出现问题, 为了防止出错,可以使用 setdefault 方法。 setdefault方法 setdefault 方法用于在字典中设置键的默认值。如果键不存在,则添加该键并将其值设置为指定的默认值,默认值是 None。 setdefault 方法的语法如下: dict.setdefau…

    python 2023年5月13日
    00
  • python教程之利用pyautogui图形自动化击败重复性办公任务

    接下来我将为您详细讲解“Python教程之利用PyAutoGUI图形自动化击败重复性办公任务”的完整攻略。 1. 概述 PyAutoGUI是一个Python第三方库,用于通过鼠标和键盘模拟实现GUI操作。利用PyAutoGUI可以高效地进行重复性办公任务的自动化操作。本文将介绍如何使用PyAutoGUI来实现图形自动化击败重复性办公任务。 2. 安装 在执行…

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