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日

相关文章

  • 详解Nginx SSL快速双向认证配置(脚本)

    下面我来详细讲解如何快速地配置Nginx SSL双向认证。 1. 前置条件 在配置Nginx SSL双向认证之前,需要满足以下几个前置条件: 已经安装了Nginx服务器 已经准备好了SSL证书和密钥 已经安装了openssl工具和expect脚本 2. 创建SSL证书 首先,需要创建SSL证书和密钥。你可以使用openssl工具来创建自签名证书和密钥,具体操…

    人工智能概览 2023年5月25日
    00
  • nginx 平滑重启与升级的实现方法

    Nginx 平滑重启与升级的实现方法 Nginx 是一种高性能的 Web 服务器,广泛应用于各种规模的网站和应用程序中。当我们需要对 Nginx 进行升级或重启时,为了不影响服务的正常运转,我们需要采用平滑重启的方式进行升级或者重启。 平滑重启的概念 平滑重启可以实现在不停止服务的情况下对 Nginx 进行升级与重启。其主要原理是启动一个新的 Nginx 进…

    人工智能概览 2023年5月25日
    00
  • Python flask框架实现浏览器点击自定义跳转页面

    下面我将详细讲解Python Flask框架实现浏览器点击自定义跳转页面的完整攻略。 一、搭建Flask环境 要使用Flask框架,需要先安装Flask,并在本地搭建好Flask环境。具体的安装方法和环境搭建方法可以参考Flask官方文档。下面是安装Flask的简单步骤: 使用pip安装Flask:pip install Flask 创建Flask应用:在代…

    人工智能概论 2023年5月25日
    00
  • Python+SQLAlchemy轻松实现管理数据库

    下面是详细讲解Python + SQLAlchemy轻松实现管理数据库的完整攻略。 1. SQLAlchemy简介 SQLAlchemy是一个Python的ORM(Object Relational Mapping)库,它提供了一种将数据模型映射到关系型数据库中的方法。ORM库使得对数据库的操作更加方便,同时可以避免SQL注入等安全问题。SQLAlchemy…

    人工智能概览 2023年5月25日
    00
  • Python+OpenCV实现图像的全景拼接

    Python+OpenCV实现图像的全景拼接攻略 1. 准备工作和环境配置 在开始全景拼接之前,我们需要准备Python和OpenCV环境。其中Python必须是3.x版本。OpenCV可以使用pip命令进行安装(pip install opencv-python)。 2. 加载图像并进行特征匹配 在这个步骤中,我们需要加载所有需要拼接的图像。在OpenCV…

    人工智能概论 2023年5月25日
    00
  • Django 模板中常用的过滤器实现

    Django 模板中的过滤器是一种将变量进行处理的功能,可以对变量进行切片、大小写转换、字符串替换等操作,为模板的渲染提供了更加灵活的方法。下面是 Django 模板中常用的过滤器实现攻略: 1. 过滤器的基本语法 在 Django 模板中,过滤器是通过管道符( | )进行应用的。基本的语法格式如下: {{ variable|filter }} 其中 var…

    人工智能概论 2023年5月25日
    00
  • PyTorch中Tensor的拼接与拆分的实现

    下面是PyTorch中Tensor的拼接与拆分的实现攻略: 一、Tensor的拼接 在PyTorch中,我们可以使用torch.cat()函数将多个Tensor进行拼接。具体用法如下: torch.cat(tensors, dim=0, *, out=None) → Tensor 其中,参数tensors是一个需要拼接的Tensor序列,dim是拼接维度,默…

    人工智能概论 2023年5月25日
    00
  • Pytorch distributed 多卡并行载入模型操作

    PyTorch是一个非常流行的深度学习框架,支持分布式多卡并行,可以利用多个GPU加速模型训练。在多卡并行训练时,载入模型操作是非常重要的一个环节。本文将详细讲解PyTorch中多卡并行载入模型的详细攻略。 1.使用torch.nn.DataParallel 首先,PyTorch提供了torch.nn.DataParallel模块,可以方便地实现多卡并行。对…

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