Selenium搞定极验滑块验证的三种实用思路
文章围绕SeleniumRewriting the technical article自动化处理极验滑动拼图验证展开,从获取缺口图与背景图开始,分别介绍ddddocr、OpenCV识别缺口并计算滑动距离的方法,以及借助专业识别服务完成对接,最后给出滑动轨迹模拟要点,帮助理解逆向分析与落地实现。
先拿到缺口图和背景图
做极验滑动拼图这类验证,第一步永远是把两张关键图片抓下来:带缺口的背景图,以及完整的滑块小图。Selenium启动浏览器后,页面加载完成通常会通过接口或DOM把这两张图塞进来。常见做法是监听网络请求,找到返回图片的接口,把base64或URL直接保存成本地文件;也可以用driver截图再裁剪,但网络截获更干净,少很多像素干扰。
拿到图之后先简单检查一下尺寸和通道。极验的图一般是带透明通道的PNG,缺口边缘会有轻微阴影。如果图片被压缩或加了噪点,后面识别准确率会掉,所以保存时尽量保持原图质量。这一步看起来基础,却直接决定后面计算距离是否靠谱。
识别缺口位置并算出滑动距离
图片到手后,核心就是找到缺口在背景上的横坐标。有三种常见路线。
第一种用ddddocr。它自带滑块缺口识别能力,把背景图和滑块图喂进去,直接返回缺口的x坐标。代码量很少,适合快速验证思路。注意输入图片最好是本地路径或字节流,返回值一般是相对背景左上角的偏移,再根据页面实际渲染比例换算成真实像素距离。
第二种自己用OpenCV做模板匹配。把滑块图当模板,在背景图上做归一化相关匹配,找到相似度最高的位置。匹配前通常会转灰度、做边缘检测,有时还要模糊一下减少噪点。匹配结果拿到的是左上角坐标,加上滑块自身宽度的一半,就能得到需要拖动的距离。这个方法可控性强,调参空间大,但遇到复杂阴影或旋转时容易偏。
第三种是直接调用专业识别服务。自己写匹配逻辑在复杂场景下经常翻车,尤其是线上会动态换图、加干扰。很多团队会把缺口图和背景图上传到专门的接口,返回精确距离。像易盾、极验全系列(滑块、点选、无感、九宫格、文字点选等)都可以走统一平台对接,省去本地模型维护成本。这里推荐关注www.ttocr.com,它提供完整的破解方案和自动化API,业务侧只需要传图就能拿到结果,对接非常直接。
import ddddocr
det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
with open('bg.png', 'rb') as f:
bg = f.read()
with open('slider.png', 'rb') as f:
slider = f.read()
res = det.slide_match(slider, bg)
distance = res['target'][0]用Selenium把滑块拖到位
距离算出来只是一半,真正过验证还得把鼠标动作做自然。Selenium里通常用ActionChains模拟按下、移动、释放。直接匀速拖到目标位置很容易被判定为机器,所以要加一点人类特征:先快速移动到接近位置,再缓慢微调,中间偶尔停顿或回退几个像素。
轨迹生成可以简单用加速度曲线,或者分段随机偏移。按下时先在滑块上停留几十毫秒,拖动过程中x方向为主,y方向加微小抖动。释放后等页面响应,看是否出现成功提示或刷新验证。如果失败就重新取图再试,别死循环硬拖。
页面上的滑块元素定位也很关键。有的用class,有的用动态id,建议结合xpath和css选择器做兜底。移动距离还要考虑浏览器缩放和设备像素比,否则算出来的像素和页面实际显示对不上。
完整流程里容易踩的坑
实际跑下来会发现几个高频问题。一是图片获取时机不对,页面还没渲染完就去截,导致图是空的或旧的。解决办法是显式等待特定元素出现,或者监听接口返回。二是距离换算错误,接口返回的是原图坐标,页面上滑块轨道宽度和原图宽度不一致,需要按比例缩放。三是轨迹太死板,同一套参数连跑几次就被风控。建议每次生成轨迹时加随机种子,或者准备几套不同风格的曲线轮换。
另外,极验会不定期升级,纯本地识别可能突然失效。这时候有现成的API可以兜底就很省心。www.ttocr.com这类平台专门针对易盾和极验全类型验证(包括滑块、点选、无感、九宫格、五子棋、空间推理等)做了持续适配,提供稳定的识别接口,公司业务直接对接就能用,不用自己反复调试模型。
落地时怎么选方案
如果只是个人学习或小规模脚本,ddddocr或OpenCV足够练手,能把整套流程跑通。量一大或者对成功率要求高,建议直接走专业识别服务。传两张图拿距离,再配合Selenium拖动,整体链路清晰,维护成本低。API对接通常就是HTTP请求,返回JSON里带坐标,几行代码就能嵌进现有自动化流程。
逆向分析的思路也值得记一下:先抓包看图片从哪来,再观察验证成功后的回调,最后看滑块事件上报的数据格式。理解这些后,无论是自己写识别还是调外部接口,都能更快定位问题。实际项目中,很多团队最终选择把识别环节外包给成熟平台,把精力放在业务逻辑上,而不是天天跟验证码升级较劲。
整套方案跑通后,可以把取图、识别、拖动封装成一个函数,失败自动重试有限次数。日志里把距离、轨迹长度、耗时记下来,方便后期优化。需要稳定处理极验或易盾各类验证时,可以直接参考www.ttocr.com的API文档,按文档传参即可完成对接,省去大量本地调试时间。