Python实现滑块验证码详解

Python实现滑块验证码详解

简介

滑块验证码是当前主流的验证码之一,其通过让用户拖动滑块来验证身份,比传统的输入验证码更加便捷和直观。因此在很多网站中都广泛应用。

实现流程

1. 获取验证码图片

首先,需要从验证码接口或者其他途径获取验证码图片。一般来说,验证码图片都是由字符或者数字组成的图片,而滑块通常是一张带有缺口的验证码图片。

2. 切分验证码图片

将获取到的验证码图片进行切分,分为包含滑块的图片部分和滑块部分两组图片。

其中,包含滑块的图片部分且不包含滑块缺口的一侧为背景图片部分,另外一侧分别为滑块位置的原图和滑块的验证图。

3. 模板匹配

使用模板匹配算法,通过比对滑块验证图和包含滑块的原图的相似度,以此来得出滑块在原图中的位置。

通过一些基本的计算,可以得到滑块移动的距离,即为滑块实际距离 - 滑块原本位置的距离。

示例1:通过OpenCV实现

import cv2
import numpy as np

BG_PATH = 'screenshot_bg.png'
SLIDER_PATH = 'screenshot_slider.png'

class Verifier:

    def __init__(self):
        self.bg = cv2.imread(BG_PATH)
        self.slider = cv2.imread(SLIDER_PATH)
        self.width, self.height = self.bg.shape[:2]
        self.temp = 'temp.jpg'

    def find_slider(self):
        result = cv2.matchTemplate(self.bg, self.slider, cv2.TM_CCOEFF_NORMED)
        return np.where(result >= 0.98)

    def cut_image(self, img, x, y, w, h):
        return img[y:y + h, x:x + w]

    def detect_slider_position(self):
        x, y = self.find_slider()
        x, y = int(x[0]), int(y[0])
        # 滑块位置
        slider = self.cut_image(self.bg, x, y, 75, 45)
        cv2.imwrite(self.temp, slider)
        # 滑块验证图
        slider_img = cv2.imread(self.temp)
        # 包含滑块的原图
        bg = self.cut_image(self.bg, 0, 0, x + 75, self.height)
        res = cv2.matchTemplate(bg, slider_img, cv2.TM_CCOEFF_NORMED)
        x, *_ = np.where(res > 0.9)
        distance = x[0]
        print('距离为:', distance)

v = Verifier()
v.detect_slider_position()

在这个示例中,我们使用了OpenCV库对验证码进行切分,返回滑块在原图中的位置,并计算出滑块的移动距离。

示例2:通过Selenium和Pillow实现

from io import BytesIO

from selenium import webdriver
from PIL import Image

DRIVER_PATH = 'chromedriver.exe'
URL = 'https://www.geetest.com/demo/slide-popup.html'

class Verifier:

    def __init__(self):
        self.driver = webdriver.Chrome(DRIVER_PATH)

    def get_screenshot(self):
        # 获取滑块页面的截图
        screenshot = self.driver.get_screenshot_as_png()
        screenshot = Image.open(BytesIO(screenshot))
        return screenshot

    def get_position(self):
        # 获取滑块图片,并得到滑块在原图中的位置
        screenshot = self.get_screenshot()
        captcha_img = screenshot.crop((690, 390, 1030, 510))
        background_img = screenshot.crop((0, 0, 690, 510))
        captcha_img.save('captcha.jpg')
        background_img.save('background.jpg')
        captcha = Image.open('captcha.jpg')
        bg = Image.open('background.jpg')
        res = Image.fromarray(np.array(bg) - np.array(captcha))
        res.save('res.jpg')
        w, h = captcha.size
        for distance in range(w):
            for i in range(h):
                r, g, b = captcha.getpixel((distance, i))
                if r < 60 and g < 60 and b < 60:
                    print('距离为:', distance)
                    return distance

    def move_slider(self, distance):
        # 拖动滑块
        slider = self.driver.find_element_by_css_selector('.geetest_slider_button')
        webdriver.ActionChains(self.driver).click_and_hold(on_element=slider).perform()
        webdriver.ActionChains(self.driver).move_by_offset(xoffset=distance - 7, yoffset=0).perform()
        webdriver.ActionChains(self.driver).release(on_element=slider).perform()

