- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章OpenCV搞定腾讯滑块验证码的实现代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
废话 。
滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码绕不开图像处理,图像处理当然是首推opencv-python啦!当然我的opencv非常菜(p.s.两天速成不敢保证代码质量),发现问题就直接指出嘛,不用走流程啦! 。
环境 。
首先需要一个python,然后安装opencv的python库,如下:
pip install opencv-python 。
然后测试一下是否可用,如下:
1
2
3
4
5
6
7
8
9
|
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.处理滑块的图片 。
运行结果如下所示(左侧为原始滑块,右侧为处理后的滑块):
2.处理带缺口的图片 。
运行结果如下所示(左侧为原始图,右侧为处理后的图):
3.进行模板匹配 。
调用模板匹配api并圈出匹配上的区域,结果如下所示:
警告警告警告 。
这种方法的缺口识别率在50%左右,很大一部分原因是滑块图的背景为纯白色,这在匹配时会产生很大的干扰,要是能将滑块图的背景变为透明,正确的匹配率可以达到90%以上 。
如果大家有任何将滑块图的背景变为透明的办法,可以留言到评论区,我真的万分感谢!!!下面是现阶段的实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# 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边缘检测寻找轮廓对已有的轮廓做约束,比如轮廓的面积范围,轮廓的周长范围 。
多个匹配结果如下:
实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 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 。
最后此篇关于OpenCV搞定腾讯滑块验证码的实现代码的文章就讲到这里了,如果你想了解更多关于OpenCV搞定腾讯滑块验证码的实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上找到了这个很棒的小代码,但它似乎没有在正确删除空格后比较两个字符串?我知道一些js,但这里的任何错误都超出了我的理解范围。希望有人知道这个问题的答案。 注意:它似乎还根据 channel 的数
如何使用 requirejs 导入 recaptcha。我已经尝试了几件事,但没有任何效果。 我需要这样做,以便能够在加载后使用 reCaptcha 的渲染方法自行渲染它。 require.confi
我可以做些什么来尝试解决之前一直有效但现在在尝试访问 javascript 文件时返回 404 的重新验证码问题。 我不认为这是编码问题,因为他们今天下午就起来了。 值得一提的是,我的两个使用 re-
好的,我们在生产中实现了 Recaptcha。我们收到错误是因为它无法到达使用该服务所需的 IP 地址。我们为 IP 地址打开一个端口以到达 Google。没问题。我们这样做并显式配置该 IP 地址以
我正在使用 Robot Framework + Selenium2Library 为 Web 编写验收测试。关键是 web 包含一些我无法自动化的输入字段 (CAPTCHA),并且我无法告诉我的供应商
我正在尝试实现验证码。我正在使用 jquery (ajax) 调用验证脚本 (http://www.google.com/recaptcha/api/verify)。这将数据类型限制为 JSONP,G
我在站点中使用 scrapy 提交表单 https://www.barefootstudent.com/jobs (任何进入页面的链接等http://www.barefootstudent.com/l
我经营一个游戏网站,所以我有很多用户登录,他们可以每两分钟做一次某些事情。 我在某些地方有一个 CAPTCHA 系统,对于某些东西,它总是要求输入代码,而对于其他东西,它会每 10 分钟询问一次。 我
thinkphp中的验证码是可以直接调用的,非常方便,我们看一下 Think 文件夹下 有一个名为verify.class.php的文件 首先 我们要有一个模
我正在实现一个在注册表单上带有验证码的网站;我的第一次。我已经阅读了数十篇关于支持和反对论点以及所有各种实现的帖子。我对这一切很满意,但对我来说这是必要的邪恶。 我不明白的是为什么人们会在整个网络上的
我正在使用 Sitecore 8 update 3,目前我向 WFFM 表单添加了验证码并按下音频,但显示错误如下: [ArgumentNullException: Value cannot be n
我正在对我已经完成的网络系统部分进行一小部分升级,其中之一是确保我的 Google reCaptcha 的安全性正确。 目前,我使用此代码: //reCaptcha $Url = "https://w
我正在对我已经完成的网络系统部分进行一小部分升级,其中之一是确保我的 Google reCaptcha 的安全性正确。 目前,我使用此代码: //reCaptcha $Url = "https://w
我对制作 3D 验证码很感兴趣,我让它使用一种字体,如下所示: import string from matplotlib.font_manager import findSystemFonts im
大家。我是jquery初学者,想请教几个问题。 我正在为表单提交测试编写一个简单的数学验证码,我想每次按下“重置按钮”时生成一组新的随机数。 但是当我用谷歌搜索解决方案时,大多数人都在尝试重新加载页面
我的网站上有一个验证码,我认为样式被其他一些 css 覆盖了,正如您在下面的验证码底部看到的那样,它有点偏离.. 在 firebug 中发现 CSS 覆盖的最佳方法是什么?已经看了一段时间了,似乎无法
我在 Google Play 上有一个 PNR 查询应用程序。它工作得很好。但最近 Indian Railwys 在他们的 PNR 查询部分添加了验证码,因此我无法将正确的数据传递到服务器以获得正确的
我被指派为 joomla 中的自定义组件创建验证码验证,但我不知道如何正确地完成它。 我知道有许多可用的验证码插件,例如 recaptcha,但我需要使用公司创建的自定义验证码。 它在 session
本文实例讲述了php/JS实现的生成随机密码(验证码)功能。分享给大家供大家参考,具体如下: PHP写法: ?
我正在关注关于电话授权的 React Native firebase 文档 ( https://rnfirebase.io/docs/v5.x.x/auth/phone-auth ),并且对是否需要(
我是一名优秀的程序员,十分优秀!