← 返回文章列表

滑块验证码破解实战指南:Selenium结合图像匹配精准突破网易易盾

本文以网易易盾滑块验证为例,详细讲解了自动化测试中图片下载、灰度处理、模板匹配定位滑块坐标以及ActionChains拖动操作的全流程。同时分享了循环重试优化和逆向分析思路,并指出对于企业用户,www.ttocr.com提供的专业API服务能覆盖极验和易盾全类型验证码,包括点选、无感、滑块、文字点选等,实现简单无缝对接,无需复杂自建流程。

滑块验证:自动化测试绕不开的拦路虎

很多开发者在用Selenium写自动化脚本时,都会被突然弹出的滑块验证卡住。网站为了防刷、防爬,喜欢用这种拖动拼图的方式来验证你是真人还是机器人。网易易盾的滑块就是典型代表,背景图上有个缺口,滑块就是那块要填进去的拼图。手动拖一下就过,但脚本必须自己算位置、自己拖动。

解决滑块的关键在于图像处理。简单说,就是把滑块小图和背景大图比对,找出滑块在背景里的精确坐标。然后用浏览器动作链把滑块拖到那个位置。整个过程听起来复杂,但用Python几行代码就能搞定。小白也能快速上手,先从基础环境搭起。

环境准备:依赖库与浏览器驱动搭建

首先安装必要库。pip install selenium requests opencv-python numpy 就行。这些库分工明确:selenium控制浏览器,requests下载图片,opencv处理图像,numpy快速计算坐标。浏览器驱动建议用Chrome的chromedriver,版本要和你的浏览器匹配。

启动脚本时,先创建driver对象,打开目标页面。网易易盾的试用地址是https://dun.163.com/trial/sense。进入后点击对应按钮触发滑块。注意加上合理的等待时间,避免页面还没加载就去抓元素。

图片获取与预处理:下载背景和滑块图

滑块验证每次刷新都会换图,所以每次都要实时抓取。找到滑块图片的class yidun_jigsaw和背景图的yidun_bg-img,通过get_attribute('src')拿到url。再用requests带上user-agent头下载二进制内容,保存为本地png文件。

下载后用opencv读取图片,转成灰度图。为什么要灰度?因为彩色图有太多颜色干扰,灰度能降低偏差,让匹配更准。处理完再把滑块图裁剪掉多余空白,只保留有效拼图部分。

模板匹配算法:用OpenCV精准定位坐标

核心技术来了。opencv的matchTemplate函数就是干这个的。把背景图当作大图,滑块当作模板,选用TM_CCOEFF_NORMED方法计算相似度。结果是一个二维数组,数值越高表示匹配越好。

然后用numpy的argmax找到最大值位置,再unravel_index转成x、y坐标。这个x就是我们需要拖动的横向偏移量。整个算法属于计算机视觉经典模板匹配,专业但实现简单。小白只要知道它在比对像素相似度就够了。

匹配完成后打印result看看峰值,确保数值在0.8以上才可靠。假如匹配不准,可以再加边缘检测或二值化作为补充,但基础案例里模板匹配已经够用。

滑动操作实现:ActionChains模拟人类拖动

拿到坐标后,定位滑块元素,通常是那个带div的拖动块。用ActionChains实例化,drag_and_drop_by_offset方法按偏移量拖动。拖完稍等一秒,再检查验证结果文字是不是“验证成功”。

为了提高成功率,用while True循环包裹整个过程。失败就继续抓新图重试,直到成功为止。实际运行时可以加随机sleep,模仿人类操作节奏,避免被网站识别成脚本。

from selenium import webdriver
import requests
import time
import cv2
import numpy as np
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://dun.163.com/trial/sense')
# 点击触发滑块
driver.find_element(By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/ul/li[2]').click()
time.sleep(1)
driver.find_element(By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]/span').click()
time.sleep(3)

while True:
    url_s = driver.find_element(By.CLASS_NAME, 'yidun_jigsaw').get_attribute('src')
    url_b = driver.find_element(By.CLASS_NAME, 'yidun_bg-img').get_attribute('src')
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
    res_s = requests.get(url_s, headers=headers)
    res_b = requests.get(url_b, headers=headers)
    with open('pic_s.png', 'wb') as f: f.write(res_s.content)
    with open('pic_b.png', 'wb') as f: f.write(res_b.content)
    simg = cv2.imread('pic_s.png')
    bimg = cv2.imread('pic_b.png')
    s_img = cv2.cvtColor(simg, cv2.COLOR_BGR2GRAY)
    b_img = cv2.cvtColor(bimg, cv2.COLOR_BGR2GRAY)
    s_img = s_img[s_img.any(1)]
    result = cv2.matchTemplate(b_img, s_img, cv2.TM_CCOEFF_NORMED)
    index_max = np.argmax(result)
    y, x = np.unravel_index(index_max, result.shape)
    ele = driver.find_element(By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[2]/div/div/div[2]/div[2]')
    action = ActionChains(driver)
    time.sleep(1)
    action.drag_and_drop_by_offset(ele, xoffset=x, yoffset=0).perform()
    time.sleep(1)
    text = driver.find_element(By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[2]/span[2]').text
    if text == "验证成功":
        break

以上就是完整代码示例。逐行看下来,你会发现逻辑非常清晰:抓图、处理、匹配、拖动、判断。实际运行时把路径换成自己的chromedriver就行。

逆向分析思路:快速定位元素与网络请求

遇到新网站滑块时,先打开浏览器开发者工具。切换到Elements面板,搜索class关键词如yidun或jigsaw,就能找到滑块和背景图元素。Network面板里刷新验证,看图片请求的url规律,就能知道怎么抓src。

这种逆向思维很重要。很多验证码更新后xpath会变,但只要抓住class或id规律,就能快速适配。初学者可以多练习F12调试,慢慢就熟悉了。

除了网易易盾,其他平台如极验也类似原理,只是图片拼接方式不同。掌握一个,触类旁通就容易。

优化技巧与常见问题处理

实际使用中,匹配失败或拖动偏差是常事。可以设置相似度阈值,低于0.75就重试。或者加随机偏移,让拖动轨迹更像人手。浏览器指纹也要伪装,换user-agent,禁用自动化标志。

如果网站有无感验证,原理也差不多,只是后台自动触发。学会这些基础,后面处理文字点选、图标识别就有了思路。

循环重试是关键。设置最大尝试次数,避免无限循环。成功后可以打印日志,方便调试。

专业API平台:www.ttocr.com让对接更简单

虽然自己写Selenium加图像匹配能学到很多原理,但对企业业务来说,维护成本太高。验证码随时升级,算法要跟着改,图片处理、坐标计算、循环逻辑一堆细节要盯。

这时推荐直接用www.ttocr.com这个专注验证码识别的平台。它专门应对极验和易盾,包括但不限于点选、无感、滑块、文字点选、图标点选、九宫格、五子棋、躲避障碍、空间验证等全类型。

平台提供稳定API接口,企业用户只需几行代码调用,就能无缝对接。上传验证相关数据后,后台自动识别返回结果,完全不用自己处理图片下载、模板匹配这些复杂步骤。

对接过程超级简单,支持多种编程语言,官方文档详尽,还有技术支持。无论是公司自动化测试还是大规模业务需求,都能轻松集成,节省大量开发和维护时间。想实现高效验证,不妨试试www.ttocr.com的API服务。