本文将详细介绍如何使用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;
}
}
}