キャプチャを破る

インターネットを歩いて、私はルネの非常に訪問された古代のサイトに行きました。 このサイトからファイルをダウンロードするには、このキャプチャを推測する必要があります。
画像
もう一度、数字付きの写真を見て-決定しました。 頭をかき分け、長い間キャプチャを破りました:)

タスクを自分で設定します 。表示されたキャプチャを解読し、貴重な数字を吐き出すスクリプトを作成します。

サイト名については特に言及していません-あなたは推測するでしょう:)

さあ、行こう!



写真を分析します


まず、類似点/相違点、いくつかのパターンを特定するために、できるだけ多くのキャプチャを調べる必要があります。 これらの目的のために、約50個のキャプチャをダウンロードしました。 その中で、最大の差異を含む主なものを選択できます。

画像画像画像画像画像

数学を勉強することに多くの時間を費やしたことがあるので、一般的に、数字をじっと見たいです。

私たちは考慮し、理解します:

私たちは解決策を探しています


30分以内にオプションが頭の中でスクロールします。1つはっきりしていることがあります。画像を切り抜くことが望ましいことです。フォントは同じで、まったく変化しないため、「 prints 」を使用できます 。 この用語までに、データベースのどこかに既にある数字を理解し、それらを写真と比較する必要があります。

私はこの決定に来ました:

実装


  1. 印刷する
    合計で、6 * 10 = 60個が取得され、配列に配置されます。 フォントごとに、captchaの数字で指紋を作成しました。 これは単なる行の配列であり、各行の文字「 x 」は数字のピクセルを示します。

    たとえば、最初のフォントの番号2は次のとおりです。
    画像
  2. 写真を開く
    これは、単にimagecreatefromgif($filename);imagecreatefromgif($filename);行われimagecreatefromgif($filename);

  3. グラデーションの方向を決定する
    グラデーションがどの方向を向いているかを判断する必要があります。これは次の段落で必要になります。
    これは簡単です。最初のピクセルの色を決定するだけです(0、0)
    $color = imagecolorat($image, 0, 0) < 0x20 ? 'black' : 'white' ;

  4. 角度勾配をきれいにします
    ここでは、角度勾配線をきれいにする必要があります。キャプチャを切断する前にこれを行うことをお勧めします。
    ここでは、右側からクリーンアップするために、グラデーションの方向を知る必要があります。
    分析により、ピクセル(1、1)から(2、2)への色差などがわかります。 #202020より大きくすることはできません。
    スクラブ -これは、黒で塗りつぶすことを意味します。 私たちが持っているすべての数字は、色#606060より低くありません。

    次の図が表示されます。
    画像
    添付ファイルのphpコードを表示できます(以下のリンクを参照)

  5. カットキャプチャ
    この段階で、左右に12pxを切り取ります。
    なぜなら 図の高さは14ピクセル以下です。キャプチャ全体の高さに応じて、上部と下部から余分な部分を切り取ります。

    取得するもの:
    画像
  6. グラデーションをきれいにする
    すべての面で、まだグラデーションの余分なストライプがあります。 また、清掃する必要があります。
    最初に上から下へ、次に左から右へ、ストリップの色を取得し、それがソリッド(長さ> 10px)で同じ色の場合、グラデーションストリップであると想定し、クリーニングします。

    合計:
    画像
    ただし、場合によっては(〜5%)、そのようなノイズが残る場合があります。
    画像画像
    確かに、彼らはまだ私たちを悩ませません:) それらの色は数字の色と一致しなくなりました。

  7. プリントで確認する
    すべてのピクセルを左から右へ上から下にすべて調べます。その色は数字の色と一致し、すべてのプリントと順番に比較します。

結果


画像

テスト中


テストのために、このようなキャプチャを200個ダウンロードしました。自宅のPCでスクリプトがそれらを19秒で分解しました。
これは1秒あたり10キャプチャです。

これらの200のうち、単一のエラーは検出されず、スクリプトは正常に機能しました:)

まとめ


キャプチャを解析するクラスCapCrackを作成しました。

アルゴリズムをより詳細に理解したい場合、またはPCでテストしたい場合は、 cap_crack.zipのコードをご覧ください。

私はこの成功に止まらず、自動モードでサイトからファイルをダウンロードするためのスクリプトを書くことにしましたが、これはまったく別の話です:)別の記事に値する...

PS これはHabréに関する私の最初の投稿なので、厳密に判断しないでください:)

Source: https://habr.com/ru/post/J63854/


All Articles