您当前的位置:首页 > 计算机 > 编程开发 > Python

OpenCV库破解 滑块 验证码

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

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

今天为大家讲解一下如何通过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破解滑块验证码后台会自动回复。

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