Python3 滑块验证码破解

一、滑块验证码原理

1.1 验证机制逻辑

主流网页滑块验证码由两张核心图片组成:完整背景图、带缺口的背景图+独立滑块图。验证核心逻辑分为两步:

  • 位置校验:精准计算滑块需要横向移动的像素距离,使滑块与缺口完全重合;

  • 行为校验:检测滑动速度、轨迹、停顿节奏,判断是否为机器机械拖拽。

1.2 固定像素位移+匀速拖拽方案弊端

网上多数入门教程采用「固定像素位移+匀速拖拽」方案,存在明显缺陷:

  • 固定位移无法适配动态随机缺口位置;

  • 匀速直线运动轨迹完全不符合真人操作习惯,极易触发风控拦截;

  • 未处理图片缩放、模糊干扰,缺口识别准确率极低。

二、技术选型与环境准备

本次采用「OpenCV 图像识别 + Selenium 自动化操控 + 物理轨迹模拟」技术栈,平衡开发成本与破解成功率,适配90%以上常规网页滑块验证码。

2.1 核心依赖库

  • opencv-python:实现图像灰度处理、高斯模糊、边缘检测、模板匹配,精准定位缺口位置;

  • selenium:操控浏览器模拟鼠标拖拽行为;

  • Pillow:辅助图片下载、格式预处理;

  • numpy:图像矩阵运算、轨迹坐标计算。

2.2 环境安装命令

bash 复制代码
pip install opencv-python selenium pillow numpy

三、缺口精准定位(OpenCV 方案)

缺口定位是基础,采用边缘检测+模板匹配优化方案,通过高斯模糊去除背景噪点、Canny算法提取边缘特征,有效规避渐变背景、干扰线条导致的识别偏差,适配多数复杂背景滑块验证码。

3.1 图像预处理逻辑

  1. 读取完整背景图与缺口背景图;

  2. 灰度化处理,降低图像数据维度,提升运算速度;

  3. 高斯模糊降噪,弱化背景纹理干扰;

  4. Canny边缘检测,提取两张图片的轮廓差异;

  5. 对比轮廓差异,计算缺口横向偏移像素值。

3.2 完整定位代码实现

python 复制代码
import cv2
import numpy as np
from PIL import Image

def preprocess_image(img_path):
    """图像预处理:灰度化+高斯模糊+边缘检测"""
    img = cv2.imread(img_path)
    # 灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 高斯模糊降噪
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    # Canny边缘检测
    edge = cv2.Canny(blur, 50, 150)
    return edge

