python滑块验证码的破解实现


Posted in Python onNovember 10, 2019

破解滑块验证码的思路主要有2种:

  • 获得一张完整的背景图和一张有缺口的图片,两张图片进行像素上的一一对比,找出不一样的坐标。
  • 获得一张有缺口的图片和需要验证的小图,两张图片进行二极化以及归一化,确定小图在图片中间的坐标。
  • 之后就要使用初中物理知识了,使用直线加速度模仿人手动操作

本次就使用第2种,第一种比较简单。废话不多说,直接上代码:

以下均利用无头浏览器进行获取

获得滑块验证的小图片

def get_image1(self,driver):
  """
  获取滑块验证缺口小图片
  :param driver:chrome对象
  :return:缺口小图片
  """
  canvas = driver.find_element_by_xpath("//div[@id='xy_img']").get_attribute("style")
  image_data=re.findall("data:image/jpg;base64,(.*?)\"\)",canvas)[0]
  # print(image_data)
  binary_image_data=base64.b64decode(image_data,'-_')
  file_like=BytesIO(binary_image_data)
  image=Image.open(file_like)
  return image

一般来说,这张小图片都是独立的,比较好获取,图片如下:

python滑块验证码的破解实现

获得滑块验证的背景图片

!!!这个背景图片网页一般会返回乱序的图片,然后通过js对图片进行重新排序,要破解需要的时间较多,且每个js排序算法不一样,不具有复用性。这里就取了个巧,直接对当前浏览器截屏,然后在截取指定范围图片。

def get_image2(self,driver):
  """
  获取滑块验证码背景图片
  :param driver:chrome对象
  :return:背景图片
   """
  driver.save_screenshot('yanzhengma.png')
  # 通过图片元素节点获取坐标值
  # element = driver.find_element_by_id("bgImg")
  # left = element.location['x']
  # top = element.location['y']
  # right = element.location['x'] + element.size['width']
  # bottom = element.location['y'] + element.size['height']
  # 通过画图软件直接获取相应图片的坐标值
  left=359
  top=238
  right=658
  bottom=437
  # print((left, top, right, bottom))
  im = Image.open('yanzhengma.png')
  im = im.crop((left, top, right, bottom))
  return im

图片如下:

python滑块验证码的破解实现

轨迹计算方法

def get_track(self, distance):
  """
  根据偏移量获取移动轨迹
  :param distance:偏移量
  :return:移动轨迹
  """
  # 移动轨迹
  track = []
  # 当前位移
  current = 0
  # 减速阈值
  mid = distance * 4 / 5
  # 计算间隔
  t = 0.2
  # 初速度
  v = 0

  while current < distance:
    if current < mid:
      # 加速度为正2
      a = 2
    else:
      # 加速度为负3
      a = -3
    # 初速度v0
    v0 = v
    # 当前速度v = v0 + at
    v = v0 + a * t
    # 移动距离x = v0t + 1/2 * a * t^2
    move = v0 * t + 1 / 2 * a * t * t
    # 当前位移
    current += move
    # 加入轨迹
    track.append(round(move))
  return track

验证主程序

def slider_verification_code(self,driver,cnt):
  """
  破解滑块验证主程序
  :param driver:chrome对象;cnt:已验证次数
  :return:已验证次数
  """
  print("出现滑块验证,验证中")
  # 1、出现滑块验证,获取验证小图片
  picture1 = self.get_image1(driver)
  picture1.save("./picture1.png")
  # 2、获取有缺口验证图片
  picture2 = self.get_image2(driver)
  picture2.save("./picture2.png")
  #二值化图片,进行对比,输出匹配的坐标系
  target_rgb=cv2.imread("./picture2.png")
  target_gray=cv2.cvtColor(target_rgb,cv2.COLOR_BGR2GRAY)
  template_rgb=cv2.imread("./picture1.png",0)
  res=cv2.matchTemplate(target_gray,template_rgb,cv2.TM_CCOEFF_NORMED)
  value=cv2.minMaxLoc(res)
  value = value[3][0]
  cnt += 1
  print("需要位移的距离为:"+str(value)+",已验证"+str(cnt)+"次")
  #根据距离获取位移的轨迹路线
  track=self.get_track(value)
  time.sleep(1)
  ActionChains(driver).click_and_hold(driver.find_element_by_class_name("handler.handler_bg")).perform()
  for x in track:
    ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
  time.sleep(0.5)
  ActionChains(driver).release().perform()
  return cnt

看!有 飞 机:

python滑块验证码的破解实现

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

Python 相关文章推荐
一篇不错的Python入门教程
Feb 08 Python
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
利用python实现数据分析
Jan 11 Python
快速了解Python相对导入
Jan 12 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
Python如何把十进制数转换成ip地址
May 25 Python
解决python运行效率不高的问题
Jul 20 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
python opencv肤色检测的实现示例
Dec 21 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 #Python
分享PyCharm的几个使用技巧
Nov 10 #Python
Python单元测试与测试用例简析
Nov 09 #Python
python自动化测试之异常及日志操作实例分析
Nov 09 #Python
Python多线程模块Threading用法示例小结
Nov 09 #Python
Python for循环及基础用法详解
Nov 08 #Python
python常用排序算法的实现代码
Nov 08 #Python
You might like
php目录管理函数小结
2008/09/10 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
强制设为首页代码
2006/06/19 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Python标准库itertools的使用方法
2020/01/17 Python
python实现logistic分类算法代码
2020/02/28 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
大学生自我鉴定
2013/12/16 职场文书
中国文明网签名寄语
2014/01/18 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
医院节能减排方案
2014/06/13 职场文书
党员志愿者活动方案
2014/08/28 职场文书
大学生个人学年总结
2015/02/15 职场文书
确保工程质量承诺书
2015/04/29 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript