python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python破解滑块验证码

Python3破解滑块验证码的完整方案

作者:曾阿伦

本文主要为大家详细介绍了滑块验证码的破解方案,采用OpenCV图像识别和Selenium自动化操控技术,该方案平衡开发成本与成功率,可适配90%以上的常规网页滑块验证码,有需要的小伙伴可以参考下

一、滑块验证码原理

1.1 验证机制逻辑

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

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

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

二、技术选型与环境准备

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

2.1 核心依赖库

2.2 环境安装命令

pip install opencv-python selenium pillow numpy

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

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

3.1 图像预处理逻辑

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

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

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

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

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

3.2 完整定位代码实现

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 轨迹生成代码

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

五、完整自动化流程

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

完整整合代码

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)

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

到此这篇关于Python3破解滑块验证码的完整方案的文章就介绍到这了,更多相关Python破解滑块验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文