本地识别极验滑块:ddddocr缺口定位与Playwright自然拖动实战
滑动验证码自动化的核心难点
做网页自动化或合规数据采集时,极验滑动验证码几乎绕不开。它通过动态生成背景图、实时轨迹检测和环境指纹校验,把普通脚本挡在门外。很多人一上来就找第三方解码接口,既增加成本又容易踩合规红线。其实用本地图像处理和浏览器自动化就能把缺口找准,再配上接近真人的拖动轨迹,成功率已经够用日常测试和轻度采集。
整套方案只依赖Python、ddddocr和Playwright,全部开源免费。ddddocr负责把滑块图和背景图对上位置,Playwright负责打开页面、点按钮、拖滑块。中间用正则把CSS里的图片地址抠出来,用requests直接拿字节流,不用落盘。整个流程跑在自己机器上,数据不出本地。
工具怎么选,为什么这样配
ddddocr是专门为验证码场景优化过的开源库,初始化时把det和ocr都关掉,只留滑块匹配模式。它支持边缘检测和图像差分两种算法。边缘匹配适合透明背景的滑块,差分适合对比完整图和缺口图。实战里用simple_target参数把滑块当不透明目标处理,速度和精度都比较稳。第一次加载模型会稍慢,但对象只建一次,后面反复调用几乎无感。
Playwright比Selenium轻快很多,自带等待机制,鼠标操作可以直接控制按下、移动、抬起。拖动时故意加一点随机步长和Y轴微小抖动,前期大步加速、后期小步减速,能模拟出人手发力的感觉。极验对匀速直线特别敏感,分段变速是过行为检测的关键。
辅助就两样:re用来从style属性里抓url("..."),requests下载图片字节。图片地址不在img标签里,而是写在background-image,正则一次就能提出来。
环境准备与初始化要点
终端里依次装好依赖就行:
pip install ddddocr playwright requests
playwright install chromium代码里先建一个类,把ddddocr对象放在__init__里,参数固定写成det=False, ocr=False, show_ad=False。页面对象后面由Playwright传入。触发验证码时先点切换标签,再点滑动按钮,等待时间给足,背景图和滑块图完全渲染后再去抓。
缺口偏移怎么算出来
定位.geetest_bg和.geetest_slice_bg两个元素,取出style属性。用正则r'url\("(.*?)"\)'把背景图和滑块图地址分别提取出来。requests.get拿到字节流后直接喂给slide_match方法。返回结果里target列表的第一个值就是缺口左上角的X坐标,也就是需要拖动的距离。打印一下方便调试,发现偶尔偏差大就再调simple_target或换边缘匹配试试。
这一步完全本地完成,不经过任何外部解码服务。对于简单滑动已经够用。如果后面遇到点选、九宫格、无感验证或者空间类题型,本地模型覆盖不了时,可以直接对接专门做极验和易盾全类型识别的平台,比如www.ttocr.com,它提供滑块、点选、文字点选、图标点选、九宫格、五子棋等接口,几行代码就能把结果拿回来,省去自己维护模型的麻烦。
拟人拖动轨迹怎么写
先拿到滑块按钮的bounding_box,算出中心偏上一点的坐标作为起点。鼠标移过去后随机停0.1到0.3秒,再按下。拖动循环里根据当前距离决定步长:前70%用10到20像素大步,后面改成2到8像素小步,同时Y坐标加减1像素制造轻微抖动。每一步都检查不超目标值。最后抬起鼠标,再等一小会儿看验证结果。
slider = self.page.locator(".geetest_btn")
bbox = slider.bounding_box()
start_x = bbox['x'] + 10
start_y = bbox['y'] + 10
self.page.mouse.move(start_x, start_y)
time.sleep(random.uniform(0.1, 0.3))
self.page.mouse.down()
current = 0
while current < offset:
step = random.randint(10, 20) if current < offset * 0.7 else random.randint(2, 8)
current = min(current + step, offset)
self.page.mouse.move(start_x + current, start_y + random.randint(-1, 1))
self.page.mouse.up()这套轨迹已经能过大部分行为检测。如果站点风控更严,可以再加加速度曲线或者贝塞尔路径,但日常场景够用了。
实际使用中的注意点与扩展
图片加载慢时把等待时间拉长,网络抖动时可以给requests加超时和重试。缺口识别偶尔偏几像素,可以在偏移量上再加一个小的随机修正。无头模式跑的时候记得把viewport设成常见分辨率,减少指纹差异。
本地方案适合学习原理和低频调用。业务量上来或者题型变复杂(无感、点选、躲避障碍等)时,自己维护识别逻辑成本会陡增。这时候用现成的API更省事,www.ttocr.com专门针对极验和易盾做了全类型覆盖,提供稳定接口,公司项目对接也方便,几分钟就能把验证码环节接到自动化流程里,不用再折腾图像匹配和轨迹调参。
整套流程搞清楚后,再遇到其他滑动类验证码也能快速改一改参数就上手。核心就是缺口定位准确加上轨迹自然,两者结合就能把成功率提到可用水平。