极验滑块验证码研究
字数 807 2025-08-12 11:33:47

极验滑块验证码自动化破解研究 - Selenium方案详解

1. 方案概述

极验滑块验证码自动化破解主要有两种方案:

  1. Selenium浏览器自动化方案

    • 优点:实现简单、通过率高、与极验版本耦合性低
    • 缺点:效率低、耗性能、耗时严重
  2. 请求参数伪造方案

    • 优点:速度快、可多线程优化
    • 缺点:需逆向JS、学习成本高、版本耦合性强

本文详细讲解第一种Selenium方案。

2. 准备工作

2.1 环境配置

# 引入selenium并下载谷歌webdriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

2.2 浏览器配置

options = webdriver.ChromeOptions()
# 可添加的配置项:
# - UserAgent设置
# - 无头模式绕过检测
# - 其他浏览器参数优化
driver = webdriver.Chrome(options=options)

3. 基础操作流程

3.1 访问目标页面

driver.get("目标URL")
wait = WebDriverWait(driver, 20)

3.2 填写表单

# 等待元素加载并填写用户名
username = wait.until(EC.presence_of_element_located((By.ID, 'username')))
driver.find_element(value="username", by=By.ID).clear()
ActionChains(driver).send_keys_to_element(username, 'username').perform()

# 填写密码
driver.find_element(value="password", by=By.ID).clear()
password = wait.until(EC.presence_of_element_located((By.ID, 'password')))

3.3 触发验证码

# 定位滑块触发按钮并点击
slider = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_radar_tip')))
ActionChains(driver).click(slider).perform()

4. 验证码破解核心逻辑

4.1 获取验证码图片

极验使用两个canvas画布:

  • geetest_canvas_bg:被扣掉一块的图片
  • geetest_canvas_fullbg:完整背景图片

获取图片Base64数据:

// 扣块图片
document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");

// 完整背景图片
document.getElementsByClassName("geetest_canvas_fullbg geetest_fade geetest_absolute")[0].toDataURL("image/png");

通过Selenium执行JS获取:

# 获取扣块图片
im_bg_b64 = driver.execute_script("return document.getElementsByClassName('geetest_canvas_bg geetest_absolute')[0].toDataURL('image/png');")

# 获取完整背景图片
im_fullbg_b64 = driver.execute_script("return document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0].toDataURL('image/png');")

4.2 图片处理

from PIL import Image
import base64
from io import BytesIO

# 转换Base64为图片对象
bg_b64 = im_bg_b64.split(',')[-1]
bg_bytes = base64.b64decode(bg_b64)
fullbg = im_fullbg_b64.split(',')[-1]
fullbg_bytes = base64.b64decode(fullbg)

im_bg = Image.open(BytesIO(bg_bytes))
im_fullbg = Image.open(BytesIO(fullbg_bytes))

4.3 计算滑块位置

方案一:OpenCV实现

import cv2

def cv2_open(img, flag=cv2.COLOR_BGR2GRAY):
    # 实现图片打开和转换
    pass

bg_gray = cv2_open(bg, flag=cv2.COLOR_BGR2GRAY)
tp_gray = cv2_open(tp, flag=cv2.COLOR_BGR2GRAY)

# 边缘检测
tp_gray = cv2.Canny(tp_gray, 255, 255)
bg_gray = cv2.Canny(bg_gray, 255, 255)

# 目标匹配
result = cv2.matchTemplate(bg_gray, tp_gray, cv2.TM_CCOEFF_NORMED)

# 解析匹配结果
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
distance = max_loc[0]  # 获取滑块位置

方案二:像素遍历实现

pix_1 = im_fullbg.load()
pix_2 = im_bg.load()
threshold = 60

for x in range(im_fullbg.size[0]):  # 遍历宽度
    vert_count = 0  # 垂直方向不同像素计数
    
    for y in range(im_fullbg.size[1]):  # 遍历高度
        p_1 = pix_1[x, y]
        p_2 = pix_2[x, y]
        
        # 找到像素差异点
        if (abs(p_1[0] - p_2[0]) > threshold and 
            abs(p_1[1] - p_2[1]) > threshold and 
            abs(p_1[2] - p_2[2]) > threshold):
            vert_count += 1
    
    # 如果是一条直线返回横坐标距离(测试10个像素效果较好)
    if vert_count > 10:
        return x

