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获取服务器信息的最简单实现方法
Mar 05 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
python实现微信自动回复机器人功能
Jul 11 Python
在django中,关于session的通用设置方法
Aug 06 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Python趣味入门教程之循环语句while
Aug 26 Python
pycharm永久激活超详细教程
Oct 29 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 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设计模式 Facade(外观模式)
2011/06/26 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
Python迭代器和生成器介绍
2015/03/06 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
优秀大学生的自我评价
2014/01/16 职场文书
中国好声音广告词
2014/03/18 职场文书
百年校庆节目主持词
2014/03/27 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
企业党员个人自我评价
2014/09/20 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
财务经理岗位职责
2015/01/31 职场文书
开学典礼观后感
2015/06/15 职场文书
农贸批发市场管理制度
2015/08/07 职场文书