Directorio de artículos
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
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.
2. Analiza las ideas geniales
- 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.
- 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.
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 canves
muestra 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 webp
no es fácil de manejar, primero convertimos el rompecabezas en un png
formato.
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);
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());
}
}
}
}
}
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());
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);
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.
¿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 ~
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! ! !