赞
踩
本文详述了破解极验滑动验证码的全过程,包括思路、步骤和测试结果。相信读后,你也能轻松破解。
从两张图可见,极验滑动验证码由一个小拼图和大背景图组成。拼图形状多样,背景图中有一缺口,其形状与拼图相符。
我们使用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%。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。