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