使用java + selenium + OpenCV破解腾讯防水墙滑动验证码功能

这篇文章主要介绍了使用java + selenium + OpenCV破解腾讯防水墙滑动验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

* 验证码地址:https://007.qq.com/online.html

* 使用OpenCv模板匹配

* 成功率90%左右

* Java + Selenium + OpenCV

产品样例

来吧!展示!

注意!!!

在模拟滑动时不能按照相同速度或者过快的速度滑动,需要向人滑动时一样先快后慢,这样才不容易被识别。

模拟滑动代码↓↓↓

/** * 模拟人工移动 * @param driver * @param element页面滑块 * @param distance需要移动距离 */ public static void move(WebDriver driver, WebElement element, int distance) throws InterruptedException { int randomTime = 0; if (distance > 90) { randomTime = 250; } else if (distance > 80 && distance track = getMoveTrack(distance - 2); int moveY = 1; try { Actions actions = new Actions(driver); actions.clickAndHold(element).perform(); Thread.sleep(200); for (int i = 0; i getMoveTrack(int distance) { List track = new ArrayList();// 移动轨迹 Random random = new Random(); int current = 0;// 已经移动的距离 int mid = (int) distance * 4 / 5;// 减速阈值 int a = 0; int move = 0;// 每次循环移动的距离 while (true) { a = random.nextInt(10); if (current

看操作,no bb,直接上代码

private final String INDEX_URL = "https://007.qq.com/online.html?ADTAG=index.head"; private void seleniumtest() { ChromeDriverManager manager = ChromeDriverManager.getInstance(); int status = -1; try { WebDriver driver = manager.getDriver(); driver.get(INDEX_URL); driver.manage().window().maximize(); // 设置浏览器窗口最大化 Thread.sleep(10000); driver.findElement(By.className("wp-onb-tit")).findElements(By.tagName("a")).get(1).click(); Thread.sleep(500); // 点击出现滑动图 waitWebElement(driver, By.id("code"), 500).click(); Thread.sleep(100); // 获取到验证区域 driver.switchTo().frame(waitWebElement(driver, By.id("tcaptcha_iframe"), 500)); Thread.sleep(100); // 获取滑动按钮 WebElement moveElemet = waitWebElement(driver, By.id("tcaptcha_drag_button"), 500); Thread.sleep(100); // 获取带阴影的背景图 String bgUrl = waitWebElement(driver, By.id("slideBg"), 500).getAttribute("src"); Thread.sleep(100); // 获取带阴影的小图 String sUrl = waitWebElement(driver, By.id("slideBlock"), 500).getAttribute("src"); Thread.sleep(100); // 获取高度 String topStr = waitWebElement(driver, By.id("slideBlock"), 500).getAttribute("style").substring(32, 36); int top = Integer.parseInt(topStr.substring(0, topStr.indexOf("p"))) * 2; Thread.sleep(100); // 计算移动距离 int distance = (int) Double.parseDouble(getTencentdistance(bgUrl, sUrl, top)); // 滑动 move(driver, moveElemet, distance); Thread.sleep(5000); } catch (Exception e) { e.printstacktrace(); } finally { manager.closeDriver(status); } } /** * 获取腾讯验证滑动距离 * * @return */ public static String dllPath = "C://chrome//opencv_java440.dll"; public String getTencentdistance(String bUrl, String sUrl, int top) { System.load(dllPath); File bFile = new File("C:/qq_b.jpg"); File sFile = new File("C:/qq_s.jpg"); try { FileUtils.copyURLToFile(new URL(bUrl), bFile); FileUtils.copyURLToFile(new URL(sUrl), sFile); BufferedImage bgBI = ImageIO.read(bFile); BufferedImage sBI = ImageIO.read(sFile); // 裁剪 bgBI = bgBI.getSubimage(360, top, bgBI.getWidth() - 370, sBI.getHeight()); ImageIO.write(bgBI, "png", bFile); Mat s_mat = Imgcodecs.imread(sFile.getPath()); Mat b_mat = Imgcodecs.imread(bFile.getPath()); // 转灰度图像 Mat s_newMat = new Mat(); Imgproc.cvtColor(s_mat, s_newMat, Imgproc.COLOR_BGR2GRAY); // 二值化图像 binaryzation(s_newMat); Imgcodecs.imwrite(sFile.getPath(), s_newMat); int result_rows = b_mat.rows() - s_mat.rows() + 1; int result_cols = b_mat.cols() - s_mat.cols() + 1; Mat g_result = new Mat(result_rows, result_cols, CvType.CV_32FC1); Imgproc.matchTemplate(b_mat, s_mat, g_result, Imgproc.TM_SQDIFF); // 归一化平方差匹配法 // 归一化相关匹配法 Core.normalize(g_result, g_result, 0, 1, Core.norM_MINMAX, -1, new Mat()); Point matchLocation = new Point(); MinMaxLocResult mmlr = Core.minMaxLoc(g_result); matchLocation = mmlr.maxLoc; // 此处使用maxLoc还是minLoc取决于使用的匹配算法 Imgproc.rectangle(b_mat, matchLocation, new Point(matchLocation.x + s_mat.cols(), matchLocation.y + s_mat.rows()), new Scalar(0, 0, 0, 0)); return "" + ((matchLocation.x + s_mat.cols() + 360 - sBI.getWidth() - 46) / 2); } catch (Throwable e) { e.printstacktrace(); return null; } finally { bFile.delete(); sFile.delete(); } } /** * * @param mat * 二值化图像 */ public static void binaryzation(Mat mat) { int BLACK = 0; int WHITE = 255; int ucThre = 0, ucThre_new = 127; int nBack_count, nData_count; int nBack_sum, nData_sum; int nValue; int i, j; int width = mat.width(), height = mat.height(); // 寻找最佳的阙值 while (ucThre != ucThre_new) { nBack_sum = nData_sum = 0; nBack_count = nData_count = 0; for (j = 0; j ucThre_new) { nBack_sum += nValue; nBack_count++; } else { nData_sum += nValue; nData_count++; } } } nBack_sum = nBack_sum / nBack_count; nData_sum = nData_sum / nData_count; ucThre = ucThre_new; ucThre_new = (nBack_sum + nData_sum) / 2; } // 二值化处理 int nBlack = 0; int nWhite = 0; for (j = 0; j ucThre_new) { mat.put(j, i, WHITE); nWhite++; } else { mat.put(j, i, BLACK); nBlack++; } } } // 确保白底黑字 if (nBlack > nWhite) { for (j = 0; j

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...