使用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

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 Selenium 和 Webdriver 来解决滑动验证码的问题,你需要模拟一个真实的用户操作。下面是一些基本步骤: 1. 打开目标网站并输入用户名和密码; 2. 等待页面加载完成; 3. 找到滑动验证码的元素,获取其位置信息; 4. 找到滑块元素,并获取其位置信息; 5. 使用 `ActionChains` 类来模拟用户的拖动操作,将滑块拖动到正确的位置; 6. 检查验证码是否成功通过。 下面是一份示例代码,你需要根据实际情况进行调整: ```python from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time # 打开网站 driver = webdriver.Chrome() driver.get("http://www.example.com") # 输入用户名和密码 username_input = driver.find_element_by_id("username") password_input = driver.find_element_by_id("password") username_input.send_keys("your_username") password_input.send_keys("your_password") driver.find_element_by_id("submit").click() # 等待页面加载 time.sleep(5) # 找到验证码元素 slider = driver.find_element_by_id("slider") slider_bg = driver.find_element_by_id("slider_bg") # 获取元素位置信息 slider_location = slider.location slider_bg_location = slider_bg.location # 计算滑块需要移动的距离 distance = slider_bg_location['x'] + slider_bg.size['width'] - slider_location['x'] - slider.size['width'] # 模拟滑动操作 action = ActionChains(driver) action.click_and_hold(slider).perform() action.move_by_offset(distance, 0).perform() action.release().perform() # 检查验证码是否通过 if "验证成功" in driver.page_source: print("验证码通过") else: print("验证码未通过") # 关闭浏览器 driver.quit() ``` 需要注意的是,有些网站会对滑块进行一些加固,例如添加滑动速度限制、滑块位置随机等,这些都需要你自己去适配。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值