OpenCV搞定腾讯滑块验证码的实现代码
作者:1treeS 发布时间:2022-09-09 21:41:04
前言
废话
滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码绕不开图像处理,图像处理当然是首推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的使用
相关的API我也是边用边查的,用得也是相当生疏!具体的常用方法大家只好自行百度了,我就不献丑了!
实现原理及方法
腾讯滑块验证
这次搞得目标就是腾讯滑块验证码,调用腾讯滑块这个接口的网站还是挺多的,比如非常好用的在线画图网站ProcessOn
,其中滑块验证部分类似这样子的:
抓个包发现只有滑块图和带缺口的图,如下:
破解滑块验证码最为关键的地方在于找到滑块缺口的位置
,找到缺口位置后就可以利用Selenium
模拟拖动滑块到指定位置实现破解,之前的老办法就是将完整图的像素点和带缺口图的像素点进行比较从而得到缺口位置
,但是现在一般不会将完整图暴露给我们,所以只有在带有缺口的图上进行处理。我这里一共有两种方案进行缺口位置识别,一种是基于模板匹配
的,另一种是基于轮廓检测
的,下面会细讲两种方案的实现方法。
模板匹配识别缺口
具体是实现过程如下:
1.处理滑块的图片
灰度化滑块图片
处理一下滑块图中滑块的外圈
使用inRange二值化滑块图
使用开运算去除白色噪点
运行结果如下所示(左侧为原始滑块,右侧为处理后的滑块):
2.处理带缺口的图片
先来个高斯滤波去噪
灰度化带缺口图
使用阈值二值化该图
运行结果如下所示(左侧为原始图,右侧为处理后的图):
3.进行模板匹配
调用模板匹配API并圈出匹配上的区域,结果如下所示:
警告警告警告
这种方法的缺口识别率在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边缘检测寻找轮廓对已有的轮廓做约束,比如轮廓的面积范围,轮廓的周长范围
多个匹配结果如下:
实现代码如下:
# 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
和轨迹算法拖动滑块时将滑块拖出左侧的范围之外,轨迹算法是先加速后减速整体是向前移动的,按道理来说不可能往回走,但是模拟拖动的时候会出现滑块向后拖动且拖出范围的现象,这问题如何解决?
来源:https://segmentfault.com/a/1190000019218588


猜你喜欢
- 经过实验,新建一个excel表格,该表格拥有7个sheet,每个sheet有800条数据,其中最后一个sheet为空。首先使用openpyx
- 新特性的产生背景在了解它怎么用之前,可以先了解一下它被推出的一些背景,可以帮助你对比开发体验上的异同点,以及了解为什么会有这一章节里面的新东
- DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type)这些函
- 本文研究的主要是Python使用requests及BeautifulSoup构建一个网络爬虫,具体步骤如下。功能说明在Python下面可使用
- 0、前言在以前读书的时候,实验室里面要求每天都要关电脑,有时候出去玩得晚了,懒得回实验室关电脑,又没有同学帮忙。于是就想,能不能通过什么手段
- 使用astype实现dataframe字段类型转换# -*- coding: UTF-8 -*-import pandas as pddf
- 弹出层提示信息,这是移动前端开发中最常见的需求,你可能会想到一些流行的弹框插件,比如 经典的artDialog 炫酷的Sweetalert等
- 一、图图:数据(张量Tenrsor)+ 操作(节点Operation) (静态)图可以用:1、默认图;2、自定义图。1、默认图查看默认图的方
- 用于制作自动化微信聊天图片,通过图片生成段子视频根据一个txt文档input.txtL 一路走过来好热啊
- 1. 功能分析1.加载文件夹内所有的Excel数据;2.生产贡献度分析图表(以柱状图显示表格数据);3.提起Excel表格中指定列数据;4.
- CKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、
- 本文实例为大家分享了Golang实现断点续传的具体代码,供大家参考,具体内容如下1、将文件pic_src.jpg复制到pic_des.jpg
- 我们需要开始思考如何将文本集合转化为可量化的东西。最简单的方法是考虑词频。我将尽量尝试不使用NLTK和Scikits-Learn包。我们首先
- PyTorch基础入门一:PyTorch基本数据类型1)Tensor(张量)Pytorch里面处理的最基本的操作对象就是Tensor(张量)
- 本文实例为大家分享了python统计序列中元素的具体代码,供大家参考,具体内容如下问题1: &
- Nodejs 连接 mysql时报Error: Cannot enqueue Query after fatal error错误的处理办法一
- 上一篇介绍了如何在 Oracle 生成随机数字、字符串、日期、验证码以及 UUID,今天我们继续讨论在 MySQL 中生成各种随机数据的方法
- 前言Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计
- 1.最基本的作为一个本本分分的函数声明使用。 function func(){} 或 var func=function(){}; 2.作为
- 项目信号处理和提取部分用到了matlab,需要应用到工程中方便研究。用具有万能粘合剂之称的“Python”。具体方法如下:1.python中