【確認コード識別】トップ画像スライディングパズル確認コード

序文

この記事では、クラッキングのアイデア、実装手順、テスト結果など、トップイメージのスライディング検証コードをクラッキングするすべてのプロセスについて詳しく説明します。スライディング検証コードを読んだ後は、簡単にクラッキングできると思います。

1.検証コードの構成を解析する

ここに画像の説明を挿入
上記の3つの写真から判断すると、上の画像のスライドパズル検証コードは、小さなパズルと大きな背景画像で構成されています。パズルの形状はさまざまです。背景画像には2つのシャドウギャップがあります。1つは同じです。パズル。シャドウギャップ、形状とサイズが不確かなシャドウギャップもあります。
ここに画像の説明を挿入

2.クラッキングのアイデアを分析する

  1. まず、この検証コードの構成に従って、何をする必要があるかを分析しましょう。

通常の手動操作プロセスでは、背景画像でパズルに対応するシャドウギャップの位置を確認し、下のスライダーを押してパズルをギャップに合わせて検証を完了する必要があります。

  1. 次に、人々がやりたいことに応じて、プログラムが何をするかを分析します。

分析によると、次の手順が得られ
ます。1。2つの画像(背景画像、パズル)を取得します
。2。画像を処理し、影の位置を取得して、スライド距離を計算し
ます。3。スライド距離に従ってスライドをシミュレートします。

3.特定の手順

1. Webページのソースコードを表示し、画像情報を抽出します

ここに画像の説明を挿入
ここに画像の説明を挿入
上の写真からわかるように、パズルのネットワークアドレスは<img>ラベルに保存されており、背景画像はcanvesキャンバスの形で表示されてます。
パズルの場合、セレンを介してimgタグのネットワークアドレスを取得し、リクエストを介して画像情報を取得できます。
背景画像については、「キャンバスで画像を取得する方法」を参照して画像情報を取得してください。

2.写真を処理し、スライド距離を計算します

パズルの画像フォーマットはwebp扱いにくいので、まずパズルをpngフォーマットに変換します。
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"));

次は画像処理プロセス
1です。ページ上のパズルの高さの位置に応じて、背景画像をトリミングして一致範囲を狭めます。

// 大图裁剪
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.パズルの透明な部分を白に変えます

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. 2つの画像をグレースケール画像に変換してから、適応しきい値処理を実行します

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.処理後の2つの画像のあいまい一致

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.画像とページ表示の比率に従って、スワイプする距離を計算します

(matchLocation.x + s_mat.cols() - sBI.getWidth()) * 3 / 4 - 8)
3.スライド距離に応じてスライドをシミュレートします

スライド距離を取得し、スライダーのスライドを直接制御します。
スライドコードは次のとおりです。


	/**
	 * 模拟人工移动
	 * 
	 * @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.結果表示

すべてのプロセスが終了しました。効果をテストしてください。
ここに画像の説明を挿入
どうして悪くないの?

5.結果分析

目的:

影の位置を特定し、対応するスライド距離を計算して、スライドをシミュレートします。

実現のアイデア:

1. 2枚の画像(背景画像、パズル)を
取得します。2。画像を処理し、影の位置を取得して、スライド距離を計算し
ます。3。スライド距離に従ってスライドをシミュレートします。

時間のかかる識別:

15〜50ミリ秒

合格率:

> 95%

6.結論

この記事はここにあります、立ち止まって見てくれた大物、あなたの注意と賞賛のための大物に感謝します〜

みんなありがとう〜
ここに画像の説明を挿入


著者:里芋風味の猫ディアン

ここをクリック→カンカンあなたの携帯電話番号が登録されているウェブサイトはいくつありますか?

おすすめ

転載: blog.csdn.net/weixin_44549063/article/details/112193218