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 greenlet实现原理和使用示例
Sep 24 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
python字符串过滤性能比较5种方法
Jun 22 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
浅谈python3中input输入的使用
Aug 02 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
PyTorch预训练的实现
Sep 18 Python
python3中rank函数的用法
Nov 27 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
python 实现两个npy档案合并
Jul 01 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
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
javascript 对象的定义方法
2007/01/10 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
酒店秘书求职信范文
2014/02/17 职场文书
《颐和园》教学反思
2014/02/26 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
安全责任书
2015/01/29 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Python日志模块logging用法
2022/06/05 Python