2025年4月15日 星期二 乙巳(蛇)年 正月十六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

OpenCV库破解 滑块 验证码

时间:04-24来源:作者:点击数:42

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!

今天为大家讲解一下如何通过OpenCV图像识别库破解滑块验证码

此方法能够为一下情景使用:

在这里插入图片描述

已处理的案例:头号、京、抖*、企*号等

一、处理滑块主要流程步骤

  • 前置配置(安装相关的库)
  • 验证码图片下载
  • 计算偏移量
  • 实现拟人化滑动效果

1.安装

selenium 支持 python2.7 以及 python3.5 等主流 python 版本,其安装较为简单,有网的环境下,打开cmd输入即可自动安装: pip install selenium

2.webdriver

selenium 安装完成后,下载所选浏览器的 webdriver,本文以 ChromeDriver为例,下载解压后切记将.exe文件放入对应Python应用程序的同级目录下,以确保将 webdriver 的路径添加至系统 PATH 变量中。同时还需将.exe文件放入Chrome应用程序的同级目录下,注意下载的ChromeDriver版本需与Chrome浏览器版本对应才可使用。ChromeDriver下载地址

3.open-cv

在计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。此外,OpenCV还提供了Java、python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。

  • pip install opencv-python
  • pip install opencv-python==3.3.0.10 -i https://pypi.doubanio.com/simple

二、获取图片并保存到本地

  • def slider_verify(self):
  • # 根据偏移量和手动操作模拟计算移动轨迹
  • try_verify = 0
  • SigninPage = self.driver.current_url
  • while try_verify >= 10:
  • try:
  • time.sleep(random.uniform(4, 6))
  • CurrentPage = self.driver.current_url
  • if SigninPage != CurrentPage:
  • print("slider verify success")
  • time.sleep(5)
  • break
  • # 获取背景图片元素
  • target = self.driver.find_element_by_xpath('//img[@id="captcha-verify-image"]')
  • # 获取滑块图片元素
  • template = self.driver.find_element_by_xpath(
  • '//*[@id="sdk-login-box-slide-container"]/div/div[2]/img[2]')
  • image_background = target.get_attribute('src') # 获取背景元素下载路径
  • image_slider = template.get_attribute('src') # 获取滑块元素下载路径
  • # request请求图片路径保存为二进制格式,并将其存为图片保存到本地
  • res_background = requests.get(image_background)
  • tth_background = res_background.content
  • with open('./background.png', 'wb')as f:
  • f.write(tth_background)
  • res_slider = requests.get(image_slider)
  • tth_slider = res_slider.content
  • with open('./slider.png', 'wb')as f:
  • f.write(tth_slider)
  • time.sleep(random.uniform(2, 4))
  • except Exception as error:
  • print("储存图片出错", error)
  • pass
  • # 通过open-cv计算背景片偏移量
  • distance = self.find_pic()
  • # calculate the scale
  • img = cv2.imread('./background.png') # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式
  • # 获取实际页面上背景图片的长度
  • w1 = img.shape[1]
  • w2 = target.size['width']
  • # 本地的图片尺寸和网页的尺寸计算出缩放比例,再把原本计算出的偏移进一步计算就可以得出网页上的偏移距离
  • distance = distance * w2 / w1
  • distance = int(distance)
  • print('distance:{} ,{} times to try'.format(distance, try_verify + 1))
  • self.slide_by_pyautogui(x=820, y=677, offset=distance) # 滑块的坐标与实际偏移量
  • try_verify += 1

三、核心图片识别算法

  • def find_pic(self, target='./background.png', template='./slider.png'):
  • try:
  • # 比较图片以找出距离
  • # 读取背景图片
  • target_rgb = cv2.imread(target)
  • # 灰度处理
  • target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)
  • # 读取滑块图片
  • template_rgb = cv2.imread(template, 0)
  • # 比较位置
  • res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)
  • # 获得结果
  • distance = cv2.minMaxLoc(res)
  • return distance[2][0]
  • except Exception as error:
  • print('破解函数出错')
  • print(error)

四、核心人工智能拟人算法滑动

由于某东的登陆滑块含有人工智能算法识别,因此该方法能成功绕过识别!如果没有识别的情况下利用普通的滑动算法也是可以的。

  • def slide_by_pyautogui(self, x, y, offset):
  • """
  • slide by pyautogui
  • :param x: X轴起始位置
  • :param y: Y轴起始位置
  • :param offset: 实际移动距离
  • """
  • # 人工智能拟人滑动算法,结合Opencv的成功率,目前有80%的成功率
  • xx = x + offset
  • pyautogui.moveTo(x, y, duration=2.3)
  • pyautogui.mouseDown()
  • y += random.randint(9, 19)
  • pyautogui.moveTo(x + int(offset * random.randint(15, 23) / 20), y, duration=2.4)
  • y += random.randint(-9, 0)
  • pyautogui.moveTo(x + int(offset * random.randint(17, 21) / 20), y, duration=(random.randint(20, 31)) / 100)
  • pyautogui.moveTo(xx, y, duration=1.8)
  • pyautogui.mouseUp()

完整的代码需要关注微信公众号【城东书院】(直接扫码)发送消息:opencv破解滑块验证码后台会自动回复。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门