笔者是一名初入Python爬虫的小白,通过书籍(静觅大神出的书籍)的方式学了下突破验证的方式实现模拟登录有此类型的应用的知识。该方法不涉及任何商业关系,如果有违规行为麻烦联系下笔者

实现的步骤分为3步:

  • 1.使应用出现验证的完整图片和带有缺口的图片
  • 2.识别缺口的位置
  • 3.模拟拖动滑块至缺口处,完成验证

引入相关的库

from selenium import webdriver;
from selenium.webdriver.support.wait import WebDriverWait;
from selenium.webdriver.support import expected_conditions as EC;
from selenium.webdriver.common.by import By;
from selenium.webdriver import ActionChains;
import time;
from PIL import Image;
from io import BytesIO;
复制代码

我们定义一个类来实现相关的操作并且定义一些配置

EMAIL='xxx'  #账号
PASSWORD='xxx'  #密码(只是简单的处理)
BORDER=6; #开始滑动的小块与左边缘的距离
INIT_LEFT=60; #开始从X轴方向即x=60开始检测缺口的位置
复制代码
class GrackGeetest(object):def __init__(self):#这边我们开始定义一些相关的参数信息(我们用登录极验官网来做例子,其它的方式类似)self.url='https://auth.geetest.com/login/';self.browser=webdriver.Chrome();self.wait=WebDriverWait(self.browser,20);self.email=EMAIL;self.password=PASSWORD;#实现步骤1相关方法:def getGeetestButton(self): #获取点击可以使现验证图出现的按钮节点元素并返回button=self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_radar_tip')));return button;#获取验证图在网页中的位置并以元组的方式返回def getImagePosition(self):geetestImage=self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_canvas_img')));time.sleep(2);location=geetestImage.location;size=geetestImage.size;top,bottom,left,right=location['y'],location['y']+size['height'],location['x'],location['x']+size['width'];return (top,bottom,left,right);#截取当前页面def getChromePage(self):pageShot=self.browser.get_screenshot_as_png();pageShot=Image.open(BytesIO(pageShot));return pageShot;#从网页中截取该验证图片并返回def getGeetestImage(self,name='geetest.png'):top,bottom,left,right=self.getImagePosition();#截取当前页面的图片pageShot=self.getChromePage();#截取其中出现的验证图的位置captchaImage=pageShot.crop((left,top,right,bottom));captchaImage.save(name);#保存到当前的文件夹中return captchaImage;#实现步骤2相关方法:识别缺口位置def getSlider(self):#获取可拖动的滑块对象slider=self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_slider_button')));return slider;#通过对比2张图的像素点的差距得出缺口位置def getGap(self,image1,image2):left=60; #size[0]->width,size[1]->heightfor i in range(left,image1.size[0]):for j in range(image1.size[1]):if not self.isPixelEqual(image1,image2,i,j):#因为小滑块和缺口是同一条水平线上的所以就只取x轴方向上的值left=i;return left;return left;def isPixelEqual(self,image1,image2,x,y):#判断2个像素是否相同pixel1=image1.load()[x,y]; #pixel1,pixel2为rgb值,是一个元组pixel2=image2.load()[x,y];#阀值当超出这个阀值的时候则证明这2个像素点不匹配,为缺口的左上角的像素点threshold=60;if abs(pixel1[0]-pixel2[0])<threshold and abs(pixel1[1]-pixel2[1])<threshold and abs(pixel1[2]-pixel2[2])<threshold :return True;else:return False;#步骤三相关方法:最关键的一步也是突破极验验证机器学习算法的一步#采用物理中物体的分阶段改变加速度的方式,这里采用先加速后减速的方式#公式 x=v0*t+1/2*a*t*t  v=v0+a*tdef getTrack(self,distance):#distance偏移量#移动轨迹tranck=[];#当前位移current=0;#开始减速的阀值mid=distance*4/5;#计算间隔t=0.2;#初速度v=0;while current<distance:if current<mid:a=2;else:#开始减速a=-3;#初速度v0=v;#当前速度v=v0+a*t;#位移move=v0*t+1/2*a*t*t;#当前位移current+=move;#加入轨迹track.append(round(move));return track; #按照运动轨迹移动滑块def moveToGap(self,slider,tracks):#拖动滑块到缺口处ActionChains(self.browser).click_and_hold(slider).perform();for x in tracks:ActionChains(self.browser).move_by_offset(xoffset=x,yoffset=0).perform();time.sleep(0.5);ActionChains(self.browser).release().perform();#最后模拟点击登录应用就行了def login(self):button=self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#base > div.content-outter > div > div > div:nth-child(3) > div > form > div:nth-child(5) > div > button')));button.click();time.sleep(10);#接下来直接实现通过一个方法将这整个过程连接起来def sendUserAndPassword(self):self.browser.get(self.url);#通过类选择器,我是直接在浏览器那边复制过来的,所以比较长,可以通过其它方式得到该元素(右键那个网页元素就有一些选择可以看看哈)email=self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#base > div.content-outter > div > div > div:nth-child(3) > div > form > div:nth-child(1) > div > div.ivu-input-wrapper.ivu-input-type.ivu-input-group.ivu-input-group-with-prepend > input')));password=self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#base > div.content-outter > div > div > div:nth-child(3) > div > form > div:nth-child(2) > div > div.ivu-input-wrapper.ivu-input-type.ivu-input-group.ivu-input-group-with-prepend > input')));email.send_keys(self.email);password.send_keys(self.password);def doVerifyLogin(self):#步骤1:#输入账号密码self.sendUserAndPassword();#点击验证按钮verifyButton=self.getGeetestButton();verifyButton.click();#开始获取2张验证图image1=self.getGeetestImage('geetest1.png');#点击小滑块得到有缺口的验证图slider=self.getSlider();slider.click();#获取带缺口的验证图image2=self.getGeetestImage('geetest2.png');#步骤2:#获取缺口位置gap=self.getGap(image1,image2);#缺口的位置需要减去那个小滑块与左边那一小段距离gap-=BORDER;#步骤3:#移动轨迹track=self.getTrack();#拖动滑块self.moveToGap(slider,track);#最后判断是否成功了,不成功就重新操作这一过程try:success = self.wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'geetest_success_radar_tip_content'), '验证成功'))print(success)# 失败后重试if not success:self.doVerifyLogin()else:self.login()except:self.doVerifyLogin();if __name__ == '__main__':crack = GrackGeetest();crack.doVerifyLogin();
复制代码

