キャプチャを破る

インターネットを歩いて、私はルネの非常に訪問された古代のサイトに行きました。 このサイトからファイルをダウンロードするには、このキャプチャを推測する必要があります。

画像

もう一度、数字付きの写真を見て-決定しました。 頭をかき分け、長い間キャプチャを破りました:)



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



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



さあ、行こう!







写真を分析します



まず、類似点/相違点、いくつかのパターンを特定するために、できるだけ多くのキャプチャを調べる必要があります。 これらの目的のために、約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éに関する私の最初の投稿なので、厳密に判断しないでください:)



All Articles