**一,环境部署
**

1.创建一个django测试项目

二,文档部署

1.下载安装python对应的SDK

使用命令从Github导入完整项目:git clone https://github.com/GeeTeam/gt3-python-sdk.git

手动下载压缩包文件: https://github.com/GeeTeam/gt3-python-sdk/archive/master.zip

2.参数配置

修改请求参数(可选)

名称 说明
user_id 用户标识,若担心用户信息风险,可作预处理(如哈希处理)再提供
client_type 客户端类型,web(pc浏览器),h5(手机浏览器,包括webview),native(原生app),unknown(未知)
ip_address 客户端请求您服务器的ip地址,unknow表示未知

三.代码实现

**SDK:utils >geetest.py **

import sysimport randomimport jsonimport requestsimport timefrom hashlib import md5if sys.version_info >= (3,):xrange = range  VERSION = "3.0.0"class GeetestLib(object):FN_CHALLENGE = "geetest_challenge"FN_VALIDATE = "geetest_validate"FN_SECCODE = "geetest_seccode"GT_STATUS_SESSION_KEY = "gt_server_status"API_URL = "http://api.geetest.com"REGISTER_HANDLER = "/register.php"VALIDATE_HANDLER = "/validate.php"JSON_FORMAT = Falsedef __init__(self, captcha_id, private_key):self.private_key = private_keyself.captcha_id = captcha_idself.sdk_version = VERSIONself._response_str = ""def pre_process(self, user_id=None,new_captcha=1,JSON_FORMAT=1,client_type="web",ip_address=""):"""验证初始化预处理.//TO DO arrage the parameter"""status, challenge = self._register(user_id,new_captcha,JSON_FORMAT,client_type,ip_address)self._response_str = self._make_response_format(status, challenge,new_captcha)return statusdef _register(self, user_id=None,new_captcha=1,JSON_FORMAT=1,client_type="web",ip_address=""):pri_responce = self._register_challenge(user_id,new_captcha,JSON_FORMAT,client_type,ip_address)if pri_responce:if JSON_FORMAT == 1:response_dic = json.loads(pri_responce)challenge = response_dic["challenge"]else:challenge = pri_responceelse:challenge=" "if len(challenge) == 32:challenge = self._md5_encode("".join([challenge, self.private_key]))return 1,challengeelse:return 0, self._make_fail_challenge()def get_response_str(self):return self._response_strdef _make_fail_challenge(self):rnd1 = random.randint(0, 99)rnd2 = random.randint(0, 99)md5_str1 = self._md5_encode(str(rnd1))md5_str2 = self._md5_encode(str(rnd2))challenge = md5_str1 + md5_str2[0:2]return challengedef _make_response_format(self, success=1, challenge=None,new_captcha=1):if not challenge:challenge = self._make_fail_challenge()if new_captcha:string_format = json.dumps({'success': success, 'gt':self.captcha_id, 'challenge': challenge,"new_captcha":True})else:string_format = json.dumps({'success': success, 'gt':self.captcha_id, 'challenge': challenge,"new_captcha":False})return string_formatdef _register_challenge(self, user_id=None,new_captcha=1,JSON_FORMAT=1,client_type="web",ip_address=""):if user_id:register_url = "{api_url}{handler}?gt={captcha_ID}&user_id={user_id}&json_format={JSON_FORMAT}&client_type={client_type}&ip_address={ip_address}".format(api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id, user_id=user_id,new_captcha=new_captcha,JSON_FORMAT=JSON_FORMAT,client_type=client_type,ip_address=ip_address)else:register_url = "{api_url}{handler}?gt={captcha_ID}&json_format={JSON_FORMAT}&client_type={client_type}&ip_address={ip_address}".format(api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id,new_captcha=new_captcha,JSON_FORMAT=JSON_FORMAT,client_type=client_type,ip_address=ip_address)try:response = requests.get(register_url, timeout=2)if response.status_code == requests.codes.ok:res_string = response.textelse:res_string = ""except:res_string = ""return res_stringdef success_validate(self, challenge, validate, seccode, user_id=None,gt=None,data='',userinfo='',JSON_FORMAT=1):"""正常模式的二次验证方式.向geetest server 请求验证结果."""if not self._check_para(challenge, validate, seccode):return 0if not self._check_result(challenge, validate):return 0validate_url = "{api_url}{handler}".format(api_url=self.API_URL, handler=self.VALIDATE_HANDLER)query = {"seccode": seccode,"sdk": ''.join( ["python_",self.sdk_version]),"user_id": user_id,"data":data,"timestamp":time.time(),"challenge":challenge,"userinfo":userinfo,"captchaid":gt,"json_format":JSON_FORMAT}backinfo = self._post_values(validate_url, query)if JSON_FORMAT == 1:backinfo = json.loads(backinfo)backinfo = backinfo["seccode"]if backinfo == self._md5_encode(seccode):return 1else:return 0def _post_values(self, apiserver, data):response = requests.post(apiserver, data)return response.textdef _check_result(self, origin, validate):encodeStr = self._md5_encode(self.private_key + "geetest" + origin)if validate == encodeStr:return Trueelse:return Falsedef failback_validate(self, challenge, validate, seccode):"""failback模式的二次验证方式.在本地对轨迹进行简单的判断返回验证结果."""if not self._check_para(challenge, validate, seccode):return 0validate_result = self._failback_check_result(challenge, validate,)return validate_resultdef _failback_check_result(self,challenge,validate):encodeStr = self._md5_encode(challenge)if validate == encodeStr:return Trueelse:return Falsedef _check_para(self, challenge, validate, seccode):return (bool(challenge.strip()) and bool(validate.strip()) and bool(seccode.strip()))def _md5_encode(self, values):if type(values) == str:values = values.encode()m = md5(values)return m.hexdigest()

