csdn_okcheng

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

滑动验证码的识别介绍

  • 本节目标:

用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。

  • 准备工作:

本次案例我们使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。

  • 了解极验滑动验证码:

极验滑动验证码官网为:http://www.geetest.com/

验证方式为拖动滑块拼合图像,若图像完全拼合,则验证成功,否则需要重新验证,如图所示:
接下来我们链接地址:https://account.geetest.com/login,打开极验的管理后台登录页面,完成自动化登录操作。

实现步骤:

① 初始化

初始化链接地址、创建模拟浏览器对象、设置登录账户和密码等信息。

EMAIL = '登录账户'
PASSWORD = '登录密码'class CrackGeetest():def __init__(self):self.url = 'https://account.geetest.com/login'self.browser = webdriver.Chrome()#设置显示等待时间self.wait = WebDriverWait(self.browser, 20)self.email = EMAILself.password = PASSWORDdef crack():pass# 程序主入口
if __name__ == '__main__':crack = CrackGeetest()crack.crack()

② 模拟登录填写,点开滑块验证

  • 在实例化CrackGeetest对象后调用crack()方法开始模拟登录验证…

  • 调用open()方法,打开登录界面,获取账户和密码输入框节点,完成账户和密码的输入。

  • 调用get_geetest_button()方法获取滑动验证按钮,并点击。

class CrackGeetest():#...def get_geetest_button(self):''' 获取初始验证按钮,return:按钮对象 '''button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))return buttondef open(self):''' 打开网页输入用户名密码, return: None '''self.browser.get(self.url)email = self.wait.until(EC.presence_of_element_located((By.ID, 'email')))password = self.wait.until(EC.presence_of_element_located((By.ID, 'password')))email.send_keys(self.email)password.send_keys(self.password)def crack(self):# 输入用户名密码self.open()# 点击验证按钮button = self.get_geetest_button()button.click()#...#...

③ 获取并储存有无缺口的两张图片

  • 首先获取无缺口的验证图片,并保存到本地

  • 获取滑块对象,并执行点击,让浏览器中显示有缺口图片

  • 获取有缺口的验证图片,并保存到本地

 def get_position(self):''' 获取验证码位置, return: 验证码位置(元组) '''img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))time.sleep(2)location = img.locationsize = img.sizetop,bottom,left,right = location['y'],location['y']+size['height'],location['x'],location['x']+size['width']return (top, bottom, left, right)def get_screenshot(self):''' 获取网页截图, return: 截图对象 '''#浏览器截屏screenshot = self.browser.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))return screenshotdef get_geetest_image(self, name='captcha.png'):''' 获取验证码图片, return: 图片对象 '''top, bottom, left, right = self.get_position()print('验证码位置', top, bottom, left, right)screenshot = self.get_screenshot()#从网页截屏图片中裁剪处理验证图片captcha = screenshot.crop((left, top, right, bottom))captcha.save(name)return captchadef get_slider(self):''' 获取滑块, return: 滑块对象 '''slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))return sliderdef crack(self):#...# 获取验证码图片image1 = self.get_geetest_image('captcha1.png')# 点按呼出缺口slider = self.get_slider()slider.click()# 获取带缺口的验证码图片image2 = self.get_geetest_image('captcha2.png')#...

④ 获取缺口位置

  • 对比两张图片的所有RBG像素点,得到不一样像素点的x值,即要移动的距离
BORDER = 6
INIT_LEFT = 60class CrackGeetest():  def get_gap(self, image1, image2):''' 获取缺口偏移量, 参数:image1不带缺口图片、image2带缺口图片。返回偏移量 '''left = 65for i in range(left, image1.size[0]):for j in range(image1.size[1]):if not self.is_pixel_equal(image1, image2, i, j):left = ireturn leftreturn leftdef is_pixel_equal(self, image1, image2, x, y):'''判断两个像素是否相同:param image1: 图片1:param image2: 图片2:param x: 位置x:param y: 位置y:return: 像素是否相同'''# 取两个图片的像素点(R、G、B)pixel1 = image1.load()[x, y]pixel2 = image2.load()[x, y]threshold = 60if abs(pixel1[0]-pixel2[0])<threshold and abs(pixel1[1]-pixel2[1])<threshold and abs(pixel1[2]-pixel2[2])<threshold:return Trueelse:return Falsedef crack(self):#...# 获取缺口位置gap = self.get_gap(image1, image2)print('缺口位置', gap)# 减去缺口位移gap -= BORDER

