0


使用Java和Selenium实现滑动验证码识别及自动登录的完整教程

准备工作
确保你已经安装了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

标签: python 开发语言

本文转载自: https://blog.csdn.net/rrrrroottttttt/article/details/138389986
版权归原作者 rrrrroottttttt 所有, 如有侵权,请联系我们删除。

“使用Java和Selenium实现滑动验证码识别及自动登录的完整教程”的评论:

还没有评论