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字符串的encode与decode研究心得乱码问题解决方法
Mar 23 Python
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
有趣的python小程序分享
Dec 05 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
利用Django模版生成树状结构实例代码
May 19 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
tensorflow自定义激活函数实例
Feb 04 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
详解python中的异常捕获
Dec 15 Python
用python删除文件夹中的重复图片(图片去重)
May 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 limit查询优化分析
2008/11/12 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
苹果香港官方商城:Apple香港
2016/09/14 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
运动会稿件100字
2014/02/21 职场文书
房产委托公证书
2014/04/08 职场文书
《观舞记》教学反思
2014/04/16 职场文书
餐厅筹备计划书
2014/04/25 职场文书
法制教育演讲稿
2014/09/10 职场文书
党员个人对照检查材料
2014/10/01 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
保送生自荐信
2015/03/06 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书