上一条博客【写文章-CSDN创作中心】我们对需要的环境进行了配置,也打开了浏览器进行对输入框操作,但是操作过程中遇到滑块,这一篇文章我们来解决这个问题

 滑块的操作思路:

1、web自动化测试出现验证码【让滑块出现】

2、获取滑块和背景的图片地址

3、将背景图和滑块图下载到本地

4、人工智能匹配滑块验证码

5、缩放比例和移动距离算出来

6、模拟滑动解决

7、人工智能模拟和跟踪滑动轨迹

8、滑动失败重试机制

直接放代码,基础教学没有对代码过度抽取,很容易就看懂了,大佬勿喷

public class Test10 {private final static String driver = "webdriver.chrome.driver";private final static String chromeDriver = "C:\\Users\\d\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe";private final static String openCvDll = "D:\\Program Files (x86)\\opencv\\build\\java\\x64\\opencv_java460.dll";//网站需要的账号密码private final static String usernmae = "****";private final static String password = "*****";static {// 引入谷歌驱动 控制浏览器System.setProperty(driver, chromeDriver);// 引入opencv的dllSystem.load(openCvDll);}public static void main(String[] args) throws InterruptedException {System.out.println("正在打开浏览器");//1、获取谷歌浏览器控制 打开浏览器WebDriver driver = new ChromeDriver();driver.manage().window().maximize();//浏览器最大化//2、超时等待30秒Duration duration = Duration.ofSeconds(30);driver.manage().timeouts().implicitlyWait(duration);//3、跳转到智慧树网址driver.get("https://passport.zhihuishu.com/login?service=https://onlineservice-api.zhihuishu.com/login/gologin#signin");//4、解决机器打开验证不成功【脚本打开和人为打开浏览器会有一个标识,通过这个代码进行修改】((JavascriptExecutor) driver).executeScript("Object.defineProperties(navigator,{ webdriver:{ get: () => false } })");//5、获取到账号和密码的输入框 lUsername 并填写内容driver.findElement(By.id("lUsername")).sendKeys(usernmae);driver.findElement(By.id("lPassword")).sendKeys(password);//6、找到登录按钮模拟点击driver.findElement(By.className("wall-sub-btn")).click();//7、这个时候可能会弹出来滑块Boolean flag = true;int i = 1;do {System.out.println("第" + i++ + "次进行验证");//8、这时候可能有滑块出现yidun_sliderWebElement sliderBJ = null;WebElement sliderHK = null;try {//9、如果没拿到,说明直接登录了,没有触发出来滑块sliderBJ = driver.findElement(By.className("yidun_bg-img"));sliderHK = driver.findElement(By.className("yidun_jigsaw"));} catch (Exception e) {e.printStackTrace();}//10、解决图片下载不了的问题TimeUnit.SECONDS.sleep(1);//11、如果不为空需要处理滑块if (sliderBJ != null && sliderHK != null) {//11.1、先得到距离,这里需要opencv  先搭建一下//11.2、获取到背景图的地址和滑块的地址String srcBJ = sliderBJ.getAttribute("src");String srcHK = sliderHK.getAttribute("src");//11.3、拿到url后缀String houZhui = srcBJ.substring(srcBJ.lastIndexOf("."));String houZhuiHK = srcHK.substring(srcBJ.lastIndexOf("."));//11.4、将图片下载到本地downloadPicture(srcBJ, "D:\\img\\beijing" + houZhui);downloadPicture(srcHK, "D:\\img\\huakuai" + houZhuiHK);//11.5、从本地读取背景原图Mat src = Imgcodecs.imread("D:\\img\\beijing" + houZhui, Imgcodecs.IMREAD_GRAYSCALE);Mat srcBenDiHK = Imgcodecs.imread("D:\\img\\huakuai" + houZhuiHK, Imgcodecs.IMREAD_GRAYSCALE);//11.6、创建一个新的背景图,方便做标记Mat clone = src.clone();Mat result = new Mat();//11.7、匹配小图在大图中的位置  用标准模式去比较 然后把返回结果给resultImgproc.matchTemplate(src, srcBenDiHK, result, Imgproc.TM_CCORR_NORMED);Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());//11.8、获取匹配结果坐标Core.MinMaxLocResult minMaxLocResult = Core.minMaxLoc(result);Point maxLoc = minMaxLocResult.maxLoc;//11.9、在图上做标记Imgproc.rectangle(clone, maxLoc,new Point(maxLoc.x + srcBenDiHK.cols(), maxLoc.y + srcBenDiHK.rows()),new Scalar(0, 255, 0));Imgcodecs.imwrite("D:\\img\\close.jpg", clone);//11.10、将背景图存储在本地Imgcodecs.imwrite("D:\\img\\beijing" + houZhui, src);Imgcodecs.imwrite("D:\\img\\huakuai" + houZhuiHK, srcBenDiHK);double distance = maxLoc.x - maxLoc.y;//11.11、模拟移动move(driver, sliderHK, (int) distance + 20);//11.12、移动后看看是否还存在不try {TimeUnit.SECONDS.sleep(2);driver.findElement(By.className("yidun_bg-img"));} catch (Exception e) {flag = false;System.out.println("验证成功");}}} while (flag);System.out.println("循环结束,验证成功");}/*** 下载图片到本地* */private static void downloadPicture(String urlList, String path) {URL url = null;try {url = new URL(urlList);DataInputStream dataInputStream = new DataInputStream(url.openStream());FileOutputStream fileOutputStream = new FileOutputStream(new File(path));ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length;while ((length = dataInputStream.read(buffer)) > 0) {output.write(buffer, 0, length);}fileOutputStream.write(output.toByteArray());dataInputStream.close();fileOutputStream.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 模拟人工移动** @param driver*/public static void move(WebDriver driver, WebElement element, int distance) throws InterruptedException {int randomTime = 0;if (distance > 90) {randomTime = 250;} else if (distance > 80 && distance <= 90) {randomTime = 150;}List<Integer> track = getMoveTrack(distance - 2);int moveY = 0;try {//初始化鼠标对象Actions actions = new Actions(driver);//鼠标按住左键不动actions.clickAndHold(element).perform();Thread.sleep(200);for (int i = 0; i < track.size(); i++) {//把元素滑动到执行坐标actions.moveByOffset(track.get(i), moveY).perform();Thread.sleep(new Random().nextInt(300) + randomTime);}Thread.sleep(200);actions.release(element).perform();} catch (Exception e) {e.printStackTrace();}}/*** 根据距离获取滑动轨迹** @param* @return*/public static List<Integer> getMoveTrack(int distance) {List<Integer> track = new ArrayList<>();// 移动轨迹Random random = new Random();int current = 0;// 已经移动的距离int mid = (int) distance * 4 / 5;// 减速阈值int a = 0;int move = 0;// 每次循环移动的距离while (true) {a = random.nextInt(10);if (current <= mid) {move += a;// 不断加速} else {move -= a;}if ((current + move) < distance) {track.add(move);} else {track.add(distance - current);break;}current += move;}return track;}}

因为贴出来的代码里面账号密码不是正确的,提示错误就可以了,具体的看操作流程

