当前位置: 首页 > article >正文

OpenCV自动滑块验证(Java版)

前提

爬与防爬就是一场“道高一尺,魔高一丈”的拉力赛,双方都在见招拆招。时至今日,较为常见的防爬手段有手机短信验证、滑块验证、按顺序点击图片验证等。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文主要介绍滑块验证的应对之法。

验证实现

在这里插入图片描述

关键点在于获取滑块到滑动背景缺口图的横向距离,这里通过OpenCV的模板匹配技术matchTemplate,然后再通过selenium的Actions类完成滑动(拖动轨迹算法本文不予过多介绍,请自行查找相关资料)。

//获取滑块到滑动背景缺口图的横向距离
double slideDistance = getSlideDistance(System.getProperty("user.dir")+"\\slideBlock.png", System.getProperty("user.dir")+"\\slideBg.png");
Actions actions = new Actions(driver);
WebElement dragElement = driver.findElement(By.id("tcaptcha_drag_button"));
//获取style属性值,其中设置了滑块初始偏离值  style=left: 23px;
//需要注意的是网页前端图片和本地图片比例是不同的,需要进行换算
slideDistance = slideDistance * 280 / 680 - 23;
actions.clickAndHold(dragElement).perform();
//根据滑动距离生成滑动轨迹,约定规则:开始慢->中间快->最后慢
List<Integer> moveTrack = getMoveTrack(slideDistance);
for (Integer index : moveTrack) {
    //Thread.sleep(20);
    actions.moveByOffset(index, 0).perform();
}
actions.release().perform();

getSlideDistance方法实现

对滑块进行处理

  1. 灰度化
  2. 去除图片黑边
  3. inRange二值化转黑白图

在这里插入图片描述

代码实现:

// 加载OpenCV本地库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//对滑块进行处理
Mat slideBlockMat = Imgcodecs.imread(slideBlockPicPath);
//1、灰度化图片
Imgproc.cvtColor(slideBlockMat, slideBlockMat, Imgproc.COLOR_BGR2GRAY);
//2、去除周围黑边
for (int row = 0; row < slideBlockMat.height(); row++) {
    for (int col = 0; col < slideBlockMat.width(); col++) {
        if (slideBlockMat.get(row, col)[0] == 0) {
            slideBlockMat.put(row, col, 96);
        }
    }
}
//3、inRange二值化转黑白图
Core.inRange(slideBlockMat, Scalar.all(96), Scalar.all(96), slideBlockMat);

对滑动背景图进行处理

  1. 灰度化
  2. 二值化转黑白图

在这里插入图片描述

代码如下:

//对滑动背景图进行处理
Mat slideBgMat = Imgcodecs.imread(slideBgPicPath);
//1、灰度化图片
Imgproc.cvtColor(slideBgMat, slideBgMat, Imgproc.COLOR_BGR2GRAY);
//2、二值化
Imgproc.threshold(slideBgMat, slideBgMat, 127, 255, Imgproc.THRESH_BINARY);
Mat g_result = new Mat();
/*
 * matchTemplate:在模板和输入图像之间寻找匹配,获得匹配结果图像
 * result:保存匹配的结果矩阵
 * TM_CCOEFF_NORMED标准相关匹配算法
 */
Imgproc.matchTemplate(slideBgMat, slideBlockMat, g_result, Imgproc.TM_CCOEFF_NORMED); 
/* minMaxLoc:在给定的结果矩阵中寻找最大和最小值,并给出它们的位置
 * maxLoc最大值
 */
Point matchLocation = Core.minMaxLoc(g_result).maxLoc;
//返回匹配点的横向距离
return matchLocation.x;

http://www.kler.cn/a/378514.html

相关文章:

  • linux同步执行命令脚本 (xcall)
  • Pinia-状态管理
  • UFO:Windows操作系统的具象智能代理
  • 【MySQL】架构
  • UE 引入 IOS framework库的坑
  • 《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……
  • 数据库基础(1) . 关系型数据库
  • eclipse下载与安装(汉化教程)超详细
  • filebeat+elasticsearch+kibana日志分析
  • java项目之微服务在线教育系统设计与实现(springcloud)
  • Python爬虫的“京东大冒险”:揭秘商品类目信息
  • Golang gRPC
  • Pycharm,2024最新专业版下载安装配置详细教程!
  • uni-app使用movable-area 实现数据的拖拽排序功能
  • 链表逆置相关算法题|原地逆置|轮转链表|循环链表逆置(C)
  • vscode markdown-image 图片粘贴自动上传到本地目录设置
  • 11月3日笔记(根据凭据提权)
  • Manus Metagloves Pro虚拟现实手套
  • java项目之协力服装厂服装生产管理系统的设计与实现(springboot)
  • Spring Boot框架下的信息学科平台系统架构设计
  • AG32的3个ADC可以并联使用吗
  • 【工具变量】“宽带中国”试点城市名单匹配数据集(2000-2023年)
  • 基于海思soc的智能产品开发(产品开发和mpp平台)
  • ️ 数据库迁移过程中可能遇到哪些常见问题?
  • 高频面试题基本总结回顾(含笔试高频算法整理)11
  • 【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】