以上就是完整的代码了,同时需要安装ChromeDriver,安装的具体过程找下搜索引擎问问

转载于:https://juejin.im/post/5b29bb5de51d455e2c32e3de

通过selenium突破极验验证实现登录相关推荐

  1. iOS实现简书的登录验证方式(极验验证)

    开篇 我们登录简书的时候就会看到如下类似的验证方式,个人还是很喜欢这种验证方式的,想着如果把它自如自己设计的软件中还是不错的,但是我们要怎么实现这种验证效果呢,今天就来介绍一下. 图形验证码.gif ...

  2. 极验验证--滑块验证

    极验验证–滑块验证 本文通过通过模拟登录极验网站,完成滑块验证 所用语言和相关模块 python3.6 selenium requests` PIL 极验验证码特点分析 极验验证是一种在计算机领域用于 ...

  3. 极验验证滑块破解,canvas

    前言 请勿用于商务用途哦,仅限于学习,否则后果自负哦 有两篇关于极验验证滑块破解的文章,在此分享一下: https://www.jianshu.com/p/c8df1194b514 https://w ...

  4. 乱序图片 极验_极验验证吴渊:传统图片验证方式已经无效了!

    吴渊,极意网络CEO 黑五月频发的宕机门告诉我们:数据安全,所有创业者都应该关注! 让我们来听听IDG资本的两位投资人大佬的深刻分析,以及5家创业公司CEO/CTO大拿的深切呼吁吧!--这里不止有干货 ...

  5. 极验验证(滑动验证)的使用

    极验验证目录 一.样例 二.注册账号 三.获取ID 四.极验官方文档(参考) 五.SpringBoot集成极验 5.1.maven依赖(可能有些需要自己去导,个人的包依赖太多不好全部放上来,核心就这两 ...

  6. 极验onelogin 一键登录 接入流程与问题

    极验onelogin一键登录 前段时间接入了一键登录,里面的坑还不少,现梳理下来,为防止后期回顾及 避免以后的人能快速知道问题所在. Android 接入文档:https://docs.geetest ...

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

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

  8. Android极验验证集成【滑块+文字验证】

    前言: 先复制一段官网介绍 产品介绍 极验「行为验证」是一项可以帮助你的网站与APP识别与拦截机器程序批量自动化操作的SaaS应用.它是由极验开发的新一代人机验证产品,它不基于传统"问题-答 ...

  9. 【源码分析】极验验证官方SDK源码分析和实现思路

    前言 2016年就这么来了,新的一年,继续努力~ 最近,除了12306的验证码火起来以后,还有一个在界面上拖拽的验证码,也火了起来,就是这次要说的极验验证,在这个万众创新的时代,工具类产品能做到这样, ...

  10. 极验验证简介(待续)

    百度百科介绍: 极验验证是一种在计算机领域用于区分自然人和机器人的,通过简单集成的方式,为开发者提供安全.便捷的云端验证服务. 与以往传统验证码不同的是,极验通过分析用户完成拼图过程中的行为特征,通过 ...

最新文章

  1. Java项目:在线课程会员系统(java+Springboot+Maven+JSP+Spring+Mysql+layui)
  2. 数据架构简史:转换中的范式
  3. 如何利用数据仓库优化数据分析?
  4. JUnit 5 – 早期试用体验 – 第2篇
  5. 201521123078《Java程序设计》第2周学习总结
  6. mysql自定义函数多参数_自定义mysql函数 - 无法传递参数
  7. spring boot错误: 找不到或无法加载主类
  8. 大学四年总结与感悟及给刚上大学的同学的一些建议
  9. 基于FPGA的OV5640摄像头驱动
  10. 伍斯特理工学院计算机,世界排名领先,伍斯特理工学院到底有多厉害?
  11. Nginx搭建反向代理服务器
  12. 国家开放大学2021春1135液压气动技术题目
  13. 斯坦福计算机硕士要求,申请斯坦福计算机硕士要求有哪些?
  14. Alien Skin Exposure X5 Bundle Mac(PS/LR照片胶片滤镜插件)
  15. 怎么删除一个圆或者图形的一部分
  16. 天猫魔盒部分adb shell或telnet下有用命令
  17. java实现Word文档转换PDF文档
  18. python3 url解析 urllib.parse.urlparse 库简介
  19. 城乡规划现状数据移动调研系统开发
  20. linux下pppoe服务器搭建

热门文章

  1. Google AdSense实战宝典
  2. Java:接口interface
  3. Python下的数据处理和机器学习,对数据在线及本地获取、解析、预处理和训练、预测、交叉验证、可视化
  4. 【医疗影像处理】脑部MRI影像denoise方法总结[antspy]
  5. Android如何谷歌搜索,android – 如何从谷歌地方检索搜索建议?
  6. PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错
  7. yum mysql 无法启动失败_Linux下MySQL数据库yum升级后无法启动解决办法
  8. Android 布局系列篇
  9. Spring ——《第二章》Spring中的Bean
  10. HTML5——用a标签在当前网页跳转和打开新页面再跳转