OpenCV搞定腾讯滑块验证码的实现代码


Posted in Python onMay 18, 2019

前言

废话

滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码绕不开图像处理,图像处理当然是首推OpenCV-Python啦!当然我的OpenCV非常菜(P.S.两天速成不敢保证代码质量),发现问题就直接指出嘛,不用走流程啦!

环境

首先需要一个python,然后安装opencv的python库,如下:

pip install opencv-python

然后测试一下是否可用,如下:

import cv2 as cv
import numpy as np

if __name__ == '__main__':
 img = np.ones((200, 200, 3), np.uint8) * 255
 cv.rectangle(img, (50, 50), (150, 150), (0, 0, 255), 2)
 cv.imshow('test', img)
 cv.waitKey(0)
 cv.destroyAllWindows()

正常的话就会如下显示:

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV的使用

相关的API我也是边用边查的,用得也是相当生疏!具体的常用方法大家只好自行百度了,我就不献丑了!

实现原理及方法

腾讯滑块验证

这次搞得目标就是腾讯滑块验证码,调用腾讯滑块这个接口的网站还是挺多的,比如非常好用的在线画图网站ProcessOn,其中滑块验证部分类似这样子的:

OpenCV搞定腾讯滑块验证码的实现代码

抓个包发现只有滑块图和带缺口的图,如下:

OpenCV搞定腾讯滑块验证码的实现代码

破解滑块验证码最为关键的地方在于找到滑块缺口的位置,找到缺口位置后就可以利用Selenium模拟拖动滑块到指定位置实现破解,之前的老办法就是将完整图的像素点和带缺口图的像素点进行比较从而得到缺口位置,但是现在一般不会将完整图暴露给我们,所以只有在带有缺口的图上进行处理。我这里一共有两种方案进行缺口位置识别,一种是基于模板匹配的,另一种是基于轮廓检测的,下面会细讲两种方案的实现方法。

模板匹配识别缺口

具体是实现过程如下:

1.处理滑块的图片

  • 灰度化滑块图片
  • 处理一下滑块图中滑块的外圈
  • 使用inRange二值化滑块图
  • 使用开运算去除白色噪点

运行结果如下所示(左侧为原始滑块,右侧为处理后的滑块):

OpenCV搞定腾讯滑块验证码的实现代码

2.处理带缺口的图片

  • 先来个高斯滤波去噪
  • 灰度化带缺口图
  • 使用阈值二值化该图

运行结果如下所示(左侧为原始图,右侧为处理后的图):

OpenCV搞定腾讯滑块验证码的实现代码

3.进行模板匹配

调用模板匹配API并圈出匹配上的区域,结果如下所示:

OpenCV搞定腾讯滑块验证码的实现代码

警告警告警告

这种方法的缺口识别率在50%左右,很大一部分原因是滑块图的背景为纯白色,这在匹配时会产生很大的干扰,要是能将滑块图的背景变为透明,正确的匹配率可以达到90%以上

如果大家有任何将滑块图的背景变为透明的办法,可以留言到评论区,我真的万分感谢!!!下面是现阶段的实现代码:

# encoding:utf-8
import cv2 as cv
import numpy as np


# 对滑块进行二值化处理
def handle_img1(image):
  kernel = np.ones((8, 8), np.uint8) # 去滑块的前景噪声内核
  gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  width, heigth = gray.shape
  for h in range(heigth):
    for w in range(width):
      if gray[w, h] == 0:
        gray[w, h] = 96
  # cv.imshow('gray', gray)
  binary = cv.inRange(gray, 96, 96)
  res = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开运算去除白色噪点
  # cv.imshow('res', res)
  return res


# 模板匹配(用于寻找缺口有点误差)
def template_match(img_target, img_template):
  tpl = handle_img1(img_template) # 误差来源就在于滑块的背景图为白色
  blurred = cv.GaussianBlur(img_target, (3, 3), 0) # 目标图高斯滤波
  gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
  ret, target = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 目标图二值化
  # cv.imshow("template", tpl)
  # cv.imshow("target", target)
  method = cv.TM_CCOEFF_NORMED
  width, height = tpl.shape[:2]
  result = cv.matchTemplate(target, tpl, method)
  min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
  left_up = max_loc
  right_down = (left_up[0] + height, left_up[1] + width)
  cv.rectangle(img_target, left_up, right_down, (0, 0, 255), 2)
  cv.imshow('res', img_target)


if __name__ == '__main__':
  img0 = cv.imread('./demo/3/hycdn_3.jpg')
  img1 = cv.imread('./demo/3/hycdn_3_2.png')
  template_match(img0, img1)
  cv.waitKey(0)
  cv.destroyAllWindows()

轮廓检测识别缺口

基于轮廓检测缺口的思路简单很多,加上合理的条件识别率在95%以上,实现过程如下:

带缺口图高斯模糊去噪用(200,400)的阈值做Canny边缘检测寻找轮廓对已有的轮廓做约束,比如轮廓的面积范围,轮廓的周长范围

多个匹配结果如下:

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV搞定腾讯滑块验证码的实现代码

实现代码如下:

# encoding:utf-8
import cv2 as cv


def get_pos(image):
  blurred = cv.GaussianBlur(image, (5, 5), 0)
  canny = cv.Canny(blurred, 200, 400)
  contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
  for i, contour in enumerate(contours):
    M = cv.moments(contour)
    if M['m00'] == 0:
      cx = cy = 0
    else:
      cx, cy = M['m10'] / M['m00'], M['m01'] / M['m00']
    if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390:
      if cx < 400:
        continue
      x, y, w, h = cv.boundingRect(contour) # 外接矩形
      cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
      cv.imshow('image', image)
      return x
  return 0


if __name__ == '__main__':
  img0 = cv.imread('./demo/4/hycdn_4.jpg')
  get_pos(img0)
  cv.waitKey(0)
  cv.destroyAllWindows()

遗留问题

问题1

如何将滑块图的纯白背景变为透明背景?

问题2

使用Selenium和轨迹算法拖动滑块时将滑块拖出左侧的范围之外,轨迹算法是先加速后减速整体是向前移动的,按道理来说不可能往回走,但是模拟拖动的时候会出现滑块向后拖动且拖出范围的现象,这问题如何解决?

OpenCV搞定腾讯滑块验证码的实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中执行shell命令的几个方法小结
Sep 18 Python
使用Python解析JSON数据的基本方法
Oct 15 Python
Tornado 多进程实现分析详解
Jan 12 Python
python实现拓扑排序的基本教程
Mar 11 Python
python中for用来遍历range函数的方法
Jun 08 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
python字符串格式化方式解析
Oct 19 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
Python join()函数原理及使用方法
Nov 14 Python
Python3匿名函数lambda介绍与使用示例
May 18 #Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 #Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 #Python
python的内存管理和垃圾回收机制详解
May 18 #Python
Django处理多用户类型的方法介绍
May 18 #Python
Django 配置多站点多域名的实现步骤
May 17 #Python
将Python字符串生成PDF的实例代码详解
May 17 #Python
You might like
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
php实现的日历程序
2015/06/18 PHP
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
React简单介绍
2017/05/24 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
python 查找字符串是否存在实例详解
2017/01/20 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Python imread、newaxis用法详解
2019/11/04 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
八年级数学教学反思
2014/01/31 职场文书
标准化管理实施方案
2014/02/25 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
2014年环保局工作总结
2014/12/11 职场文书
运动会入场词
2015/07/18 职场文书