当前位置:   article > 正文

[验证码识别]OpenCV应对极验滑动拼图验证码_java opencv 图像匹配识别滑动验证码缺口

java opencv 图像匹配识别滑动验证码缺口

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

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

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

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

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

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

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

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

破解思路分析:

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

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

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

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

.模拟滑动操作。

操作详细步骤:

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

图片处理与滑动距离计算

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

以下是核心代码:

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

  1. public class GeetestSolver {
  2. private static final String INDEX_URL = "https://www.geetest.com/Register";
  3. // Utilities and helper methods
  4. protected static void sleep(long time) {
  5. try {
  6. Thread.sleep(time);
  7. } catch (InterruptedException ignored) {
  8. }
  9. }
  10. private static int difference(int[] a, int[] b) {
  11. return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]) + Math.abs(a[2] - b[2]);
  12. }
  13. private static ByteArrayOutputStream imgStrToFile(String imgBase64Str) {
  14. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  15. try {
  16. if (imgBase64Str != null) {
  17. BASE64Decoder decoder = new BASE64Decoder();
  18. byte[] data = decoder.decodeBuffer(imgBase64Str);
  19. outputStream.write(data);
  20. outputStream.flush();
  21. }
  22. return outputStream;
  23. } catch (IOException e) {
  24. return null;
  25. }
  26. }
  27. // ... Rest of the helper methods
  28. // Main functionality methods
  29. public WebElement waitWebElement(WebDriver driver, By by, int count) {
  30. for (int k = 0; k < count; k++) {
  31. try {
  32. return driver.findElement(by);
  33. } catch (NoSuchElementException ex) {
  34. System.out.print("Waiting for element: " + by.toString());
  35. sleep(50);
  36. }
  37. }
  38. System.out.println("Timeout for: " + by.toString());
  39. return null;
  40. }
  41. // ... Rest of the main functionality methods
  42. public void seleniumTest() {
  43. ChromeDriverManager manager = ChromeDriverManager.getInstance();
  44. int status = -1;
  45. String phone = "13814389438";
  46. try {
  47. WebDriver driver = manager.getDriver();
  48. driver.get(INDEX_URL);
  49. driver.manage().window().maximize();
  50. sleep(2000);
  51. // ... Rest of the logic
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. } finally {
  55. manager.closeDriver(status);
  56. }
  57. }
  58. // ... Rest of the class
  59. }

.根据滑动距离模拟操作

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

成果展示

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

实现步骤:

.获取完整图和缺口图。

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/287171
推荐阅读
相关标签
  

闽ICP备14008679号