 opencv的安装流程在这文章里面没有,需要自己单独安装或者评论滴滴

java+opencv+selenium实现滑块滑动破解相关推荐

  1. 017:Opencv+Selenium模拟QQ邮箱滑块操作

    之前发了一个国航的滑块模拟操作,没有计算滑块到缺口的位置. 本篇则是用opencv+selenium来对QQ邮箱的滑块进行模拟测试. QQ邮箱链接: https://mail.qq.com/ QQ邮箱 ...

  2. python+opencv+selenium自动化登录邮箱并解决滑动验证

    前言 大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他 如下:   在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种.若我们的程序自动输 ...

  3. Selenium模拟登录系列 | 淘宝滑块验证码破解!不难嘛!

    导 语 好久没更新了,上来冒个泡吧.各位小伙伴还记得前段时间号主挖过的一个坑嘛(虽然我曾经挖过无数个坑T_T): Selenium模拟登录系列 | B站滑块验证码破解 今天随手更新了一下Seleniu ...

  4. 极验滑块验证码破解最新版

    一.简述: 最近无聊想搞一下极验的滑块验证码破解这块,发现破解js代码耗时又耗力出现版本更新可能以前的所有努力都要推翻重做,不够通用性,最后还是选用selenium + PIL 来实现滑块验证码的破解 ...

