[Identificación del código de verificación] Código de verificación del rompecabezas deslizante de la imagen superior

Prefacio

Este artículo describe en detalle todo el proceso para descifrar el código de verificación deslizante de la imagen superior, incluidas las ideas para descifrar, los pasos de implementación y los resultados de la prueba. Creo que puede descifrar fácilmente el código de verificación deslizante después de leerlo;

1. Análisis de la composición del código de verificación

Inserte la descripción de la imagen aquí
A juzgar por las tres imágenes anteriores, el código de verificación del rompecabezas deslizante de la imagen superior se compone de un rompecabezas pequeño y una imagen de fondo grande. La forma del rompecabezas es diferente. Hay dos espacios de sombra en la imagen de fondo: uno es el mismo que el Hueco de sombra, también hay un hueco de sombra de forma y tamaño inciertos.
Inserte la descripción de la imagen aquí

2. Analiza las ideas geniales

  1. Primero, de acuerdo con la composición de este código de verificación, analicemos lo que debemos hacer:

De acuerdo con el proceso de operación manual normal, necesitamos ver la posición del espacio de sombra correspondiente al rompecabezas en la imagen de fondo, y luego presionar el control deslizante inferior para alinear el rompecabezas con el espacio para completar la verificación.

  1. Luego, según lo que la gente quiera hacer, analice lo que hace el programa:

Según el análisis, se obtienen los siguientes pasos:
1. Obtener dos imágenes (imagen de fondo, rompecabezas)
2. Procesar las imágenes, obtener la posición de la sombra y calcular la distancia de deslizamiento
3. Simular el deslizamiento según la distancia de deslizamiento

3. Pasos específicos

1. Ver el código fuente de la página web y extraer la información de la imagen.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Como puede ver en la imagen de arriba, la dirección de red del rompecabezas se almacena en la <img>etiqueta y la imagen de fondo se canvesmuestra en forma de lienzo.
Para el rompecabezas, podemos obtener la dirección de red en la etiqueta img a través de selenium y luego obtener la información de la imagen a través de la solicitud.
Para la imagen de fondo, consulte "Cómo tomar la imagen en el lienzo" para obtener la información de la imagen.

2. Procesar imágenes y calcular la distancia de deslizamiento

Dado que el formato de imagen del rompecabezas webpno es fácil de manejar, primero convertimos el rompecabezas en un pngformato.
Necesita importar el paquete jar webp-imageio-core-0.1.0.jar

String sUrl = driver.findElement(By.className("dx_captcha_basic_sub-slider")).findElement(By.tagName("img")).getAttribute("src");
File f = new File("d://dximg.webp");
FileUtils.copyURLToFile(new URL(sUrl), f);

ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();
WebPReadParam readParam = new WebPReadParam();
readParam.setBypassFiltering(true);
reader.setInput(new FileImageInputStream(f));
BufferedImage image = reader.read(0, readParam);
ImageIO.write(image, "png", new File("d://dximg.png"));

El siguiente es el proceso de procesamiento de imágenes.
1. De acuerdo con la posición de altura del rompecabezas en la página, recorte la imagen de fondo para reducir el rango de coincidencia.

// 大图裁剪
BufferedImage sBI = ImageIO.read(sFile);
BufferedImage bgBI = ImageIO.read(bFile);
bgBI = bgBI.getSubimage(0, top, bgBI.getWidth(), sBI.getHeight());
ImageIO.write(bgBI, "png", bFile);

Inserte la descripción de la imagen aquí

2. Convierte la parte transparente del rompecabezas en blanco.

setWhite(sBI);
ImageIO.write(sBI, "png", sFile);
/**
* 透明区域变白
 * 
 * @param image
 * @param param
 * @throws IOException
 */
public void setWhite(BufferedImage image) throws IOException {
    
    
	if (image == null) {
    
    
		return;
	} else {
    
    
		int rgb;
		for (int i = 0; i < image.getWidth(); i++) {
    
    
			for (int j = 0; j < image.getHeight(); j++) {
    
    
				rgb = image.getRGB(i, j);
				int A = (rgb & 0xFF000000) >>> 24;
				if (A < 100) {
    
    
					image.setRGB(i, j, new Color(255, 255, 255).getRGB());
				}
			}
		}
	}
}

