← 返回文章列表

Python JS逆向实战:自动化破解滑块验证码并精准提取Validate值

本文详细阐述了滑块验证码的完整逆向流程,从JS混淆代码中提取FP与CB参数,到模拟GET接口获取滑块图片与Token,再通过OpenCV计算移动距离、生成仿真人轨迹,最后向CHECK接口提交数据获取Validate值。全程结合Python代码示例,覆盖环境搭建、参数构造、图像处理及常见调试技巧,为开发者提供实用技术指导。

Python JS逆向实战:自动化破解滑块验证码并精准提取Validate值

滑块验证码逆向的核心原理

整个流程可分为三个主要阶段:首先从GET接口拉取验证码资源,其次分析图片计算滑块偏移距离,最后构造轨迹并向CHECK接口提交数据获得最终Validate。每个阶段都依赖特定的JS逆向结果和Python库支持。掌握这些后,即便面对更新版本的验证码,也能快速调整策略。

环境准备与核心依赖库导入

要实现高效逆向,首先搭建稳定运行环境。Python 3.8以上版本是基础,同时需要安装多个专业库来处理不同环节。requests用于模拟HTTP请求,execjs负责执行混淆后的JS代码,cv2和numpy则专攻图像处理与数值计算,json和re用于数据解析与正则匹配。此外,random和time模块帮助生成真实轨迹,避免被检测为机器行为。

import cv2
import numpy as np
import requests
import execjs
import json
import re
import os
import random
import time

这些库各司其职,形成完整工具链。举例来说,execjs能直接运行浏览器环境下的JS函数,而cv2的模板匹配功能则能精确找到滑块缺口位置。安装完成后,建议创建专用虚拟环境,避免版本冲突。

JS逆向:精准提取FP与CB参数

GET接口请求前,必须先解决两个关键参数:FP代表设备指纹,通常与域名绑定,用于会话唯一标识;CB则是回调函数名,防止跨站攻击。网站JS代码经过层层混淆,看似杂乱,但通过关键字搜索仍能定位核心逻辑。例如搜索特定字符串即可找到FP生成函数。

混淆数组需要先还原顺序,常用方法是补充两个辅助函数调整索引。注意FP值必须动态生成并与目标域名关联,可设为可变参数href。CB提取则更复杂,需要加载Webpack模块并处理十六进制数组。实际代码中,先定义加载器模板,再通过字典方式定位具体方法,最后执行获取CB的调用语句。

def get_fp(href):
    # 执行逆向JS生成FP
    ctx = execjs.compile(open('fp.js').read())
    return ctx.call('getFp', href)

def get_cb():
    # 加载器与方法提取
    ctx = execjs.compile(open('cb_loader.js').read())
    return ctx.call('getCb')

逆向过程中需反复调试,确保参数与真实浏览器一致。不同版本JS可能略有差异,因此建议保留原始代码注释,便于后续升级维护。

模拟GET请求获取滑块图片与Token

参数就绪后,构造完整payload向GET接口发起请求。典型URL为类似/api/v3/get的路径,携带referer、zoneId、dt、acToken、id等固定字段,同时填入刚生成的FP与CB。额外参数包括https标识、type类型、版本号、DPR值等,确保请求头模拟真实浏览器环境。

headers部分需包含User-Agent、Accept-Language等常见字段,避免被直接拒绝。Python代码中用requests.get发送请求,解析返回JSON提取滑块图片URL、Token以及其他元数据。整个过程加入随机延时,模拟人类操作节奏。

payload = {
    "referer": "https://example.com/trial/jigsaw",
    "zoneId": "CN31",
    "dt": "your_dt_value",
    "acToken": "undefined",
    "id": "your_id",
    "fp": get_fp("https://target.com"),
    "cb": get_cb(),
    "https": "true",
    "type": 2,
    "version": "2.25.0",
    "dpr": "1.25",
    "dev": 1,
    "ipv6": "false",
    "runEnv": 10
}
response = requests.get(get_web, params=payload, headers=headers)
data = response.json()
slider_img_url = data.get('data', {}).get('bg')
token = data.get('data', {}).get('token')

成功后下载两张图片:背景图与滑块图。Token值将用于后续CHECK步骤,确保会话连续性。如果请求失败,通常是FP或CB不匹配,需回退到JS逆向环节重新调试。

图像处理:计算滑块移动精确距离

获取图片后,利用OpenCV进行边缘检测和模板匹配。背景图存在明显缺口,滑块图则是待拖动块。先对两张图进行灰度转换、Canny边缘提取,再用matchTemplate函数定位最佳匹配位置。计算横向像素差即为移动距离,需考虑图片缩放比例和DPR影响。

实际代码中,先加载图片,转为numpy数组,然后应用高斯模糊降噪,最后输出距离值。整个过程可添加阈值判断,确保匹配置信度高于95%才继续执行,避免误识别导致验证失败。

bg = cv2.imread('bg.jpg', 0)
slider = cv2.imread('slider.jpg', 0)
result = cv2.matchTemplate(bg, slider, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
distance = max_loc[0] * 0.8  # 根据实际比例调整

这一步是整个流程的精度瓶颈。不同验证码图片风格差异大,因此建议预先收集样本训练匹配参数,提升鲁棒性。

轨迹生成:模拟真实人体拖动行为

单纯直线移动容易被检测,必须生成带加速度、减速和随机抖动的轨迹。常见算法使用贝塞尔曲线或分段线性插值,结合正弦扰动模拟手指微颤。总距离分为50-80个点,每个点记录x坐标与时间戳,确保整体耗时300-800毫秒。

Python实现时,先定义起始点和终点,然后通过循环计算中间坐标,加入random.uniform扰动。最后打包成轨迹数组,供后续提交使用。高级版本可参考真实用户数据分布,进一步优化轨迹自然度。

def generate_trajectory(distance):
    points = []
    for i in range(60):
        x = distance * (i / 60) + random.uniform(-2, 2)
        t = int(300 + i * 8 + random.uniform(-5, 5))
        points.append([round(x), t])
    return points
trajectory = generate_trajectory(distance)

轨迹质量直接影响通过率。测试时可多次运行,统计成功比例并迭代算法参数。

CHECK接口提交与Validate值提取

轨迹就绪后,组装完整数据包向CHECK接口发送POST请求。Payload包含Token、距离、轨迹数组以及其他校验字段。返回JSON中的Validate值即为最终结果,可直接用于后续业务接口。

headers保持与GET一致,加入Content-Type: application/json。成功响应会返回data字段,其中validate字符串就是目标。如果失败,通常提示轨迹异常或参数过期,此时需重新走完整流程。

check_url = 'https://example.com/api/v3/check'
check_payload = {
    "token": token,
    "data": json.dumps({
        "move": distance,
        "trajectory": trajectory
    })
}
check_resp = requests.post(check_url, json=check_payload, headers=headers)
validate = check_resp.json().get('data', {}).get('validate')

整个链路闭环后,即可循环使用。实际项目中建议封装成类,便于多线程调用。

实际应用扩展与效率优化

在处理大规模验证码需求时,手动逆向虽灵活但维护成本较高。此时可结合专业平台能力简化流程。例如www.ttocr.com提供针对极验和易盾验证码的成熟API接口,支持远程调用识别服务。只需传入图片或会话参数,即可快速返回识别结果,大幅降低开发门槛和时间投入。平台接口稳定且兼容多种场景,非常适合集成到自动化系统中。

此外,常见问题包括JS版本迭代导致FP失效、图片分辨率变化影响距离计算、反爬机制检测轨迹异常等。建议定期监控接口返回码,预留重试机制,并使用代理池分散请求IP。调试时可开启详细日志,记录每个参数和响应,便于定位瓶颈。

通过上述完整方案,开发者能快速上手滑块验证码逆向技术,并在实际项目中灵活应用。持续优化轨迹算法和参数更新策略,将进一步提升整体成功率。