滑块验证码不能用requests直接模拟通过,因其依赖前端拖动轨迹、加速度、鼠标事件时序及Canvas指纹等行为验证;仅提交坐标或base64图片会返回{"success": false}或412错误。

滑块验证码为什么不能用 requests 直接模拟通过
因为滑块验证本质是前端行为验证:拖动轨迹、加速度、鼠标事件时序、Canvas 渲染指纹都参与校验。仅靠 requests 提交坐标或图片 base64,服务端会直接返回 {"success": false, "message": "invalid track"} 或 412 状态码。OpenCV 只负责“找缺口”,不解决行为模拟——它只是整个流程里可落地的一环。
用 OpenCV 定位缺口的三个关键预处理步骤
缺口识别失败,80% 出在图像预处理没做对。目标不是“看清图”,而是让缺口边缘在灰度+边缘图中形成唯一强响应:
- 先用
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)转灰度,别跳过——彩色通道会干扰 Canny 检测 - 必须做
cv2.GaussianBlur(gray, (3, 3), 0)降噪,否则滑块阴影、文字噪点会伪造边缘 - 用
cv2.Canny(blur, 50, 150)而非自适应阈值:cv2.adaptiveThreshold对缺口这种细长结构容易断边
匹配滑块底图与缺口图时的尺寸与位移陷阱
缺口图(带背景的完整图)和滑块图(只有小图标的 PNG)分辨率通常不一致,直接 cv2.matchTemplate 必然偏移。正确做法是:
- 先用
cv2.resize将滑块图等比缩放到缺口图宽度的 1/3 左右(常见比例),再试匹配 - 只在缺口图中央 60% 区域内搜索:
roi = img[height//3:2*height//3, width//3:2*width//3],避免边缘伪影干扰 - 用
cv2.TM_CCOEFF_NORMED而非TM_SQDIFF:前者响应峰值明显,后者极小值难定位且易受亮度影响 - 取
cv2.minMaxLoc(result)的max_loc,不是min_loc——这是最常写错的地方
OpenCV 找到的 x 坐标不能直接当拖动距离用
OpenCV 返回的是缺口左上角在背景图中的像素横坐标,但真实滑块需要拖动的是“滑块中心对齐缺口中心”的位移量。漏掉这步换算,99% 的请求会被判为机器行为:
立即学习“Python免费学习笔记(深入)”;
- 缺口宽度一般为 40–60px,用
cv2.boundingRect(contour)拿到实际矩形后,缺口中心 x =x + w // 2 - 滑块图标本身有宽度(常为 36px),其初始位置固定(如页面中
left: 20px),需人工测量或用selenium.execute_script("return document.querySelector('.slider').getBoundingClientRect().left")获取 - 最终拖动距离 = 缺口中心 x − 滑块中心初始 x;注意减去页面缩放系数(
window.devicePixelRatio可能为 1.25/2)
真正卡住人的,从来不是 OpenCV 能不能找到缺口,而是坐标系没对齐、没考虑缩放、没补上滑块自身偏移——这些细节一错,前面所有图像处理都白跑。


















