T15第二代验证码(随机滑块)
一:抓包分析

与14题类似,首页请求正常,翻页时会出现验证码,验证码滑动正确后显示数字页面

验证码请求接口为固定URL+时间戳,返回信息为带缺口的背景图和缺口图片
滑块验证接口与14题一致,distance为滑动距离

与14题一样的是需要注意滑动距离的缩放,不一样的是15题请求验证码接口的过程中会出现请求失败的问题,需增加重试机制。

二:编码与验证
复用14题的代码一样能行
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import base64 import cv2
def calculate_slider_distance(bg_path, slider_path, real_width=840, display_width=400): """ 计算滑块距离
:param bg_path: 背景图 :param slider_path: 滑块图 :param real_width: 原图宽度 :param display_width: 页面显示宽度 :return: real_distance: 原图真实距离 display_distance: 页面应滑动距离 """
# 读取图片 bg = cv2.imread(bg_path) slider = cv2.imread(slider_path)
# 转灰度 bg_gray = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY) slider_gray = cv2.cvtColor(slider, cv2.COLOR_BGR2GRAY)
# 边缘检测 bg_edge = cv2.Canny(bg_gray, 100, 200) slider_edge = cv2.Canny(slider_gray, 100, 200)
# 模板匹配 result = cv2.matchTemplate( bg_edge, slider_edge, cv2.TM_CCOEFF_NORMED )
# 获取最佳位置 _, max_val, _, max_loc = cv2.minMaxLoc(result)
x = max_loc[0]
# 缩放比例 scale = display_width / real_width
# 页面实际滑动距离 display_distance = x * scale
return x, display_distance, max_val
def get_dis(): bg_path = "bg.png" slider_path = "slider.png" real_x, move_x, score = calculate_slider_distance( bg_path, slider_path ) return int(move_x)
|

这类滑块总的来说还是比较简单的,只需要代码识别缺口位置就行,这种识别缺口的代码,直接丢给AI,反复调教,就能拿到一个不错的结果。与之类似的有极验4的滑动验证码,比极验少了一些参数加密,难度下降了不少。
更多内容也在公众号更新:码字的秃猴