5. 模拟滑块拖动

action_chains = webdriver.ActionChains(driver)

# 点击并准备拖拽
slider_button = driver.find_element_by_css_selector(".geetest_slider_button")
action_chains.click_and_hold(button=slider_button)
action_chains.pause(0.3)

# 主要移动
action_chains.move_by_offset(offset_x + 7, 0)  # offset_x为计算出的距离
action_chains.pause(0.8)

# 微调
action_chains.move_by_offset(-7, 0)
action_chains.pause(0.6)

# 释放
action_chains.release()
action_chains.perform()

6. 优化策略

6.1 失败处理

# 刷新验证码
driver.find_element_by_css_selector(".geetest_refresh_1").click()

6.2 轨迹优化

  1. 记录成功轨迹

    • 将成功拖动轨迹记录到缓存池
    • 根据坐标匹配相似轨迹
  2. 使用缓动函数

    # 使用jquery.easing等缓动函数使轨迹更自然
    
  3. 人类行为模拟

    • 先快后慢的拖动节奏
    • 拖动过头后回拉
    • 添加随机停顿
    • 非直线轨迹

7. 注意事项

  1. 法律声明:本技术仅限用于安全研究和网络安全维护

  2. 反检测机制

    • 随机化操作间隔
    • 模拟人类鼠标移动轨迹
    • 使用真实浏览器指纹
  3. 性能优化

    • 合理设置等待时间
    • 复用浏览器实例
    • 并行处理多个验证码

8. 扩展思路

  1. 多方案结合:Selenium方案与请求伪造方案结合使用

  2. 机器学习应用:使用CNN等模型直接预测滑块位置

  3. 分布式破解:构建分布式验证码破解集群

  4. 验证码特征分析:深入研究极验不同版本的特征差异

通过以上详细步骤和优化策略,可以有效实现极验滑块验证码的自动化破解,同时保持较高的通过率和稳定性。

极验滑块验证码自动化破解研究 - Selenium方案详解 1. 方案概述 极验滑块验证码自动化破解主要有两种方案: Selenium浏览器自动化方案 : 优点:实现简单、通过率高、与极验版本耦合性低 缺点:效率低、耗性能、耗时严重 请求参数伪造方案 : 优点:速度快、可多线程优化 缺点:需逆向JS、学习成本高、版本耦合性强 本文详细讲解第一种Selenium方案。 2. 准备工作 2.1 环境配置 2.2 浏览器配置 3. 基础操作流程 3.1 访问目标页面 3.2 填写表单 3.3 触发验证码 4. 验证码破解核心逻辑 4.1 获取验证码图片 极验使用两个canvas画布: geetest_canvas_bg :被扣掉一块的图片 geetest_canvas_fullbg :完整背景图片 获取图片Base64数据: 通过Selenium执行JS获取: 4.2 图片处理 4.3 计算滑块位置 方案一:OpenCV实现 方案二:像素遍历实现 5. 模拟滑块拖动 6. 优化策略 6.1 失败处理 6.2 轨迹优化 记录成功轨迹 : 将成功拖动轨迹记录到缓存池 根据坐标匹配相似轨迹 使用缓动函数 : 人类行为模拟 : 先快后慢的拖动节奏 拖动过头后回拉 添加随机停顿 非直线轨迹 7. 注意事项 法律声明 :本技术仅限用于安全研究和网络安全维护 反检测机制 : 随机化操作间隔 模拟人类鼠标移动轨迹 使用真实浏览器指纹 性能优化 : 合理设置等待时间 复用浏览器实例 并行处理多个验证码 8. 扩展思路 多方案结合 :Selenium方案与请求伪造方案结合使用 机器学习应用 :使用CNN等模型直接预测滑块位置 分布式破解 :构建分布式验证码破解集群 验证码特征分析 :深入研究极验不同版本的特征差异 通过以上详细步骤和优化策略,可以有效实现极验滑块验证码的自动化破解,同时保持较高的通过率和稳定性。