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

准备工作
确保你已经安装了Java开发环境和Selenium库,并且能够访问网络。

实现步骤
1. 初始化
首先,创建一个新的Java项目,并添加Selenium WebDriver库的依赖。

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 Main {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

        WebDriver driver = new ChromeDriver();
        driver.get("https://account.geetest.com/login");

        WebElement emailInput = driver.findElement(By.id("email"));
        emailInput.sendKeys("your_email");

        WebElement passwordInput = driver.findElement(By.id("password"));
        passwordInput.sendKeys("your_password");

        WebElement captchaButton = driver.findElement(By.className("geetest_radar_tip"));
        captchaButton.click();

        // 其他操作...
    }
}
3. 获取并储存有无缺口的两张图片
接下来,我们需要获取网页截图并裁剪出验证码图片,包括有缺口和无缺口的图片。

java

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Main {
    // 省略之前的代码...

    public static void main(String[] args) {
        // 模拟登录填写...

        File screenshot1 = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        File captcha1 = new File("captcha1.png");
        FileUtils.copyFile(screenshot1, captcha1);

        WebElement captchaSlider = driver.findElement(By.className("geetest_slider_button"));
        captchaSlider.click();

        File screenshot2 = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        File captcha2 = new File("captcha2.png");
        FileUtils.copyFile(screenshot2, captcha2);

        // 其他操作...
    }
}
4. 获取缺口位置
通过对比两张图片的像素点,找到缺口位置。

java

import org.apache.commons.io.FileUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Main {
    // 省略之前的代码...

    public static void main(String[] args) {
        // 模拟登录填写...
        // 获取并储存有无缺口的两张图片...

        BufferedImage captcha1 = ImageIO.read(new File("captcha1.png"));
        BufferedImage captcha2 = ImageIO.read(new File("captcha2.png"));
        int gap = getGapPosition(captcha1, captcha2);
        System.out.println("缺口位置: " + gap);

        // 其他操作...
    }

    public static int getGapPosition(BufferedImage image1, BufferedImage image2) {
        int threshold = 60;
        for (int x = 0; x < image1.getWidth(); x++) {
            for (int y = 0; y < image1.getHeight(); y++) {
                int rgb1 = image1.getRGB(x, y);
                int rgb2 = image2.getRGB(x, y);
                Color color1 = new Color(rgb1);
                Color color2 = new Color(rgb2);
                if (Math.abs(color1.getRed() - color2.getRed()) < threshold &&
                        Math.abs(color1.getGreen() - color2.getGreen()) < threshold &&
                        Math.abs(color1.getBlue() - color2.getBlue()) < threshold) {
                    return x;
                }
            }
        }
        return 0;
    }
}
5. 获取移动轨迹
根据缺口位置计算出拖动滑块的轨迹。

java

import java.util.ArrayList;
import java.util.List;

public class Main {
    // 省略之前的代码...

    public static void main(String[] args) {
        // 模拟登录填写...
        // 获取并储存有无缺口的两张图片...
        // 获取缺口位置...

        int[] track = getTrack(gap);
        System.out.println("滑动轨迹: " + Arrays.toString(track));

        // 其他操作...
    }

    public static int[] getTrack(int distance) {
        List<Integer> track = new ArrayList<>();
        int current = 0;
        int mid = distance * 4 / 5;
        double t = 0.2;
        double v = 0;

        while (current < distance) {
            int a = current < mid ? 2 : -3;
            double v0 = v;
            v = v0 + a * t;
            int move = (int) (v0 * t + 0.5 * a * t * t);
            current += move;
            track.add(move);
        }

        return track.stream().mapToInt(Integer::intValue).toArray();
    }
}
6. 按照轨迹拖动,完成验证
最后,根据计算出的轨迹拖动滑块完成验证。

java

import org.openqa.selenium.interactions.Actions;

public class Main {
    // 省略之前的代码...

    public static void main(String[] args) {
        // 模拟登录填写...
        // 获取并储存有无缺口的两张图片...
        // 获取缺口位置...
        // 获取移动轨迹...

        moveSlider(driver, track);

        // 其他操作...
    }

    public static void moveSlider(WebDriver driver, int[] track) {
        WebElement slider = driver.findElement(By.className("geetest_slider_button"));
        Actions actions = new Actions(driver);
        actions.clickAndHold(slider).perform();
        for (int x : track) {
            actions.moveByOffset(x, 0).perform();
        }
        actions.release().perform();
    }
}
7. 完成登录
如果验证成功,则执行登录操作。

java

public class Main {
    // 省略之前的代码...

    public static void main(String[] args) {
        // 模拟登录填写...
        // 获取并储存有无缺口的两张图片...
        // 获取缺口位置...
        // 获取移动轨迹...
        // 按照轨迹拖动...

        WebElement loginButton = driver.findElement(By.className("login-btn"));
        loginButton.click();
        System.out.println("登录成功");

        // 其他操作...
    }
}

更多内容联系1436423940

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值