⑤ 获取移动轨迹

  • 模拟人的行为习惯(先匀加速拖动后匀减速拖动),把需要拖动的总距离分成一段一段小的轨迹
def get_track(self, distance):'''根据偏移量获取移动轨迹:param distance: 偏移量:return: 移动轨迹'''# 移动轨迹track = []# 当前位移current = 0# 减速阈值mid = distance * 4 / 5# 计算间隔t = 0.2# 初速度v = 0while current < distance:if current < mid:# 加速度为正2a = 2else:# 加速度为负3a = -3# 初速度v0v0 = v# 当前速度v = v0 + atv = v0 + a * t# 移动距离x = v0t + 1/2 * a * t^2move = v0 * t + 1 / 2 * a * t * t# 当前位移current += move# 加入轨迹track.append(round(move))return trackdef crack(self):#...# 获取移动轨迹track = self.get_track(gap)print('滑动轨迹', track)

⑥ 按照轨迹拖动,完全验证

   def move_to_gap(self, slider, track):'''拖动滑块到缺口处:param slider: 滑块:param track: 轨迹:return:'''ActionChains(self.browser).click_and_hold(slider).perform()for x in track:ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.5)ActionChains(self.browser).release().perform()def crack(self):#...# 拖动滑块self.move_to_gap(slider, track)success = self.wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'geetest_success_radar_tip_content'), '验证成功'))print(success)

⑦ 完成登录

   def login(self):''' 执行登录 return: None '''submit = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'login-btn')))submit.click()time.sleep(10)print('登录成功')def crack(self):#...# 失败后重试if not success:self.crack()else:self.login()

出处: bilibili

Python爬虫解决极验(geetest)滑动验证码相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 亿级流量网关设计思路
  2. php手工注入语句,PHP+MySQL 手工注入语句大全
  3. ebs查看服务状态_浅析AWS KMS密钥管理服务
  4. ABAP_Excel 处理总结(二)
  5. boost::fibers模块实现single stream的测试程序
  6. JMetro版本11.5.11和8.5.11发布
  7. 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点
  8. it生命周期管理-资产管理
  9. 【华为OJ】按单词将句子逆序
  10. 雅虎14条性能优化原则
  11. 中美两国10万级作业调度工具 “TaskCtl“ Vs “Control-M“ 到底该如何选用?
  12. 混合开发Ionic+angular快速开发App
  13. 音创ktv点歌linux系统下载,音创ktv点歌系统
  14. 空手套白狼-我的互联网草根创业亲身经历
  15. deepin 切换输入法
  16. 相关性和差异的显著性
  17. 正确判断无人机指向故障 让电子罗盘远离磁干扰
  18. R、RStudio下载与安装方法
  19. 使用STM32F103采集Si7021温湿度传感器数据
  20. 推荐9个最顶级的IT公众号

热门文章

  1. dr计算机操作,【dr操作规程】_DR操作规程
  2. 分析的六种中小企业网络营销方法
  3. PHP ajax用户密码修改 CI框架
  4. linux中ping命令网络不可达或ping www.baidu.com未知的名称与服务
  5. 页面插入Flash动画
  6. 小马哥----高仿HTC D816刷机拆机主板图与开机界面图 6582芯片1:1精仿 分新旧 移动版与联通版分别
  7. VS运行时提示系统找不到指定的文件问题
  8. 如何在Windows server 2012配置Web服务器
  9. 美和易思 · 「云农职互联网技术学院」HTML+CSS 做西普尼金表官网
  10. 计算机系ppt比赛,计算机科学学院成功举办第四届“创意杯”PPT设计大赛