极验滑块验证码研究
字数 807 2025-08-12 11:33:47
极验滑块验证码自动化破解研究 - Selenium方案详解
1. 方案概述
极验滑块验证码自动化破解主要有两种方案:
-
Selenium浏览器自动化方案:
- 优点:实现简单、通过率高、与极验版本耦合性低
- 缺点:效率低、耗性能、耗时严重
-
请求参数伪造方案:
- 优点:速度快、可多线程优化
- 缺点:需逆向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 轨迹优化
-
记录成功轨迹:
- 将成功拖动轨迹记录到缓存池
- 根据坐标匹配相似轨迹
-
使用缓动函数:
# 使用jquery.easing等缓动函数使轨迹更自然 -
人类行为模拟:
- 先快后慢的拖动节奏
- 拖动过头后回拉
- 添加随机停顿
- 非直线轨迹
7. 注意事项
-
法律声明:本技术仅限用于安全研究和网络安全维护
-
反检测机制:
- 随机化操作间隔
- 模拟人类鼠标移动轨迹
- 使用真实浏览器指纹
-
性能优化:
- 合理设置等待时间
- 复用浏览器实例
- 并行处理多个验证码
8. 扩展思路
-
多方案结合:Selenium方案与请求伪造方案结合使用
-
机器学习应用:使用CNN等模型直接预测滑块位置
-
分布式破解:构建分布式验证码破解集群
-
验证码特征分析:深入研究极验不同版本的特征差异
通过以上详细步骤和优化策略,可以有效实现极验滑块验证码的自动化破解,同时保持较高的通过率和稳定性。