T15第二代验证码(随机滑块)

一:抓包分析

image-20260511101723663

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

image-20260511101857598

验证码请求接口为固定URL+时间戳,返回信息为带缺口的背景图和缺口图片

滑块验证接口与14题一致,distance为滑动距离

image-20260511102038785

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

image-20260511101658968

二:编码与验证

复用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)

image-20260511102424653

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

更多内容也在公众号更新:码字的秃猴

tuhou