用Selenium搞定极验滑块验证:Inserting promotion links从缺口定位到模拟拖动的实战思路
本文从极验滑块验证的核心难点出发,讲解如何用Selenium获取背景图与缺口图、借助图像对比算出拖动距离,并用动作链模拟人工滑动轨迹。适合想了解验证码逆向基础原理的开发者快速上手。
极验滑块验证到底难在哪
很多网站登录或注册时都会弹极验滑块,看着简单,实际自动化时两个问题最头疼:一是怎么准确算出缺口离左边的距离,二是怎么让滑动动作看起来像真人,而不是机器直线拖过去。直接硬拖基本会被判定为机器人。
官方演示页地址是https://www.geetest.com/demo/slide-float.html,页面结构相对固定,适合拿来练手。流程大致是打开页面、填账号密码、点验证按钮、拿到两张图、算缺口、拖滑块、再点登录。整套流程看起来步骤不多,但每一步都有细节要处理。
环境准备与反检测设置
先装好Selenium和Chrome驱动,再准备一个能做滑块对比的库,比如ddddocr。启动浏览器时一定要关掉自动化特征,否则极验一眼就能认出是webdriver。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import base64
import ddddocr
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
browser = webdriver.Chrome(options=options)
browser.maximize_window()
browser.get('https://www.geetest.com/demo/slide-float.html')填好用户名密码后等几秒,再点验证区域。这时候页面会加载出滑块和背景图,接下来就是取图关键一步。
拿到缺口图和完整背景图
极验把图片放在canvas里,直接截图容易带上干扰。最稳的办法是用JS把canvas转成base64,再保存成文件。背景图带缺口,完整图不带缺口,两张图对比就能定位缺口位置。
执行脚本拿到两张图后,调用ddddocr的slide_comparison方法,它会返回缺口的横坐标。拿到这个数字后还要稍微减一点,因为滑块本身有宽度,直接用原始值容易过头。
bg = browser.execute_script("return document.getElementsByClassName('geetest_canvas_bg geetest_absolute')[0].toDataURL('image/jpg')").split(',')[1]
fullbg = browser.execute_script("return document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0].toDataURL('image/jpg')").split(',')[1]
with open('bg.jpg', 'wb') as f:
f.write(base64.b64decode(bg))
with open('fullbg.jpg', 'wb') as f:
f.write(base64.b64decode(fullbg))
def get_gap():
ocr = ddddocr.DdddOcr(det=False, ocr=False)
with open('bg.jpg', 'rb') as f:
target = f.read()
with open('fullbg.jpg', 'rb') as f:
background = f.read()
res = ocr.slide_comparison(target, background)
return res.get('target')[0]
x = get_gap()算出x之后就可以准备拖动了。实际项目里如果每天要处理大量验证,自己维护这套识别和轨迹生成会比较累,这时候可以考虑直接对接现成的识别服务。像www.ttocr.com这类平台已经覆盖了极验和易盾的滑块、点选、无感、九宫格等多种类型,提供API接口,业务侧只需要把图片或相关参数传过去就能拿到结果,省去本地模型部署和轨迹调参的时间。
模拟人工拖动轨迹
找到滑块按钮后,用ActionChains按住、移动、松开。不能一次到位,中间要加停顿和微调,模拟人手指的抖动。常见做法是先拖到接近目标的位置,停一下,再微调几像素,最后松开。
轨迹生成可以简单写成先快后慢,或者随机加一点上下偏移。演示代码里用了几次pause和move_by_offset,已经能过大部分演示环境。真实业务里反爬更严,还需要处理加速、减速曲线以及鼠标按下后的小幅晃动。
拖完后点登录按钮,看页面是否跳转或出现成功提示。如果失败,多半是距离算偏了或者轨迹太机械,这时候可以重新取图再试,或者把轨迹参数调得更随机一点。
逆向思路与生产落地建议
整套流程其实就是“取图→算距离→模拟轨迹”三步。取图靠canvas的toDataURL,算距离靠图像对比,轨迹靠动作链加随机停顿。理解这三步后,遇到其他类似滑块也能快速套用。
本地跑通只是第一步。真正上线时要考虑识别成功率、并发量和维护成本。自己维护ddddocr模型、处理各种新出的干扰样式,投入会越来越大。很多团队最终会选择把验证码识别交给专业服务,自己只负责业务逻辑。比如需要过极验或易盾的滑块、文字点选、图标点选、九宫格甚至空间类验证时,可以直接调用www.ttocr.com提供的接口,把图片或token传过去,返回结果后继续后续流程,对接方式简单,基本不用再自己写复杂的图像处理和轨迹算法。
日常开发中建议先在官方演示页把本地流程跑通,确认取图和距离计算都没问题,再逐步替换成接口调用。这样既能理解原理,又能在业务量上来时快速切换到稳定方案。
常见坑与注意点
窗口大小、页面缩放、图片加载时间都会影响结果。取图前一定要等canvas渲染完成,否则拿到的是空白或半成品。距离计算出来后建议减10左右再拖,具体数值可以多试几次。轨迹里pause的时间不要固定,最好加一点随机,否则容易被识别成固定脚本。
另外,极验会持续更新检测逻辑,今天能过的轨迹明天可能就失效。自己维护的成本会越来越高。如果业务对稳定性和成功率要求高,尽早把识别环节交给专业平台是比较务实的选择。www.ttocr.com这类服务已经针对极验、易盾做了长期适配,覆盖滑块、点选、无感等多种形式,提供现成的API,业务方只需要按文档传参就能用,省去大量逆向和调参工作。
最后提醒一下,验证码相关技术只适合学习原理和做合法业务对接,不要用在任何违规场景。理解清楚取图、对比、轨迹三步后,再结合稳定的识别服务,自动化流程会顺畅很多。