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 os模块介绍
Nov 30 Python
部署Python的框架下的web app的详细教程
Apr 30 Python
详解Python中类的定义与使用
Apr 11 Python
python flask实现分页效果
Jun 27 Python
python处理按钮消息的实例详解
Jul 11 Python
python多进程实现进程间通信实例
Nov 24 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
OpenCV+Python识别车牌和字符分割的实现
Jan 31 Python
python绘制雪景图
Dec 16 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
php实现点击可刷新验证码
2015/11/07 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
JavaScript中的this实例分析
2011/04/28 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
js实现消息滚动效果
2017/01/18 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
社会实践先进工作者事迹材料
2014/05/06 职场文书
行政答辩状范文
2015/05/21 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python