一.介绍:
本内容只做技术交流使用,请勿做商业用途。本方法验证采用本地自建服务器的形式来对所介绍的算法做验证
滑动验证码如下图所示:
二.本地测试环境构建
本地测试环境的构建CSDN已有文章做了详细的介绍,详细参见[博客地址](https://blog.csdn.net/mouday/article/details/83384633)
[demo地址](https://github.com/mouday/TencentCaptcha)
三.识别思路介绍
** 滑动验证需要解决的问题:滑动距离的计算、滑动轨迹模拟、模拟滑动 **
1.滑动距离计算
通过抓包获取验证码发现,此验证码会返回如下两张图片:
针对可获取到的图片信息,要计算滑块滑动距离,可以采用OpenCV库,结合图像处理算法,获取滑块距离。但是通过多次刷新可以观察缺口图片只有有限的10张,如果我们能找到对应的10张无缺口的完整背景图片,每次通过获取到的有缺口的图片在10张完整图片中找到对应无缺口图片,直接做对应像素相减,判断差值大于阈值的第一个像素点的x的坐标位置即为滑块左侧距离图片边缘的距离。
2.无缺口完整背景图片获取:
完整背景图片的获取除了网上文章已提到的通过大量有缺口图片切分重组构造完整背景图和滑动完成验证之后截图两种方案外,其实还可以直接通过接口获取到完整背景图片,由于涉及相关平台利益,所以此处对通过接口直接获取完整背景图片的方法不做详细介绍。但是会把涉及到的10张背景图片给出:
3.拿到有缺口图片后如何从10张背景图中找到对应的无缺口图:
算法1:直接用有缺口图片和10张背景图片做减法,统计差值大于阈值的像素点的个数,阈值设置60,像素点个数设置为缺口大小,大概6000个点,如果差值大于60的点个数超过6000则认为图片不是对应的完整背景图,与10张背景图循环遍历,找到对应的背景图返回对应目标图路径
def get_full_pic(bg_image):
'''
:param gap_pic: 缺口图片
:return: (str)背景图片路径
'''
#转换图像到灰度
img1 = bg_image.convert('L')
distance = 68 #由于缺口位置都在图片的后边,为减少计算,可以减少一部分比较
threshold = 60
dir = ""
for k in range(1,11):
dir = "../background/"+str(k)+".jpg"
fullbg_image = Image.open(dir