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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
jupyter安装小结
Mar 13 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
通过python3实现投票功能代码实例
Sep 26 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
python初步实现word2vec操作
Jun 09 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 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
在字符串中把网址改成超级链接
2006/10/09 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
django批量导入xml数据
2016/10/16 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python常用特殊方法实例总结
2019/03/22 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
公务员政审个人鉴定
2014/02/25 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
九寨沟导游词
2015/02/02 职场文书
公司宣传语大全
2015/07/13 职场文书
党校培训学习心得体会
2016/01/06 职场文书