view.py

# _*_ coding=utf-8 _*_import uuid, jsonfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom api.models import Account, UserTokenfrom django_redis import get_redis_connectionfrom django.http import HttpResponsefrom api.utils.geetest import GeetestLib# id和key需要在Geetest官网自行申请,示例id不可用pc_geetest_id = "b46d1900d0a894591916ea94ea91bd2c"pc_geetest_key = "36fc3fe98530eea08dfc6ce76e3d24c4"REDIS_CONN = get_redis_connection('default')class GeetestView(APIView):def get(self, request):user_id = 'test'gt = GeetestLib(pc_geetest_id, pc_geetest_key)status = gt.pre_process(user_id)# 使用session# request.session[gt.GT_STATUS_SESSION_KEY] = status# request.session["user_id"] = user_id# 使用redisREDIS_CONN.set(gt.GT_STATUS_SESSION_KEY, status)REDIS_CONN.set("gt_user_id", user_id)response_str = gt.get_response_str()return HttpResponse(response_str)def post(self, request):# print(request.session.get("user_id"))print(request.META.get("HTTP_AUTHENTICATION"))print(request.data)gt = GeetestLib(pc_geetest_id, pc_geetest_key)challenge = request.data.get(gt.FN_CHALLENGE, '')validate = request.data.get(gt.FN_VALIDATE, '')seccode = request.data.get(gt.FN_SECCODE, '')# 验证username,pwd# status = request.session.get(gt.GT_STATUS_SESSION_KEY)# print(status)# user_id = request.session.get("user_id")# print(user_id)status = REDIS_CONN.get(gt.GT_STATUS_SESSION_KEY)user_id = REDIS_CONN.get("gt_user_id")if status:result = gt.success_validate(challenge, validate, seccode, user_id)else:result = gt.failback_validate(challenge, validate, seccode)result = {"status": "success"} if result else {"status": "fail"}# if result:#   # 证明验证码通过#   # 判断用户名和密码# else:#   # 返回验证码错误return HttpResponse(json.dumps(result))

