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

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.mrgr.cn/news/62465.html

相关文章:

  • Netron:神经网络模型可视化工具指南【全网最详细】
  • 微调大模型方法选择
  • 【JVM 深入了解】JVM 到底包含什么?
  • 【综合算法练习】(第八篇)
  • 时间数据处理
  • 开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码
  • Spring Boot助力校园社团信息数字化管理
  • Python爬虫:在1688上“侦探游戏”获取店铺详情
  • 大厂面试真题-简单说说中台的架构设计
  • Python酷库之旅-第三方库Pandas(181)
  • NocoBase 本周更新汇总:提升表格区块渲染性能等
  • 炫酷!HTMLCSS 让五星评级单选按钮“活“起来
  • Spring Boot技术在校园社团管理中的高效应用
  • 微信小程序开发(教学笔记)——一、通过微信官方文档认识、学习小程序
  • 让卷积神经网络来辨识马和人
  • 三合一无线键鼠中射频芯片-PHY6233
  • clickhouse运维篇(二):多机器手动部署ck集群
  • 启航新征程|三维天地沈阳分公司办公楼开工启用
  • 农作物病害图像分割系统:深度学习检测
  • C/C++系列(2)重载各种玩法
  • Mac用户必备的任务管理软件!三款高效工具推荐
  • MySQL架构面试题系列-MySQL面试宝典(三)
  • 算法详解——线段树
  • UBUNTU查看CPU核心数
  • GB/T 28046.2-2019 道路车辆 电气及电子设备的环境条件和试验 第2部分:电气负荷(4)
  • 代购系统的开发与应用