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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
python根据路径导入模块的方法
Sep 30 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
Python实现带参数与不带参数的多重继承示例
Jan 30 Python
Python实现按照指定要求逆序输出一个数字的方法
Apr 19 Python
Python错误处理操作示例
Jul 18 Python
Python爬取成语接龙类网站
Oct 19 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
python单例设计模式实现解析
Jan 07 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
Python matplotlib实时画图案例
Apr 23 Python
python中的split、rsplit、splitlines用法说明
Oct 23 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 DataGrid 实现代码
2009/08/12 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
PHP生成plist数据的方法
2015/06/16 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
利用js对象弹出一个层
2008/03/26 Javascript
javascript add event remove event
2008/04/07 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Django自定义分页效果
2017/06/27 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
python实现控制台打印的方法
2019/01/12 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
python 实现dict转json并保存文件
2019/12/05 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
HTTP状态码详解
2021/03/18 杂记
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
个人自我鉴定总结
2014/03/25 职场文书
毕业典礼邀请函
2015/01/31 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL