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之入门(五)缩进和选择
May 27 Python
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
python中正则表达式 re.findall 用法
Oct 23 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
python os.rename实例用法详解
Dec 06 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
python中sys模块的介绍与实例
Apr 17 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 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
用mysql内存表来代替php session的类
2009/02/01 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
js确定对象类型方法
2012/03/30 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
JavaScript字符串对象
2017/01/14 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
详解Python 调用C# dll库最简方法
2019/06/20 Python
深入学习python多线程与GIL
2019/08/26 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python实现控制台输出颜色
2021/03/02 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
优秀求职自荐信怎样写
2013/12/18 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
中学教师个人总结
2015/02/10 职场文书
初中毕业感言300字
2015/07/31 职场文书
python常见的占位符总结及用法
2021/07/02 Python
Redis集群的关闭与重启操作
2021/07/07 Redis
Python中rapidjson参数校验实现
2021/07/25 Python