  5. 用selenium解决滑块验证码

    前言 因为种种原因没能实现愿景的目标,在这里记录一下中间结果,也算是一个收场吧.这篇博客主要是用selenium解决滑块验证码的个别案列. 思路: 用selenium打开浏览器指定网站 将残缺块图片和 ...

  6. 极验第四代滑块验证码破解(三):滑块轨迹构造

    极验第四代滑块验证码破解(三):滑块轨迹构造 声明 一.极验滑动轨迹分析 1. 生成滑动轨迹的js入口 2. 滑动轨迹的python实现 二.结语 *本期文章结束啦,如果对您有帮助,记得收藏加关注哦, ...

  7. 极验第四代滑块验证码破解(四):请求分析及加密参数破解

    极验第四代滑块验证码破解(四):请求分析及加密参数破解 声明 一.极验请求分析 1. 滑块测试网站入口 2. 滑块验证过程抓包 3. 请求详解 3.1. adaptive-captcha-demo 3 ...

  8. 极验滑块验证码破解与研究(三):滑块缺口识别

    极验滑块验证码破解与研究(三):滑块缺口识别 声明 一.环境安装 1. 第三方库安装 二.滑块缺口识别 1. 准备工作 2. 工具函数说明 3. 接口识别原理讲解 4. 缺口识别完整代码 三.结语 * ...

  9. Java使用Selenium+ChromeDriver 爬取中国知网

    Java使用Selenium 爬取中国知网 所需Jar包 中国知网的网页结构,我就不在这里赘述了,自己去看,这里我操作的是爬取博硕论文,只抓取前十页 当Selenium无法调取ChromeDriver ...

最新文章

  1. 设计模式(五)责任链模式
  2. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.5. 重点回顾)
  3. Java核心(三)并发中的线程同步与锁
  4. 如何将char类型数据转化给int
  5. QT的QMediaPlayer类的使用
  6. HarmonyOS之组件布局的创建和使用
  7. Storm 04_Storm单机模式搭建完全分布式安装部署集群drpc
  8. android中viewpager+fragment,Android开发之ViewPager+Fragment
  9. [转]Eclipse+pydev 常用快捷键
  10. (38)FPGA面试技能提升篇(C/C++、questasim仿真工具)
  11. 50个常用的笔试、面试sql语句
  12. BZOJ1259:[CQOI2007]矩形rect(DFS)
  13. mysql的四大特性(AICD)
  14. 《王二丫的甜品店》用户隐私政策
  15. flutter 单线程异步 及 isolate 使用过程遇到的问题
  16. 2020再见,2021你好之年度总结
  17. MID-TERM EXAMINATION 1
  18. 少儿编程培养孩子逻辑思维
  19. Linux·工作队列
  20. 16 服务器无响应什么意思,dns电脑服务器未响应是什么意思如何处理

热门文章

  1. SpringBoot2.0整合Redis实战
  2. 结合opencv学习DIP
  3. ad17 linux 版本,Altium Designer更新得那么快,到底应该用哪个版本?
  4. 深入理解JVM运行原理(一)
  5. Activiti7-BPMN介绍
  6. JavaScript程序基础(六)循环语句
  7. 垂钓之王hd_如果收到网络钓鱼电子邮件该怎么办?
  8. [乐意黎翻译]JavaScript命令之Console大全
  9. 分析了16年的福利彩票记录,原来可以用Python这么买彩票
  10. 计算机组成原理(二) 计算机算术