【极验测试站】https://www.geetest.com/demo/slide-popup.html

滑动验证码如下图

破解滑动验证码一般都是得到验证码的原图和有滑块的图,这里我们抓包发现极验的原图和滑块图经过了一定的处理,比较难操作,所以我们可以通过截图的方式来处理。

结果展示

操作见代码,注释写的比较详细

#!/usr/bin/env python
# encoding: utf-8# -*- coding: utf-8 -*-
# @software: PyCharm
# @time: 2019/5/6 10:31
# @author: Paulson●Wier
# @file: geetest_demo.py
# @desc:from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from PIL import Image
from io import BytesIO
import timeBORDER = 6class CrackGeetest(object):def __init__(self):self.url = 'https://www.geetest.com/demo/slide-popup.html'options = webdriver.ChromeOptions()options.add_argument("--start-maximized")self.browser = webdriver.Chrome(options=options)self.wait = WebDriverWait(self.browser, 10)def open(self):"""打开网页:return None"""self.browser.get(self.url)def close(self):"""关闭网页:return None"""self.browser.close()self.browser.quit()def change_to_slide(self):"""切换为滑动认证:return 滑动选项对象"""huadong = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.products-content > ul > li:nth-child(2)')))return huadongdef get_geetest_button(self):"""获取初始认证按钮:return 按钮对象"""button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.geetest_radar_tip_content')))return buttondef wait_pic(self):"""等待验证图片加载完成:return None"""self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_popup_wrap')))def get_screenshot(self):"""获取网页截图:return: 截图对象"""screenshot = self.browser.get_screenshot_as_png()self.browser.save_screenshot("yanzhengma1.png")screenshot = Image.open(BytesIO(screenshot))return screenshotdef get_position(self):"""获取验证码位置:return: 位置元组"""img = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_canvas_img.geetest_absolute')))time.sleep(2)location = img.locationsize = img.size# top, bottom = location['y'] - size['height'], location['y']# print("top")# left, right = location['x'], location['x'] + size['width']left = location['x']top = location['y']right = left + size['width']bottom = top + size['height']return top, bottom, left, rightdef get_slider(self):"""获取滑块:return: 滑块对象"""slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))return sliderdef 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 delete_style(self):"""执行js脚本,获取无滑块图:return None"""js = 'document.querySelectorAll("canvas")[2].style=""'self.browser.execute_script(js)def is_pixel_equal(self, img1, img2, x, y):"""判断两个像素是否相同:param img1: 不带缺口图片:param img2: 带缺口图:param x: 位置x:param y: 位置y:return: 像素是否相同"""# 取两个图片的像素点pix1 = img1.load()[x, y]pix2 = img2.load()[x, y]# print(pix1+"      "+pix2)threshold = 60if abs(pix1[0] - pix2[0]) < threshold and abs(pix1[1] - pix2[1]) < threshold and abs(pix1[2] - pix2[2]) < threshold:return Trueelse:return Falsedef get_gap(self, img1, img2):"""获取缺口偏移量:param img1: 不带缺口图片:param img2: 带缺口图:return 缺口位置"""left = 70for i in range(left, img1.size[0]):for j in range(img1.size[1]):if not self.is_pixel_equal(img1, img2, i, j):left = ireturn leftreturn leftdef get_track(self, distance):"""根据偏移量获取移动轨迹:param distance: 偏移量:return: 移动轨迹"""# 移动轨迹track = []# 当前位移current = 0# 减速阈值mid = distance * 3 / 5# 计算间隔t = 0.2# 初速度v = 0# 滑超过过一段距离distance += 15while current < distance:if current < mid:# 加速度为正a = 1else:# 加速度为负a = -0.5# 初速度 v0v0 = v# 当前速度 vv = v0 + a * t# 移动距离 move-->xmove = v0 * t + 1 / 2 * a * t * t# 当前位移current += move# 加入轨迹track.append(round(move))return trackdef shake_mouse(self):"""模拟人手释放鼠标时的抖动:return: None"""ActionChains(self.browser).move_by_offset(xoffset=-2, yoffset=0).perform()ActionChains(self.browser).move_by_offset(xoffset=2, yoffset=0).perform()def move_to_gap(self, slider, tracks):"""拖动滑块到缺口处:param slider: 滑块:param tracks: 轨迹:return"""back_tracks = [-1, -1, -2, -2, -3, -2, -2, -1, -1]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)# 逆向for x in back_tracks:ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()# 模拟抖动self.shake_mouse()time.sleep(0.5)ActionChains(self.browser).release().perform()def crack(self):try:# 打开网页self.open()# # 转换验证方式,点击认证按钮# s_button = self.change_to_slide()# time.sleep(1)# s_button.click()g_button = self.get_geetest_button()g_button.click()# 确认图片加载完成self.wait_pic()# 获取滑块slider = self.get_slider()# 获取带缺口的验证码图片image1 = self.get_geetest_image('captcha1.png')self.delete_style()image2 = self.get_geetest_image('captcha2.png')gap = self.get_gap(image1, image2)print('缺口位置', gap)gap -= BORDERtrack = self.get_track(gap)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)time.sleep(5)self.close()except:print('Failed-Retry')self.crack()if __name__ == '__main__':crack = CrackGeetest()crack.crack()

