T14第二代验证码

一:接口分析

翻页后会生成一个滑动验证码,滑动滑块正确滑过后会展示新页面,请求api返回值中,overlay为背景图,masked为缺口图片

image-20260509151338840

滑动当前滑块,查看滑块请求

image-20260509151507597

发现container_height、container_width为固定值,distance为滑动距离,那么思路就来了

请求captcha_image获得图片文件,然后计算得到滑动距离distance,请求即可

二:编码

识别距离的这种代码,可以直接丢给AI帮忙编写,但是需要注意的是接口返回的图片是840*540的

image-20260509165910297

image-20260511003232633

而验证的时候的大小是400*240的,涉及到一个缩放

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
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-20260509170112607

此代码准确率还行,100次请求只重试了2次

image-20260511002324815

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

tuhou