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 strip() 函数和 split() 函数的详解及实例
Feb 03 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
Django框架实现的普通登录案例【使用POST方法】
May 15 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 Python
Python读取ini配置文件传参的简单示例
Jan 05 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 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文件上传实例详解!!!
2007/01/02 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
python的多重继承的理解
2017/08/06 Python
Python实现的桶排序算法示例
2017/11/29 Python
Python OS模块实例详解
2019/04/15 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Python如何操作docker redis过程解析
2020/08/10 Python
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
Python IO文件管理的具体使用
2022/03/20 Python
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS