滑块验证码本质是前端行为模拟而非图像识别,需复现真实用户操作链,包括轨迹加速度、微抖动、时间戳等20+维行为指纹,并通过Playwright等工具绕过自动化检测实现高通过率。

滑块验证码的本质是前端行为模拟,不是图像识别
绝大多数所谓“滑块拼图”验证码(如极验 v3、腾讯云 TCaptcha)根本不需要你去调用 OpenCV 或训练模型。它们的验证逻辑藏在浏览器运行时:拖动距离、轨迹、时间戳、鼠标事件序列、甚至 canvas 绘图上下文都会被采集并签名。直接用 cv2.matchTemplate 找缺口位置,再用 requests 发个坐标过去,99% 会返回 {"success":0,"message":"illegal request"}。
真正有效的路径只有一条:复现真实用户在 Chrome/Firefox 中的操作链。这意味着你得用 selenium 或 playwright,且必须绕过自动化特征检测(如 navigator.webdriver、cdc_ 变量、缺失的插件列表等)。
Playwright 比 Selenium 更适合绕过滑块检测
Playwright 的 Chromium 内核默认禁用自动化标记,启动时自动 patch 掉 window.navigator.webdriver 和 chrome.runtime 相关污染,而 Selenium 需要手动加 --disable-blink-features=AutomationControlled、注入 JS 覆盖属性、甚至替换 chromedriver 二进制——稍有遗漏就会被 gt.js 或 tcaptcha.js 识别为 bot。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
playwright install chromium获取干净内核,别混用系统 Chrome - 启动时传
headless=False先肉眼确认滑块是否加载成功(很多网站在 headless 下直接不渲染滑块) - 用
page.route()拦截/ajax/libs/gt/或/tcaptcha请求,确认 JS SDK 是否正常加载 - 不要用
page.drag_and_drop()—— 它生成的是瞬移轨迹,会被判定为机器操作;改用page.mouse.move()+page.mouse.down()+ 多次move()+up()
轨迹生成不能是匀速直线,得带加速度和微小抖动
真实人类拖动有起停加速度、中途小幅回拉、横向轻微偏移。纯线性位移(比如从 x=100 到 x=300 匀速走 20 步)会被服务端 track 字段直接拒绝。极验 v3 的后端会校验轨迹点之间的 Δt(毫秒级时间间隔)和 Δx/Δt(瞬时速度),连续 5 点速度标准差
一个可用的简化轨迹生成逻辑:
import random
def gen_track(distance):
track = []
current, t = 0, 0
mid = distance * 4 / 5
while current < distance:
if current < mid:
a = random.uniform(2, 4)
else:
a = -random.uniform(1, 3)
v0 = 0 if not track else (track[-1][1] - track[-2][1]) / (track[-1][0] - track[-2][0]) if len(track) > 1 else 0
v = v0 + a * 0.1
move = v * 0.1 + 0.5 * a * (0.1 ** 2)
current += move
t += 100 + random.randint(-20, 50)
# 加入 ±2px 横向抖动
y_offset = random.randint(-2, 2)
track.append((int(t), int(current), y_offset))
return track注意:最终发送给接口的 track 是 JSON 数组,格式类似 [[100,20,0],[210,45,-1],[305,78,1],...],不是像素坐标本身。
别忽略 token 和前后请求的依赖关系
滑块不是独立接口。典型流程是:GET /api/getcaptcha → 返回 gt + challenge → 渲染 UI → 用户拖动 → POST /api/verify 提交 geetest_challenge、geetest_validate、geetest_seccode。其中 validate 和 seccode 是前端 JS 根据轨迹、时间戳、challenge 三次 MD5 拼接后加密生成的,算法公开但版本多变(v3/v4)、密钥硬编码在 JS 里。
关键点:
- 别手写加密逻辑——直接用 Playwright 执行页面内
geetest && geetest.getValidate()获取结果 - 确保
page.evaluate()调用时机在滑块验证成功后(监听document.querySelector(".geetest_success_radar_tip_content")文本变化) - 有些站点(如某银行登录页)会在滑块通过后,再要求一次短信或人脸识别,自动化链路到这里就断了
最常被忽略的其实是 Referer 和 Cookie 同步:page.context.cookies() 必须在滑块完成后立即获取,并透传给后续业务请求,否则 sessionid 不一致导致登录失败。


















