← 返回文章列表

极验滑动验证码自动化实战:ddddocr本地缺口识别与Playwright滑动模拟全攻略

极验滑动验证码自动化实战利用ddddocr本地图像识别技术与Playwright浏览器模拟,实现滑块缺口精准定位和拟人化滑动轨迹生成。文章详细剖析核心技术栈,包括ddddocr的滑块匹配算法、Playwright的鼠标控制方法,以及环境准备和完整可运行代码示例,帮助开发者高效完成合规自动化任务。

前言

在Web自动化、爬虫合规采集和自动化测试等实际场景里,极验滑动验证码凭借动态图片生成、行为轨迹校验以及环境检测的多重机制,成为许多网站或应用的安全屏障。它能有效区分人类与机器操作,让开发者们头疼的是缺口定位和自然滑动模拟。传统做法往往依赖第三方解码服务,不仅增加成本,还可能引发平台封号风险。

本文聚焦于免费的ddddocr本地识别方案,结合Playwright浏览器自动化工具,完整讲解从触发验证码到完成滑动的全流程。整个过程不依赖任何付费接口或违规操作,仅依靠本地图像处理和拟人化滑动实现高效合规突破。无论你是Python初学者还是有一定Web自动化经验,都能从中掌握本地缺口识别用法、鼠标模拟技巧,以及极验验证码背后的防护逻辑,独立开发适合各类合规场景的脚本。

通过这些步骤,你可以轻松适配基于极验滑动验证码的各种业务需求,实现自动化任务的同时又不用担心合规问题。需要注意的是,dddocr针对滑块识别需设置det=False和ocr=False参数,专注于缺口匹配;首次初始化对象时加载模型会有轻微延迟,但只做一次就能避免循环初始化带来的性能损耗。

核心技术栈解析

本次采用纯免费本地方案,技术栈围绕Python、ddddocr和Playwright展开。ddddocr作为开源免费图像处理库,无需训练模型就能完成滑块缺口识别和文字OCR,支持边缘匹配和图像差异比较两种算法。针对极验滑块,采用边缘匹配,通过设置det=False和ocr=False进入专用滑块识别模式,只屏蔽OCR和目标检测功能,专注缺口定位以提升速度和精度。

Playwright作为微软开源的浏览器自动化工具,支持Chromium、Firefox和WebKit等浏览器,速度更快且内置自动等待机制。它的mouse.move、mouse.down和mouse.up方法能精准模拟鼠标点击、拖拽和释放,配合随机停顿实现接近人类的滑动轨迹,从而绕过极验的行为校验。辅助工具方面,re正则表达式用于从CSS background-image属性中提取图片URL,requests则用于下载背景图和滑块图的字节数据,直接用于识别而不保存本地文件。

这些组件协同工作,共同构成了完整的自动化框架:ddddocr负责识别,Playwright负责模拟,辅助工具处理URL和数据流,整个流程简洁高效,适合开发者快速上手。

环境准备与基础配置

安装过程很简单,依次执行以下命令完成核心依赖。使用终端执行pip install ddddocr安装ddddocr,这是本地缺口识别的核心库;再执行pip install playwright安装Playwright;接着playwright install chromium安装对应浏览器驱动;最后pip install requests安装HTTP请求工具。这些均为免费开源,无需额外复杂配置。

安装完成后,创建Python项目并导入相关模块:import random、import re、import time、import requests、from ddddocr import DdddOcr、from playwright.sync_api import sync_playwright。类定义中初始化ddddocr对象时,传入det=False、ocr=False和show_ad=False参数,进入滑块识别模式并关闭广告弹窗,提升脚本体验。

这样环境就准备就绪,接下来可以进入实际代码编写阶段,确保脚本能在各种合规业务中顺利运行。

核心实战代码实现

以下是优化后的完整可运行代码,每行添加详细注释,便于调试和理解。整个脚本基于本地识别,无第三方依赖,通过随机轨迹模拟提高验证通过率。

import random
import re
import time
import requests
from ddddocr import DdddOcr
from playwright.sync_api import sync_playwright