def get_gap_offset(bg_path, gap_bg_path):
    """
    计算滑块需要滑动的偏移距离
    :param bg_path: 完整背景图路径
    :param gap_bg_path: 带缺口背景图路径
    :return: 缺口横向偏移像素值
    """
    bg_edge = preprocess_image(bg_path)
    gap_edge = preprocess_image(gap_bg_path)
    
    # 图像差值运算,提取缺口轮廓
    diff = cv2.absdiff(bg_edge, gap_edge)
    # 寻找轮廓
    contours, _ = cv2.findContours(diff, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    for contour in contours:
        # 筛选符合滑块尺寸的轮廓
        x, y, w, h = cv2.boundingRect(contour)
        if 30 < w < 100 and 30 < h < 100:
            return x  # 返回缺口横向起始坐标,即滑动偏移量
    return 0

四、真人物理滑动轨迹模拟

单纯精准定位缺口依然无法通过校验,平台风控核心检测滑动行为特征 。机器匀速拖拽、无停顿、无速度波动的行为特征极易被拦截。真人滑动规律为:先加速、再减速、小幅微调、末端轻微停顿

4.1 轨迹生成算法

通过分段函数生成非线性轨迹,模拟人类手部操作的惯性与微调行为,同时加入随机微小停顿,规避风控检测。

4.2 轨迹生成代码

python 复制代码
import random
import time

def get_slide_track(distance):
    """
    生成真人滑动轨迹
    :param distance: 需要滑动的总像素距离
    :return: 每一步滑动的像素偏移列表
    """
    track_list = []
    current = 0
    # 初始加速阶段(前70%距离)
    mid = distance * 0.7
    # 加速度、初始速度随机化,模拟不同人操作习惯
    v = 0
    a = random.uniform(2, 4)
    while current < mid:
        v += a
        track_list.append(round(v))
        current += round(v)
    
    # 末端减速阶段(后30%距离)
    a = -random.uniform(1, 3)
    while current < distance:
        v += a
        if v < 0.5:
            v = 0.5
        track_list.append(round(v))
        current += round(v)
    
    # 误差修正:补足最后距离,避免偏移
    last = sum(track_list) - distance
    if last > 0:
        track_list[-1] -= last
    elif last < 0:
        track_list[-1] += abs(last)
    
    # 加入随机微小停顿节点
    pause_pos = random.randint(3, len(track_list)-2)
    track_list.insert(pause_pos, 0)
    return track_list

五、完整自动化流程

结合图像定位、轨迹生成、浏览器操控,实现端到端自动破解,流程包含:打开页面、下载验证码图片、计算偏移、模拟滑动、验证结果判断。

完整整合代码

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options

def crack_slide_captcha(url):
    # 配置浏览器参数,规避自动化检测
    chrome_options = Options()
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option("useAutomationExtension", False)
    driver = webdriver.Chrome(options=chrome_options)
    driver.maximize_window()
    driver.get(url)
    time.sleep(2)

    try:
        # 1. 定位验证码元素,下载背景图、缺口图(根据实际页面DOM修改选择器)
        # 此处为通用示例,需根据目标网站调整图片元素获取逻辑
        bg_img = driver.find_element("css selector", "div.bg-img")
        gap_img = driver.find_element("css selector", "div.gap-img")
        
        # 截图保存图片
        bg_img.screenshot("bg.png")
        gap_img.screenshot("gap.png")
        time.sleep(1)

        # 2. 计算滑动偏移量
        offset = get_gap_offset("bg.png", "gap.png")
        # 适配页面缩放比例
        scale = driver.execute_script("return window.devicePixelRatio")
        real_offset = offset / scale

        # 3. 获取滑动轨迹
        track = get_slide_track(real_offset)

        # 4. 模拟真人拖拽
        slider = driver.find_element("css selector", "div.slider-btn")
        ActionChains(driver).click_and_hold(slider).perform()
        time.sleep(random.uniform(0.1, 0.2))  # 按住滑块短暂停顿
        
        # 分段滑动
        for step in track:
            ActionChains(driver).move_by_offset(xoffset=step, yoffset=0).perform()
            time.sleep(random.uniform(0.005, 0.01))
        
        # 末端微调+短暂停顿,模拟真人对齐操作
        time.sleep(random.uniform(0.2, 0.4))
        ActionChains(driver).release().perform()
        time.sleep(3)

        print("滑块验证执行完成,可查看结果")
    except Exception as e:
        print(f"破解失败:{str(e)}")
    finally:
        # driver.quit()  # 调试阶段注释,查看页面结果

if __name__ == "__main__":
    # 替换为目标带滑块验证码的页面地址
    target_url = "https://xxx.com/login"
    crack_slide_captcha(target_url)

六、免责声明

本文技术方案仅用于个人学习、自动化测试、合规数据采集场景。严禁用于非法爬虫、恶意攻击、违规批量操作等违法行为,违规使用产生的一切后果由使用者自行承担。

相关推荐
deepin_sir16 小时前
04 - 运算符与表达式
java·开发语言·python
devnullcoffee16 小时前
亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战
开发语言·python·亚马逊数据采集·亚马逊数据 api·amazon 选品数据·亚马逊卖家数据
Chase_______16 小时前
【Java杂项】自动装箱、自动拆箱与 IntegerCache:== 比较、空指针和性能坑详解
java·开发语言·python
Daydream.V16 小时前
主成分分析 PCA 详解
python·信息可视化·数据分析·pca
92year16 小时前
MCP工具吃Token太猛?3个实测方案砍掉70%消耗
python·ai·mcp
骑士雄师16 小时前
python 的列表和java中的集合有什么区别
java·windows·python
MediaTea16 小时前
人工智能通识课:深度学习框架 PyTorch
人工智能·pytorch·python·深度学习·机器学习
我材不敲代码16 小时前
简单聊聊 Python 字典的基础用法
开发语言·python
Lucky_Turtle16 小时前
【m3u8】示例
python