← 返回文章列表

深度解析:使用Java + Selenium + OpenCV破解网易易盾滑动验证码

本文将详细介绍如何使用Java结合Selenium和OpenCV破解网易易盾滑动验证码。通过模拟人工滑动行为,我们可以实现自动化操作。环境准备安装依赖确保你已经安装了以下软件和库:JavaDevelopmentKit(JDK):建议使用JD

本文将详细介绍如何使用Java结合Selenium和OpenCV破解网易易盾滑动验证码。通过模拟人工滑动行为,我们可以实现自动化操作。

环境准备

安装依赖

确保你已经安装了以下软件和库:

Java Development Kit (JDK):建议使用JDK 8或更高版本。

Maven:用于依赖管理。

ChromeDriver:用于控制Chrome浏览器。

使用Maven来管理依赖,可以在你的pom.xml文件中添加以下依赖:

xml

<dependencies>

<!-- Selenium -->

<dependency>

<groupId>org.seleniumhq.selenium</groupId>

<artifactId>selenium-java</artifactId>

<version>3.141.59</version>

</dependency>

<!-- OpenCV -->

<dependency>

<groupId>org.openpnp</groupId>

<artifactId>opencv</artifactId>

<version>4.5.1-2</version>

</dependency>

</dependencies>

此外,还需要下载并配置OpenCV库,并将opencv_java440.dll放置在合适的路径下。

项目结构

确保你的项目结构如下:

css

.

├── pom.xml

└── src

└── main

└── java

└── yourpackage

├── Main.java

└── OpenCVUtils.java

初始化WebDriver并获取验证码图片

Main.java

java

package yourpackage;

import org.openqa.selenium.*;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.interactions.Actions;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.net.URL;

import java.util.Random;

import java.util.concurrent.TimeUnit;

public class Main {

public static void main(String[] args) {

System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

WebDriver driver = new ChromeDriver();

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

driver.get("https://dun.163.com/trial/jigsaw");

try {

// 获取滑块和背景图片

WebElement bgImageElement = driver.findElement(By.cssSelector("css_selector_for_bg_image"));

WebElement sliderImageElement = driver.findElement(By.cssSelector("css_selector_for_slider_image"));

// 下载图片

String bgUrl = bgImageElement.getAttribute("src");

String sliderUrl = sliderImageElement.getAttribute("src");

BufferedImage bgImage = ImageIO.read(new URL(bgUrl));

BufferedImage sliderImage = ImageIO.read(new URL(sliderUrl));

ImageIO.write(bgImage, "png", new File("bgImage.png"));

ImageIO.write(sliderImage, "png", new File("sliderImage.png"));

// 计算滑动距离

double distance = OpenCVUtils.getDistance("bgImage.png", "sliderImage.png");

// 模拟滑动

WebElement slider = driver.findElement(By.cssSelector("css_selector_for_slider"));

moveSlider(driver, slider, (int) distance);

} catch (Exception e) {

e.printStackTrace();

} finally {

driver.quit();

}

}

public static void moveSlider(WebDriver driver, WebElement slider, int distance) throws InterruptedException {

Actions actions = new Actions(driver);

actions.clickAndHold(slider).perform();

int moveX = 0;

int moveY = 0;

Random rand = new Random();

while (moveX < distance) {

int x = rand.nextInt(10);

actions.moveByOffset(x, moveY).perform();

moveX += x;

Thread.sleep(rand.nextInt(100));

}

actions.release().perform();

}

}

使用OpenCV计算滑动距离

OpenCVUtils.java

java

package yourpackage;

import org.opencv.core.*;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

public class OpenCVUtils {

static {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

}

public static double getDistance(String bgImagePath, String sliderImagePath) {更多内容联系1436423940

try {

Mat bgMat = Imgcodecs.imread(bgImagePath, Imgcodecs.IMREAD_GRAYSCALE);

Mat sliderMat = Imgcodecs.imread(sliderImagePath, Imgcodecs.IMREAD_GRAYSCALE);

Mat result = new Mat();

Imgproc.matchTemplate(bgMat, sliderMat, result, Imgproc.TM_CCOEFF_NORMED);

Core.MinMaxLocResult mmr = Core.minMaxLoc(result);

Point matchLoc = mmr.maxLoc;

return matchLoc.x;

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

}