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 相关文章推荐
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 Python
Python WEB应用部署的实现方法
Jan 02 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
超级实用的8个Python列表技巧
Aug 24 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
python实现层次聚类的方法
Nov 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利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
社区中秋节活动方案
2014/01/29 职场文书
《赶海》教学反思
2014/04/20 职场文书
平安工地建设方案
2014/05/06 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
java executor包参数处理功能 
2022/02/15 Java/Android
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
对象析构函数__del__在Python中何时使用
2022/03/22 Python