[验证码识别]OpenCV应对极验滑动拼图验证码

本文详述了破解极验滑动验证码的全过程,包括思路、步骤和测试结果。相信读后,你也能轻松破解。

从两张图可见,极验滑动验证码由一个小拼图和大背景图组成。拼图形状多样,背景图中有一缺口,其形状与拼图相符。

我们使用F12开发者工具打开浏览器控制台,观察一下验证码的页面结构。

通过观察,验证码的图片都是以<canvas>元素在页面上展示,并有三张图片。第三张图片的属性设置为style="display: none;",使其隐藏。我们可以更改页面代码来查看这张隐藏的图片。

代码修改后发现,这正是完整的背景图。从命名可以判定这三张图的内容:

.第一张class为"geetest_canvas_bg geetest_absolute",应是带缺口的背景图。

.第二张class为"geetest_canvas_slice geetest_absolute",应为拼图。

.第三张是完整的背景图。

破解思路分析:

人工操作流程:首先,我们会找出背景图中与拼图对应的阴影缺口位置,然后按住滑块将拼图移至缺口处完成验证。

程序操作流程:基于人工操作,我们可以将程序操作分为以下步骤:

.获取两张图片(带缺口背景图、完整背景图)。

.处理图片,识别阴影位置并计算滑动距离。

.模拟滑动操作。

操作详细步骤:

.获取两张图片。 因图片都是通过canvas呈现,我们可以执行JS代码生成图片。

图片处理与滑动距离计算

通过第一步获得的两张图片中,有两个不同之处:一个差异较小,另一个差异明显。我们可以通过比较像素点的差异来确定阴影缺口的位置。滑动距离等于缺口位置的横坐标减去小图与边框的距离。

以下是核心代码:

不会编程的可以借用打码平台来实现验证码自动识别,例如:suocr.com

public class GeetestSolver {

    private static final String INDEX_URL = "https://www.geetest.com/Register";
    
    // Utilities and helper methods

    protected static void sleep(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException ignored) {
        }
    }

    private static int difference(int[] a, int[] b) {
        return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]) + Math.abs(a[2] - b[2]);
    }

    private static ByteArrayOutputStream imgStrToFile(String imgBase64Str) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            if (imgBase64Str != null) {
                BASE64Decoder decoder = new BASE64Decoder();
                byte[] data = decoder.decodeBuffer(imgBase64Str);
                outputStream.write(data);
                outputStream.flush();
            }
            return outputStream;
        } catch (IOException e) {
            return null;
        }
    }

    // ... Rest of the helper methods

    // Main functionality methods

    public WebElement waitWebElement(WebDriver driver, By by, int count) {
        for (int k = 0; k < count; k++) {
            try {
                return driver.findElement(by);
            } catch (NoSuchElementException ex) {
                System.out.print("Waiting for element: " + by.toString());
                sleep(50);
            }
        }
        System.out.println("Timeout for: " + by.toString());
        return null;
    }

    // ... Rest of the main functionality methods
    
    public void seleniumTest() {
        ChromeDriverManager manager = ChromeDriverManager.getInstance();
        int status = -1;
        String phone = "13814389438";
        try {
            WebDriver driver = manager.getDriver();
            driver.get(INDEX_URL);
            driver.manage().window().maximize();
            sleep(2000);

            // ... Rest of the logic

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            manager.closeDriver(status);
        }
    }

    // ... Rest of the class

}

.根据滑动距离模拟操作

在获得滑动距离后,我们需要考虑滑动轨迹。如果轨迹过于规律,可能会被识别为非人为操作。因此,我们应模仿人类的正常操作:开始时快速滑动,逐渐减速直至对准缺口;在缺口位置稍作停留和左右调整,仿佛在欣赏操作成果。

成果展示

五、结果分析 目标:模拟滑动,识别阴影位置并计算对应的滑动距离。

实现步骤:

.获取完整图和缺口图。

.分析图片,确定阴影位置并计算出滑动距离。

.根据计算的滑动距离进行模拟滑动。

处理时间:15 - 50毫秒 成功率:超过95%。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值