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实现文件快照加密保护的方法
Jun 30 Python
简单掌握Python的Collections模块中counter结构的用法
Jul 07 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
Python制作exe文件简单流程
Jan 24 Python
Django Rest framework三种分页方式详解
Jul 26 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
python 模拟登录B站的示例代码
Dec 15 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python新手入门最容易犯的错误总结
2017/04/24 Python
python 读取文件并替换字段的实例
2018/07/12 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
大学生心理活动总结
2014/07/04 职场文书
信访工作个人总结
2015/03/03 职场文书
大学生自荐书范文
2015/03/05 职场文书
户外亲子活动总结
2015/05/08 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
一文搞懂Java中的注解和反射
2022/06/21 Java/Android