美文网首页
聊聊滑块验证码的识别

聊聊滑块验证码的识别

作者: zhangke3016 | 来源:发表于2018-09-26 22:52 被阅读1552次

很长一段时间没写文章了,今天来一篇,聊聊滑块验证码。之前一段时间在研究下滑块验证码相关的东西,拿腾讯的验证码来玩,使用Selenium来模拟滑动,这里也就先不介绍Selenium 的基本用法来,主要来聊聊怎么实现滑块验证码的识别问题。
滑块验证码可以说是目前使用最多,体验相对比较好的验证方式来,在反爬虫上面也确实有比较好的效果,但爬虫和反爬虫,本身就是一对冤家,相互促进项目影响。废话不多说,直接上滑块验证码的干货吧。

一、目标

就拿腾讯的滑块验证码来说吧,其他滑块也比较类似,就这个:

QQ滑块
先大概梳理一下这个特征,点击验证,弹出这个滑块验证码,用鼠标拖动到缺口阴影位置松手即可实现验证。
逻辑比较简单,目前要处理的核心问题就是怎么找到这个阴影位置,因为可能有不同的图片而且图片中缺口阴影的位置也不确定。
问题可以简化为:如何找到背景图中缺口的准确位置

二、查找缺口阴影位置

定下了解决问题的目标,下一步就是查找当前的已知条件,看看已知条件能否找到突破口,目前我们可以确定的是,如果要用滑块验证码,至少要有两样东西:

  1. 滑动的滑块图形,就是这个:
滑块图
  1. 滑动要拼出的背景图,就是这个:
背景图

这两个家伙是每个滑块都有的东西,先从这两个上面入手:

先试着处理下背景图,这里用python来写了:

from PIL import Image
if __name__ == "__main__":
    Image.open('hycdn_1_1585354975542067968_0.jpeg').convert('L').save('cap4.jpg')

我们将这个背景图片置成灰色图片看看,现在是这个样子:


置成灰色图片

现在这个背景图没有其他杂色了,再看这个缺口位置,颜色要更深一点,那接下来就处理下滑块了,让它尽量和这个缺口相似:

def convert(imgName, saveName):
    im = Image.open(imgName)
    im = im.convert('RGBA')

    width = im.size[0]
    height = im.size[1]
    for h in range(0, height):
        for w in range(0, width):
            pixel = im.getpixel((w, h))
            if pixel[0] > 0 and pixel[1] > 0 and pixel[2] > 0 and pixel[3] > 0:
                im.putpixel((w, h), (0,0,0, 220))
            elif pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0:
                im.putpixel((w, h), (0, 0, 0, 220))
            else:
                pass
    im.save(saveName)

convert('hycdn_2_1585354975542067968_0.png','cap2.png')

将整张滑块图进行像素调节,这个调节值是反复试出来的,出来的效果是这样:


处理后滑块

这样处理后,我们要做的其实就剩下最后一步了:从这个背景图中找出和这个滑块最相似的图形并标记出来

这里使用了一个开源库aircv,Github上地址是https://github.com/NetEaseGame/aircv,大概使用方式是这个:

import aircv as ac
imsrc = ac.imread('youimage.png') # 原始图像
imsch = ac.imread('searched.png') # 带查找的部分
ac.find_template(imsrc, imsch)
#返回值
#{'confidence': 0.5522063970565796, 'result': (557, 214), 'rectangle': ((489, 146), (489, 282), (625, 146), (625, 282))}
# result: 查找到的点
# rectangle: 目标图像周围四个点的坐标
# confidence: 查找图片匹配成功的特征点 除以 总的特征点

从图形中查找相似部分,详细使用可以查看Github。
我们这样处理一下:

    imsrc = ac.imread('cap4.jpg')
    imobj = ac.imread('cap2.png')

    # find the match position
    pos = ac.find_template(imsrc, imobj)

    print pos
    # {'confidence': 0.5522063970565796, 'result': (557, 214), 'rectangle': ((489, 146), (489, 282), (625, 146), (625, 282))}

    color = (0, 255, 0)
    line_width = 10

    draw_rectangle(imsrc, pos['rectangle'][0], pos['rectangle'][-1], color, line_width)

python-opencv2绘制一下区域看看:

import cv2
def draw_rectangle(img, pos1, pos2, color, line_width):
    cv2.rectangle(img, pos1, pos2, color, line_width)
    cv2.imshow('objDetect', imsrc)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

好啦,我们看下效果:


成功命中

再试几个看看:



相关文章

  • 聊聊滑块验证码的识别

    很长一段时间没写文章了,今天来一篇,聊聊滑块验证码。之前一段时间在研究下滑块验证码相关的东西,拿腾讯的验证码来玩,...

  • 七步完美解决问题python爬虫极验滑动验证码问题!

    滑动验证码的识别介绍 本节目标: 用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径...

  • Python爬虫 | 滑动验证码破解

    极验验证码:需要手动拼合滑块来完成的验证,相对图形验证码识别难度上升了几个等级。下面用程序识别并通过极验验证码的验...

  • 验证码识别综述

    目录 1.输入识别出的字符类验证码2.点选类验证码3.拖动滑块到指定位置的验证码4.OCR资源集合 1. 输入识别...

  • 使用MaskRCNN进行手势验证码识别

    相信做某本地生活平台网站爬虫的同学,饱受手势验证码的困扰,这类验证码相比滑块验证码,识别难度更大。 看到这种验证码...

  • 滑块验证码识别

    视频演示: (因我的笔记本配置不好,视频中程序运行较慢,请各位谅解,观看中保持耐心,谢谢) 应用于云爬虫平台...

  • Python+Selenium 拖动滑块 (一)

    在我们登录账号中常常会遇到各种验证码,如图片验证码,拖动滑块验证.....滑块验证码只需要用户使用鼠标将滑块从某个...

  • 爬虫滑动验证识别 opencv-python

    前言 滑块验证码破解是一直都是一个棘手的问题,毕竟多数网站都会采用滑块验证码要搞现在的滑块验证码绕不开图像处理,图...

  • Python破解GeeTest滑块验证码offline V5.1

    GeeTest滑块验证码通过机器学习检查鼠标行为轨迹,识别人工或机器行为。online在线验证的流程,目前最全面的...

  • selenium:如何模拟鼠标拖放(drag and drop)

    鼠标拖放是手工常用操作,可以用于移动元素,如,用于拖放验证码滑块等,以大麦网登录界面验证码滑块为例,介绍如下: (...

网友评论

      本文标题:聊聊滑块验证码的识别

      本文链接:https://www.haomeiwen.com/subject/rvejoftx.html