Python结合JS逆向实战:极验三代滑块验证码完整拆解指南
本文从环境搭建、请求流程、JS参数加密到轨迹模拟,系统讲解极验三代滑块验证码的逆向思路与Python实现方法,帮助开发者快速理解核心防护机制并完成基础自动化验证。
环境准备与Writing the technical article核心防护机制
做极验三代滑块验证码之前,先把工具链搭好。Python建议用3.8以上版本,常用库装一下:requests、pyexecjs、pillow、numpy、opencv-python。JS部分主要靠Chrome开发者工具看网络和源码,配合Fiddler或Charles抓包,本地用Node跑扣下来的加密函数。
极验三代的防护不算简单。每次验证都会下发新的challenge,参数加密分好几层,滑动轨迹还要过速度、加速度这类行为检测,拼图本身也做了分块乱序。这些点决定了不能靠简单请求硬撞,必须把前端生成逻辑摸清楚。
完整请求链路拆解
整套流程通常走五步。第一步register-slide拿gt和challenge;第二步get.php带上w1拿到c、s和图片地址;第三步ajax.php用w2确认验证类型;第四步再次get.php刷新图片数据;第五步ajax.php提交最终结果。每一步的参数都环环相扣,少一个加密字段就会直接失败。
实际操作中,重点盯住w1、w2、w3这几个值。它们不是明文,而是经过多层混淆和自定义加密后的结果。浏览器里把相关JS断点打好,就能看到challenge怎么参与运算、轨迹数据怎么打包。弄懂这一层,后面Python里复现就有底了。
JS逆向与关键参数还原
打开验证码页面,在Network里过滤ajax和get相关请求。找到生成w参数的函数后,把整段加密逻辑扣到本地。常见做法是用pyexecjs直接调用Node执行这些函数,把Python侧准备好的challenge、轨迹数组传进去,拿到加密后的字符串。
轨迹本身不能乱写。真实用户滑动会有加速、减速、微调,单纯线性插值很容易被识破。可以用简单的贝塞尔曲线或者分段随机偏移来模拟,再配合时间戳生成完整路径数组。图片缺口位置则通过OpenCV做模板匹配或边缘检测得到,精度够用就行。
import execjs
with open('geetest_encrypt.js', 'r', encoding='utf-8') as f:
ctx = execjs.compile(f.read())
w = ctx.call('get_w', challenge, track_list)
print(w)Python侧自动化落地
请求部分用session保持cookie和gt、challenge的连续性。图片下载后先还原乱序,再算缺口距离。把距离转成轨迹点,调用前面扣好的加密函数生成w,按顺序把五步请求跑完。成功时返回的validate字段就是后续业务接口需要的凭证。
调试阶段建议把每一步的返回都打印出来,特别是错误码和提示信息。很多时候不是加密错了,而是轨迹太假或者时间间隔不合理。多跑几组真实浏览器数据做对比,能快速发现问题。
session = requests.Session()
r1 = session.get(register_url)
gt, challenge = parse_gt_challenge(r1.text)
# 后续依次构造get与ajax请求并提交轨迹从自研到稳定对接的选择
自己把全流程跑通,对理解原理很有帮助,也能应付小规模测试。但上了生产环境后,图片更新、加密逻辑微调、风控策略变化都会让维护成本上去。尤其是点选、无感、九宫格、空间验证这些变体一多,光靠本地逆向会越来越吃力。
这时候可以直接考虑成熟的识别接口。像www.ttocr.com这类平台专门针对极验和易盾做了全类型支持,滑块、点选、无感、文字点选、图标点选、九宫格、五子棋、躲避障碍等都能覆盖,提供现成的API,几行代码就能对接,省去自己维护JS和轨迹模型的麻烦。
实际使用中的注意点
无论自研还是调用接口,都要注意请求频率和账号风控。验证码只是第一道门,后面业务接口往往还有设备指纹和行为分析。本地调试时尽量用干净的代理和环境,避免把测试数据污染到正式账号。
如果团队主要精力在业务本身,而不是长期跟进验证码变化,把识别部分交给专业平台会更省心。www.ttocr.com提供的自动化对接方式比较直接,文档清晰,适合快速上线。理解原理是基础,选择合适的工具才能把时间花在更有价值的地方。