v = Verifier()
v.driver.get(URL)
v.get_position()
v.move_slider(210)

在这个示例中,我们使用了Selenium库模拟用户滑动验证码操作,并使用了Pillow库对验证码进行切分。

总结

本文从实现流程出发,给出了两个示例代码,演示了如何通过代码实现滑块验证码。在实现过程中,我们利用了图像处理技术,使用模板匹配算法得出了滑块在原图中的位置,并根据计算得到了滑块的移动距离。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现滑块验证码详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Django 路由系统URLconf的使用

    下面是关于Django路由系统URLconf的使用的完整攻略: 什么是URLconf URLconf全名为URL configuration,它是Django框架中的一个模块,它用于定义URL地址与对应的视图函数之间的映射关系。URLconf通过将URL映射到对应的视图函数,实现了MVC(Model-View-Controller)模式中的控制器部分。 UR…

    人工智能概览 2023年5月25日
    00
  • VSCode下配置python调试运行环境的方法

    下面是详细的”VSCode下配置Python调试运行环境的方法”攻略: 1. 安装 Python 解释器 在 VSCode 之前,我们需要安装 Python 解释器。可以到 Python 官网下载。 安装好 Python 后,可以在命令行(terminal)执行以下命令来验证 Python 是否安装成功: python –version 如果出现了 Pyt…

    人工智能概览 2023年5月25日
    00
  • Django全局启用登陆验证login_required的方法

    想要在Django项目中全局启用登陆验证 login_required,需要经过以下步骤: 1. 导入 login_required 函数 login_required 函数位于 django.contrib.auth.decorators 模块中,需要先导入此模块。在 Django 的视图函数中使用 login_required 装饰器,可以达到需要登录才…

    人工智能概览 2023年5月25日
    00
  • OpenCV实现Sobel边缘检测的示例

    下面是关于“OpenCV实现Sobel边缘检测的示例”的完整攻略。 1. 背景介绍 Sobel算子是图像处理中一种简单有效的边缘检测算法,可用于快速检测图像中的边缘。OpenCV是一个广泛使用的计算机视觉库,可用于各种视觉任务,包括图像处理和图像分析。在这个示例中,我们将学习如何使用OpenCV实现Sobel算子检测图像边缘的方法。 2. 实现步骤 2.1 …

    人工智能概论 2023年5月25日
    00
  • java使用电脑摄像头识别二维码

    Java使用电脑摄像头识别二维码攻略 简介 本攻略主要介绍如何使用Java语言操作电脑摄像头,并借助相关库识别二维码。 准备工作 安装Java运行环境(JRE) 下载并安装Java开发工具(如Eclipse、IntelliJ IDEA等) 下载安装OpenCV库(可选,用于操作电脑摄像头) 操作电脑摄像头 方案一:使用JMF库 Java Media Fram…

    人工智能概论 2023年5月25日
    00
  • ABBYY FineReader 12怎么安装 ABBYY FineReader12图文安装教程

    ABBYY FineReader 12的安装教程 ABBYY FineReader 12是一个OCR(Optical Character Recognition)软件,主要用于将纸质文档转换为可编辑或可搜索的电子文档。下面是ABBYY FineReader 12的安装教程。 步骤1:下载安装文件 首先需要从ABBYY公司的官方网站上下载ABBYY FineR…

    人工智能概览 2023年5月25日
    00
  • python性能测试工具locust的使用

    下面是关于Python性能测试工具Locust的详细使用攻略。 一、Locust简介 Locust是Python编写的基于协程的开源负载测试工具,它提供了Web UI界面方便用户进行测试,并且支持分布式负载测试。Locust可以实现在Python代码中编写灵活的测试代码,并且支持针对API、网站和其他Web应用程序进行负载测试。 二、Locust安装及使用 …

    人工智能概览 2023年5月25日
    00
  • Dubbo 系列JDK SPI 原理解析

    Dubbo 系列JDK SPI 原理解析 什么是SPI SPI,全称为 Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口集合。简单来说,SPI就是一种动态加载机制。在SPI中,我们定义了一个接口,这个接口可以有多种实现方式,而这些实现方式,都是以文件的形式存在。当我们需要某一个接口的实现时,我们只要定义…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部