url.py

path('pc-geetest/register', GeetestView.as_view()),path('pc-geetest/ajax_validate', GeetestView.as_view()),

login.html

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src="http://static.geetest.com/static/tools/gt.js"></script><script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script><style>body {margin: 50px 0;text-align: center;}.inp {border: 1px solid gray;padding: 0 10px;width: 200px;height: 30px;font-size: 18px;}.btn {border: 1px solid gray;width: 100px;height: 30px;font-size: 18px;cursor: pointer;}#embed-captcha {width: 300px;margin: 0 auto;}.show {display: block;}.hide {display: none;}#notice {color: red;}/* 以下遮罩层为demo.用户可自行设计实现 */#mask {display: none;position: fixed;text-align: center;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5);overflow: auto;}/* 可自行设计实现captcha的位置大小 */.popup-mobile {position: relative;}#popup-captcha-mobile {position: fixed;display: none;left: 50%;top: 50%;transform: translate(-50%, -50%);-webkit-transform: translate(-50%, -50%);z-index: 9999;}</style></head><body><div id="app"><div class="popup"><h2>弹出式Demo,使用ajax形式提交二次验证码所需的验证结果值</h2><br><p><label>用户名:</label><input id="username1" class="inp" type="text" value="极验验证" v-model="username"></p><br><p><label>&nbsp;&nbsp;&nbsp;&nbsp;码:</label><input id="password1" class="inp" type="password" value="123456" v-model="pwd"></p><br><input class="btn" id="popup-submit" type="submit" value="提交" ref="popup"><div id="popup-captcha"></div></div></div><script>// Vue.prototype.$axios = axios;const app = new Vue({el: "#app",data: {username: "极验验证",pwd: "123456"},mounted() {let that = this;// 验证开始需要向网站主后台获取id,challenge,success(是否启用failback)axios.request({url: "http://127.0.0.1:8008/pc-geetest/register?t=" + (new Date()).getTime(), // 加随机数防止缓存method: "get",}).then(function (data) {console.log(data.data);// 使用initGeetest接口// 参数1:配置参数// 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件initGeetest({gt: data.data.gt,challenge: data.data.challenge,product: "popup", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效offline: !data.data.success, // 表示用户后台检测极验服务器是否宕机,一般不需要关注new_captcha: true// 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config}, function (captchaObj) {// 成功的回调console.log("进入成功的回调");captchaObj.onSuccess(function () {let validate = captchaObj.getValidate();console.log(122233333)axios.request({url: "http://127.0.0.1:8008/pc-geetest/ajax_validate", // 进行二次验证method: "post",data: {username: that.username,password: that.pwd,geetest_challenge: validate.geetest_challenge,geetest_validate: validate.geetest_validate,geetest_seccode: validate.geetest_seccode}}).then(function (data) {console.log(data.data);if (data && (data.data.status === "success")) {alert("登录成功")} else {alert("登录失败")}})});console.log(that.$refs.popup);that.$refs.popup.onclick = function () {captchaObj.show();};// 将验证码加到id为captcha的元素里captchaObj.appendTo("#popup-captcha");// 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html});})}})</script></body></html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Django中使用极验Geetest滑动验证码过程解析相关推荐

  1. 给html5添加极验,Django中使用极验Geetest滑动验证码过程解析

    一,环境部署 1.创建一个django测试项目 二,文档部署 1.下载安装python对应的SDK 使用命令从Github导入完整项目:git clone https://github.com/Gee ...

  2. Django中使用极验Geetest滑动验证码

    一,环境部署 1.创建一个django测试项目 此处省略... 二,文档部署 1.下载安装python对应的SDK 使用命令从Github导入完整项目:git clone https://github ...

  3. Python爬虫解决极验(geetest)滑动验证码

    csdn_okcheng 滑动验证码的识别介绍 实现步骤: ① 初始化 ② 模拟登录填写,点开滑块验证 ③ 获取并储存有无缺口的两张图片 ④ 获取缺口位置 ⑤ 获取移动轨迹 ⑥ 按照轨迹拖动,完全验证 ...

  4. 对极验geetest滑块验证码图片还原算法的研究

    免责声明 本文章所提到的技术仅用于学习用途,禁止使用本文章的任何技术进行发起网络攻击.非法利用等网络犯罪行为,一切信息禁止用于任何非法用途.若读者利用文章所提到的技术实施违法犯罪行为,其责任一概由读者 ...

  5. 网络爬虫-破解极验三代滑动验证码

    什么是"极验"? 如果你是从事爬虫相关工作的,那么一定对这两个字不会陌生的. 极验是首家「行为式验证」安全技术服务提供商,并以提供验证码服务而闻名.我们日常会登录一些网站,有的网站 ...

  6. Spring Boot 极验验证滑动验证码

    概要 基于极验验证官网 java版gt3-java-sdk改编,使用Spring Boot 整合的极验滑动验证,包含form表单登录和ajax登录两种情况. 目录 注册账户获取ID和KEY Demo源 ...

  7. Python Selenium 破解极验(GeeTest)滑动验证

    ArmourGeeTestArmourGeeTestArmourGeeTest [TOS] 本项目仅供交流学习,有疑问请在issue中提出: 本项目不提供面向任何商业需求的版本迭代: 关于本项目源码的 ...

  8. 破解极验三代滑动验证,成功率百分之百(三):构造参数,发起请求

    声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码.维护网络安全,人人有责. 环节概述 首先我们还是需要使用请求转发工具,把目标代码替换为我们处理过的代码. 观察验证过程中触发了哪些请 ...

  9. 爬虫进阶教程:极验(GEETEST)验证码破解教程

    原文链接及原作者:爬虫进阶教程:极验(GEETEST)验证码破解教程 | Jack Cui 一.前言 爬虫最大的敌人之一是什么?没错,验证码![Geetest]作为提供验证码服务的行家,市场占有率还是 ...

