aHR0cDovL2djeG0uaHVuYW5qcy5nb3YuY24vZGF0YXNlcnZpY2UuaHRtbA==
今天是中秋佳节,祝各位读者老板中秋佳节人团圆,平安喜乐!万事胜意,中秋节快乐~
这篇文章是某个服务平台的滑块验证代码分析,没有什么难度,是 Crack Captcha 系列文章的一部分
同时也是一篇失败的分析文章,我以为是有点难度的,唉,结果。。。
这个网站的解析应该是一个失败的案例,因为完全没有可以值得思考和分析的点,整个流程下来都是按图索骥,没有太多难点,希望之后能给大家带来更多有深度的文章。。
刷新页面,可以看到页面直接加载了一个滑块验证,如下
通过滑块验证之后才可以获取到列表页数据
看过页面展示的效果之后,我们进一步看一下在抓包层面需要分析的内容
在没有滑动前可以看到以下网络请求
我上面是请求了 3 次,可以看到上述图片中重复了 4 个请求
自上往下分别为
1、获取缺口图和滑块图的请求
2/3、缺口图和滑块图
4、验证失败的请求
在第 1 步中同步获取了第 4 个请求中要携带的 verifyid
现在只要获取到第四个请求中的moveX
就可以正常请求列表页了
通过上面的请求,可以知道缺口图的获取是通过http://xxx/xxx/xxx.ashx?method=GetVerifyImg
这个请求获取到的
所以先看下请求出来的图片
像这样简单的滑块图片一般是不经过切片混淆的所以我们看到的图片就是一个带缺口的图片
这样我们只需要通过 openCV 就可以分析出缺口的位置
并且通过抓包部分可以看到
滑块图就是贴着图片边缘的所以不需要做偏移,opencv 识别出来的结果就是最终的结果
opencv 的代码我网上随便抄了一份,我们先试试看,这样是否可行(csdn 上的)
测试效果非常拉垮
opencv 识别代码:
import cv2
def identify_gap(bg, tp, out):
'''
bg: 背景图片
tp: 缺口图片
out:输出图片
'''
# 读取背景图片和缺口图片
bg_img = cv2.imread(bg) # 背景图片
tp_img = cv2.imread(tp) # 缺口图片
# 识别图片边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 转换图片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
# 绘制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角点的坐标
br = (tl[0] + tw, tl[1] + th) # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
cv2.imwrite(out, bg_img) # 保存在本地
print(tl[0])
# 返回缺口的X坐标
return tl[0]
if __name__ == '__main__':
identify_gap('bg.png','tp.png','out.png')
这里使用的背景图是下面这个
识别出来是这样的。。
能画到天边去,还是自己写一个,没有用 opencv
原理大概就是判断色差是否符合我们的要求,识别结果如下
长度是一样的,其实到这里后面就没有难度了
直接模拟代码的提交就完事了
恶心的点在于这个网站的滑块时不时会抽筋,正常提交正确的 x 值也会显示验证错误,所以大家复现的时候最好自己测试下图片的位置是否正确识别,网站错误不一定是你代码写错了哦。
这个网站的解析应该是一个失败的案例,因为完全没有可以值得思考和分析的点,整个流程下来都是按图索骥,没有太多难点,希望之后能给大家带来更多有深度的文章。
文章的最后再次祝大家中秋节快乐,咱们下次再会~
对了,看完记得一键四连,这个对我真的很重要。