准备工作
确保你已经安装了Java开发环境和Selenium库,并且能够访问网络。
实现步骤
1. 初始化
首先,创建一个Java项目,并添加Selenium库的依赖。
xml
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
2. 模拟登录填写,点开滑块验证
在模拟登录过程中,我们需要输入账户和密码,然后点击滑块验证按钮。
java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class CrackGeetest {
private static final String EMAIL = "你的登录账户";
private static final String PASSWORD = "你的登录密码";
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://account.geetest.com/login");
WebElement emailInput = driver.findElement(By.id("email"));
emailInput.sendKeys(EMAIL);
WebElement passwordInput = driver.findElement(By.id("password"));
passwordInput.sendKeys(PASSWORD);
WebElement captchaButton = driver.findElement(By.className("geetest_radar_tip"));
captchaButton.click();
// 其他操作...
}
}
3. 获取并储存有无缺口的两张图片
接下来,我们需要获取网页截图并裁剪出验证码图片,包括有缺口和无缺口的图片。
java
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
public class CrackGeetest {
// 模拟登录填写...
public static void main(String[] args) {
// 模拟登录填写...
// 获取无缺口图片
WebElement captchaImg1 = driver.findElement(By.className("geetest_canvas_img"));
File screenshot1 = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
BufferedImage fullImg1 = ImageIO.read(screenshot1);
Point point1 = captchaImg1.getLocation();
int width1 = captchaImg1.getSize().getWidth();
int height1 = captchaImg1.getSize().getHeight();
BufferedImage captcha1 = fullImg1.getSubimage(point1.getX(), point1.getY(), width1, height1);
ImageIO.write(captcha1, "png", new File("captcha1.png"));
captchaButton.click(); // 触发滑块拖动
// 获取有缺口图片
WebElement captchaImg2 = driver.findElement(By.className("geetest_canvas_img"));
File screenshot2 = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
BufferedImage fullImg2 = ImageIO.read(screenshot2);
Point point2 = captchaImg2.getLocation();
int width2 = captchaImg2.getSize().getWidth();
int height2 = captchaImg2.getSize().getHeight();
BufferedImage captcha2 = fullImg2.getSubimage(point2.getX(), point2.getY(), width2, height2);
ImageIO.write(captcha2, "png", new File("captcha2.png"));
// 其他操作...
}
}
4. 获取缺口位置
通过对比两张图片的像素点,找到缺口位置。
java
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class CrackGeetest {
// 模拟登录填写...
public static void main(String[] args) {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置
BufferedImage captchaImage1 = ImageIO.read(new File("captcha1.png"));
BufferedImage captchaImage2 = ImageIO.read(new File("captcha2.png"));
int gap = getGapPosition(captchaImage1, captchaImage2);
System.out.println("缺口位置:" + gap);
// 其他操作...
}
private static int getGapPosition(BufferedImage image1, BufferedImage image2) {
int gap = 0;
int threshold = 100;
for (int x = 0; x < image1.getWidth(); x++) {
for (int y = 0; y < image1.getHeight(); y++) {
int pixel1 = image1.getRGB(x, y);
int pixel2 = image2.getRGB(x, y);
if (Math.abs(pixel1 - pixel2) > threshold) {
gap = x;
break;
}
}
}
return gap;
}
}
5. 获取移动轨迹
根据缺口位置计算出拖动滑块的轨迹。
java
public class CrackGeetest {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置...
public static void main(String[] args) {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置...
// 获取移动轨迹
int track[] = getTrack(gap);
System.out.println("滑动轨迹:" + Arrays.toString(track));
// 其他操作...
}
private static int[] getTrack(int gap) {
int[] track = new int[gap + 1];
int distance = gap - 6;
double t = 0.2;
double v = 0;
double current = 0;
int mid = distance * 4 / 5;
for (int i = 0; i < track.length; i++) {
if (current < mid) {
v += 2;
} else {
v -= 3;
}
double move = v * t + 0.5 * (current++);
track[i] = (int) move;
}
return track;
}
}
6. 按照轨迹拖动,完成验证
最后,根据计算出的轨迹拖动滑块完成验证。
java
import org.openqa.selenium.interactions.Actions;
public class CrackGeetest {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置...
// 获取移动轨迹...
public static void main(String[] args) {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置...
// 获取移动轨迹...
// 按照轨迹拖动
Actions actions = new Actions(driver);
WebElement slider = driver.findElement(By.className("geetest_slider_button"));
actions.clickAndHold(slider).perform();
for (int x : track) {
actions.moveByOffset(x, 0).perform();
}
actions.release().perform();
// 其他操作...
}
}
7. 完成登录
如果验证成功,则执行登录操作。
java
public class CrackGeetest {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置...
// 获取移动轨迹...
// 按照轨迹拖动...
public static void main(String[] args) {
// 模拟登录填写...
// 获取并储存有无缺口的两张图片...
// 获取缺口位置...
// 获取移动轨迹...
// 按照轨迹拖动...
// 完成登录
WebElement loginButton = driver.findElement(By.className("login-btn"));
loginButton.click();
WebElement successElement = driver.findElement(By.className("geetest_success_radar_tip_content"));
if (successElement.getText().equals("验证成功")) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
// 其他操作...
}
}
更多内容联系1436423940