可以的话点个赞
点击前往GitHub项目地址

【2019.05】极验滑动验证码破解 geetest相关推荐

  1. 极验滑动验证码破解分析

    来自知乎文章 极验验证码验证的是鼠标拖动滑块时的鼠标轨迹,完整步骤就像这样:先向目标网站请求一个id,然后拿着id去geetest服务器请求图片:接下来就开始拖动滑块,拖动的过程会被js记录下来:松开 ...

  2. 如何破解极验滑动验证码?成功率 100%!

    注:已对文章中所涉及的敏感内容,如图片/文字/URL 进行脱敏处理. 什么是"极验"? 或许你没听说过极验[1],但你很大可能使用过极验的产品.极验是首家「行为式验证」安全技术服务 ...

  3. Day06,selenium的剩余用法、万能登录破解和爬取京东商品信息,及破解极验滑动验证码...

    一.自动登录抽屉新热榜 from selenium import webdriver import timedriver = webdriver.Chrome(r'D:\BaiduNetdiskDow ...

  4. ThinkPHP5实现极验滑动验证码geetest功能

    现在很多网站,比如淘宝,京东等都改用使用极验拖动验证码实现登录,这种方式比传统的验证码方式有更好的体验,减少用户输入的错误,也同样能起到防盗刷的功能.现在很多极验都是第三方的,也很多都是收费的.这里主 ...

  5. 极验滑块验证码破解与研究(二):缺口图片还原

    极验滑块验证码破解与研究(二):缺口图片还原 声明 一.缺口图片还原js分析 1. 为什么需要还原 2. 本篇文章需要用到的小工具 2.1. reres插件 3. 找到图片还原js入口函数 3.1. ...

  6. 极验滑块验证码破解与研究(三):滑块缺口识别

    极验滑块验证码破解与研究(三):滑块缺口识别 声明 一.环境安装 1. 第三方库安装 二.滑块缺口识别 1. 准备工作 2. 工具函数说明 3. 接口识别原理讲解 4. 缺口识别完整代码 三.结语 * ...

  7. thinkphp整合极验滑动验证码源码演示下载

    thinkphp整合极验滑动验证码源码演示下载-二当家的php源码下载 <!DOCTYPE html><html lang="en"><head> ...

  8. 艺赛旗RPA验证码处理系列(三):破解极验滑动验证码

    目前艺赛旗RPA已经更新到8.0版本,可以让所有用户免费下载试用http://www.i-search.com.cn/index.html?from=line1 (复制链接下载) 一,介绍 一些网站会 ...

  9. BiliBili等网站极验滑动验证码的详细破解过程

    基于selenium自动化的滑动验证码破解 selenium python 验证码 1.环境配置(Linux) python2.7 pip安装的库:selenium , PIL Chrome浏览器 , ...

最新文章

  1. 执行虚拟机mysql脚本_mysql一键执行脚本 超方便!!!
  2. 轻松监听Azure service health 状态
  3. 会打乒乓球的机器人!
  4. 云栖专辑 | 阿里开发者们的第6个感悟:享受折磨
  5. python文件打包发布(引用的包也可以加进来),打包出错解决了,运行出错解决了...
  6. 作者:张丽丽(1984-),女,中国科学院计算机网络中心助理研究员
  7. 【linux】安装centOS过程中遇到的困难
  8. js 生成二维码_Node for Max 二维码生成器
  9. Javascript中常用的经典技巧
  10. 上面两点下面一个三角形_【人人都能欣赏的数学证明】为什么三角形的三个内角相加是180度?...
  11. 职场领导想逼你走时,他会用哪些奇招逼你走?
  12. 计算机驱动恢复出厂设置在哪里,Windows系统恢复出厂设置在哪?怎么恢复出厂设置?...
  13. 网站性能优化之DNS Prefetch
  14. 小米手机v3.exo 合并_eXo Platform 3.0访谈
  15. syslinux 启动后显示SYSLINUX 5.01H. Peter Anvin et al
  16. (商品评价页)商品星级评分html+css+js
  17. 根据年份和月份计算当前月有多少天?
  18. python写文件字母_Python - 文件读写
  19. 云测试软件详解,云计算存储测试:FIO工具入门与实战
  20. eos的石墨烯技术是什么

热门文章

  1. python长整型怎么用_Python整型运算之布尔型、标准整型、长整型操作示例
  2. 行车制动、驻车制动和发动机制动介绍
  3. FX5U和je-C伺服通讯案例和学习资料
  4. 安超云生态|安超云与长城超云完成兼容互认证 携手打造协同生态
  5. 2021年信息产业十大技术趋势
  6. 热烈庆祝下Air2.0版Rock506Dock beta1.0上线~
  7. 用pyhton爬虫技术爬取所有股票的每周价格
  8. 什么是依赖注入和控制反转
  9. SLM328美格4G模组SDK开发笔记
  10. 子查询中all与any的区别