Inserte la descripción de la imagen aquí
3. Convierta las dos imágenes en imágenes en escala de grises y luego realice un umbral adaptativo

Mat s_mat = Imgcodecs.imread(sFile.getPath());
Mat b_mat = Imgcodecs.imread(bFile.getPath());

// 转灰度图像
Mat s_newMat = new Mat();
Mat b_newMat = new Mat();
Imgproc.cvtColor(s_mat, s_newMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(b_mat, b_newMat, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite(sFile.getPath(), s_newMat);
Imgcodecs.imwrite(bFile.getPath(), b_newMat);
// 自适应阈值化
Mat s_nMat = new Mat();
Imgproc.adaptiveThreshold(s_newMat, s_nMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 7, -4);
Imgcodecs.imwrite(sFile.getPath(), s_nMat);
Mat b_nMat = new Mat();
Imgproc.adaptiveThreshold(b_newMat, b_nMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 7, -4);
Imgcodecs.imwrite(bFile.getPath(), b_nMat);

b_mat = Imgcodecs.imread(bFile.getPath());
s_mat = Imgcodecs.imread(sFile.getPath());

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
4. Coincidencia aproximada de las dos imágenes después del procesamiento

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_CCOEFF); // 相关系数匹配法
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, 255, 0, 0));
Imgcodecs.imwrite("d:/dx.png", b_mat);

Inserte la descripción de la imagen aquí
5. Calcule la distancia a deslizar de acuerdo con la relación entre la imagen y la visualización de la página.

(matchLocation.x + s_mat.cols() - sBI.getWidth()) * 3 / 4 - 8)
3. Simular el deslizamiento según la distancia de deslizamiento.

Obtenga la distancia de deslizamiento y controle directamente el deslizamiento del control deslizante.
El código deslizante es el siguiente:


	/**
	 * 模拟人工移动
	 * 
	 * @param driver
	 * @param element页面滑块
	 * @param distance需要移动距离
	 * @throws InterruptedException
	 */
	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 <= 90) {
    
    
			randomTime = 150;
		}
		List<Integer> 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 < track.size(); i++) {
    
    
				actions.moveByOffset(track.get(i), moveY).perform();
				Thread.sleep(new Random().nextInt(300) + randomTime);
			}
			Thread.sleep(200);
			actions.release(element).perform();
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}

	/**
	 * 根据距离获取滑动轨迹
	 * 
	 * @param distance需要移动的距离
	 * @return
	 */
	public static List<Integer> getMoveTrack(int distance) {
    
    
		List<Integer> 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 <= mid) {
    
    
				move += a;// 不断加速
			} else {
    
    
				move -= a;
			}
			if ((current + move) < distance) {
    
    
				track.add(move);
			} else {
    
    
				track.add(distance - current);
				break;
			}
			current += move;
		}
		return track;
	}

	

4. Pantalla de resultados

Todos los procesos están terminados, prueba el efecto.
Inserte la descripción de la imagen aquí
¿Cómo no está mal?

5. Análisis de resultados

objetivos:

Identifique la ubicación de la sombra, calcule la distancia de deslizamiento correspondiente y simule el deslizamiento.

Ideas de realización:

1. Obtenga dos imágenes (imagen de fondo, rompecabezas)
2. Procese las imágenes, obtenga la posición de la sombra y calcule la distancia de deslizamiento
3. Simule el deslizamiento de acuerdo con la distancia de deslizamiento

Identificación que requiere mucho tiempo:

15-50 ms

Tasa de aprobación:

> 95%

6. Conclusión

Este artículo está aquí, gracias a los grandes por detenerse y mirar, a los grandes por su atención y elogios ~

Gracias chicos ~
Inserte la descripción de la imagen aquí


Autor: gato con sabor a taro Dian

Haga clic aquí → Kangkang ¡Cuántos sitios web tienen registrado su número de teléfono móvil! ! !

Supongo que te gusta

Origin blog.csdn.net/weixin_44549063/article/details/112193218
Recomendado
Clasificación