最新文章

  1. RS-232 Transmitter
  2. Linux下防火墙iptables用法规则详及其防火墙配置
  3. World Final 2012
  4. 深度学习框架YOLOv3的C++调用
  5. Linux内存释放脚本
  6. 悟空分词与mysql结合_Mysql联合查询UNION和UNION ALL的使用介绍
  7. stm32 ucosii消息队列 串口_STM32F1的UART4串口配置
  8. abb限位开关已打开drv1_Telemecanique传感器限位开关产品系列
  9. css3 3D动画 200303
  10. 入参为字符串用日期对象接收
  11. Javascript 读cookie
  12. ReactiveCocoa 用法实例
  13. BZOJ2330:[SCOI2011]糖果(差分约束)
  14. ElastcSearch的Mapping映射建立
  15. 搜集了一些AIDA64的GPGPU测试结果,现整理成表格共享
  16. python 答题卡识别项目_答题卡图像识别项目
  17. 通过ajax单独上传图片
  18. Ubuntu wine QQ 微信乱码
  19. 借助Microsoft Teams进行在线学习小组的组织与管理
  20. 深入学习D3JS:d3-color

热门文章

  1. 拥有着12万亿市场的部件,主角:射频
  2. 快速掌握linux常用命令
  3. 2020-9-4 明日方舟抽卡模拟器修改
  4. 计算机网络安全与防范答辩,最新计算机网络与安全管理专业毕业论文答辩稿演讲自述范文...
  5. Xamarin.Android入门
  6. BlackBerry Storm 9500 5.0 东亚版驾到
  7. leetcode 1556. Thousand Separator(python)
  8. 计算机智能方面相关论文,计算机人工智能论文.doc
  9. 英韧科技PCIe 5.0 SSD主控4K随机读延时12us,为目前市场最低
  10. 不要被欲望冲昏头脑而迷失方向,不要被工作撕碎心情打破计划