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的Django框架中settings文件的部署建议
May 30 Python
python pyheatmap包绘制热力图
Nov 09 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
python pandas 时间日期的处理实现
Jul 30 Python
python字符串格式化方式解析
Oct 19 Python
python随机生成库faker库api实例详解
Nov 28 Python
Python @property原理解析和用法实例
Feb 11 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
基于python实现模拟数据结构模型
Jun 12 Python
详解python爬取弹幕与数据分析
Nov 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提高编程效率的20个要点
2015/09/23 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
jquery使用经验小结
2015/05/20 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
Python2/3中urllib库的一些常见用法
2017/12/19 Python
详解Django的CSRF认证实现
2018/10/09 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
python GUI计算器的实现
2020/10/09 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
旅游管理毕业生自荐信
2013/11/05 职场文书
应聘自荐信
2013/12/14 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
生死抉择观后感
2015/06/09 职场文书
单身证明范本
2015/06/15 职场文书
Python闭包的定义和使用方法
2022/04/11 Python
Python matplotlib多个子图绘制整合
2022/04/13 Python