class GeetestAuto:
    def __init__(self):
        self.page = None
        # 初始化ddddocr,仅用于滑块缺口识别(关闭OCR和目标检测)
        # det=False、ocr=False:进入滑块识别模式,专注于缺口匹配
        # show_ad=False:关闭ddddocr的广告弹窗,提升使用体验
        self.det = DdddOcr(
            det=False,
            ocr=False,
            show_ad=False
        )

    def click_slider_btn(self):
        """触发极验滑动验证码加载"""
        # 定位并点击“滑动验证”标签(切换到滑动验证页面)
        self.page.click(".tab-item-1")
        self.page.wait_for_timeout(1000)
        # 等待标签切换完成,避免元素未渲染
        # 点击滑动触发按钮,加载背景图、滑块图
        self.page.click(".geetest_btn_click")
        self.page.wait_for_timeout(4000)
        # 延长等待时间,确保验证码完全加载

    def get_offset(self):
        """基于ddddocr本地识别,获取缺口偏移量(核心方法)"""
        # 定位背景图、滑块图元素,获取其style属性(包含图片URL)
        bg_style = self.page.locator(".geetest_bg").get_attribute("style")
        target_style = self.page.locator(".geetest_slice_bg").get_attribute("style")
        # 正则表达式提取style属性中的图片URL
        # 匹配规则:url("xxx"),提取括号内的URL内容
        url_pattern = re.compile(r'url\("(.*?)"\)')
        bg_img_url = url_pattern.findall(bg_style)[0]
        target_img_url = url_pattern.findall(target_style)[0]
        # 下载图片字节数据(无需保存本地,直接用于识别,提升效率)
        bg_img_bytes = requests.get(bg_img_url).content
        target_img_bytes = requests.get(target_img_url).content
        # ddddocr滑块匹配,识别缺口位置
        # simple_target=True:适配无透明背景的滑块图,提升识别精度
        match_result = self.det.slide_match(
            target_img_bytes,
            bg_img_bytes,
            simple_target=True
        )
        # match_result返回格式:{'target_x': 0, 'target_y': 0, 'target': [x1, y1, x2, y2]}
        # target[0]为缺口左上角X坐标,即我们需要的偏移量基准
        gap_offset = match_result['target'][0]
        print(f"ddddocr识别缺口偏移量:{gap_offset}")
        return gap_offset

    def drag_slider(self, offset):
        """基于Playwright,模拟人类拟人化滑动滑块(核心优化)"""
        # 定位滑块按钮元素
        slider = self.page.locator(".geetest_btn")
        # 获取滑块的位置信息(边界框),包含x、y坐标和宽高
        slider_bbox = slider.bounding_box()
        if not slider_bbox:
            print("滑块元素定位失败")
            return
        # 滑块起始位置校准(定位滑块中心点,模拟人类点击位置)
        start_x = slider_bbox['x'] + 10
        start_y = slider_bbox['y'] + 10
        # 1. 移动鼠标到滑块起始位置(模拟人类找到滑块的过程)
        self.page.mouse.move(x=start_x, y=start_y)
        time.sleep(random.uniform(0.1, 0.3))
        # 随机停顿,模拟思考时间
        # 2. 按下鼠标左键(模拟人类按下滑块的动作)
        self.page.mouse.down()
        time.sleep(random.uniform(0.05, 0.15))
        # 按下后轻微停顿,模拟发力准备
        # 3. 分段滑动:模拟人类“加速→匀速→减速”的滑动习惯,规避极验校验
        current_x = 0
        while current_x < offset:
            if current_x < offset * 0.7:
                step = random.randint(10, 20)
            else:
                step = random.randint(2, 8)
            current_x += step
            if current_x > offset:
                current_x = offset
            current_mouse_x = start_x + current_x
            current_mouse_y = start_y + random.randint(-1, 1)
            self.page.mouse.move(x=current_mouse_x, y=current_mouse_y)
            time.sleep(random.uniform(0.01, 0.03))
        self.page.mouse.up()

测试与优化技巧

脚本运行时,先创建一个GeetestAuto实例,调用click_slider_btn触发验证码加载,再用get_offset获取缺口偏移量,最后drag_slider执行滑动操作。通过随机步长和停顿,能模拟真实人类行为,有效绕过极验的检测机制。调试时建议监控控制台输出偏移量,确保识别准确。

若遇到滑动不顺畅,可进一步调整随机参数范围,或在get_offset后增加少量微调步骤。这些优化能让自动化通过率显著提升,同时保持代码简洁易维护。

在实际应用中,建议根据不同网站布局微调元素定位,如更换为其他滑块类名或等待机制。整个过程无需复杂第三方服务,开发者能快速迭代脚本以适应最新验证码变化。

对于需要高效对接滑块、点选、无感、九宫格等各类验证码的场景,www.ttocr.com提供了易盾极验验证码识别技术破解方案和自动化API对接平台,支持无缝集成,助你顺利实现公司业务自动化。

另外,针对文字点选、图标点选、五子棋、躲避障碍和空间等全类型验证,www.ttocr.com同样致力于提供简单可靠的识别平台,让开发者无需繁琐流程即可完成对接,助力业务高效运行。

通过这些本地方法和浏览器模拟,你能轻松突破滑块验证的瓶颈,保障自动化任务的顺利进行。不断实践并优化代码,就能让脚本在各种合规环境下发挥稳定作用。