もう一度、数字付きの写真を見て-決定しました。 頭をかき分け、長い間キャプチャを破りました:)
タスクを自分で設定します 。表示されたキャプチャを解読し、貴重な数字を吐き出すスクリプトを作成します。
サイト名については特に言及していません-あなたは推測するでしょう:)
さあ、行こう!
写真を分析します
まず、類似点/相違点、いくつかのパターンを特定するために、できるだけ多くのキャプチャを調べる必要があります。 これらの目的のために、約50個のキャプチャをダウンロードしました。 その中で、最大の差異を含む主なものを選択できます。
数学を勉強することに多くの時間を費やしたことがあるので、一般的に、数字をじっと見たいです。
私たちは考慮し、理解します:
- 画像はgif形式の白黒です
- 画像のサイズは異なる場合がありますが、数値は常に中央に配置されます(ただし、中央に配置されず、垂直に配置されます)
- 勾配が使用され、その方向は2方向に変更できます
- 勾配のほかに、「 角度勾配 」( 私がそれを呼んだように、キックしないでください:) )、45度の角度から来るもの( 再びキックしないでください:) )は、私の理解では、単なる対角線です
- 合計で、6種類のライティングフォントを特定しました(より正確には3種類、斜体は3種類)
- すべての桁のピクセルは色#606060よりも暗くありませんが、同じ色ではありません
- キャプチャで3〜5桁、14ピクセル以下
私たちは解決策を探しています
30分以内にオプションが頭の中でスクロールします。1つはっきりしていることがあります。画像を切り抜くことが望ましいことです。フォントは同じで、まったく変化しないため、「 prints 」を使用できます 。 この用語までに、データベースのどこかに既にある数字を理解し、それらを写真と比較する必要があります。
私はこの決定に来ました:
- プリントで配列を開始します
- すべての側面から画像をトリミングし、余分な部分は捨てる必要があります
- 不要な色を削除-これはグラデーションと角度グラデーションです
- 左から右、上から下にすべてのピクセルを通過し、ピクセルの色が数字の色と一致する場合(> =#606060)、すべてを順番に印刷して確認します
実装
- 印刷する
合計で、6 * 10 = 60個が取得され、配列に配置されます。 フォントごとに、captchaの数字で指紋を作成しました。 これは単なる行の配列であり、各行の文字「 x 」は数字のピクセルを示します。
たとえば、最初のフォントの番号2は次のとおりです。
- 写真を開く
これは、単にimagecreatefromgif($filename);
をimagecreatefromgif($filename);
行われimagecreatefromgif($filename);
- グラデーションの方向を決定する
グラデーションがどの方向を向いているかを判断する必要があります。これは次の段落で必要になります。
これは簡単です。最初のピクセルの色を決定するだけです(0、0)
$color = imagecolorat($image, 0, 0) < 0x20 ? 'black' : 'white' ;
- 角度勾配をきれいにします
ここでは、角度勾配線をきれいにする必要があります。キャプチャを切断する前にこれを行うことをお勧めします。
ここでは、右側からクリーンアップするために、グラデーションの方向を知る必要があります。
分析により、ピクセル(1、1)から(2、2)への色差などがわかります。 #202020より大きくすることはできません。
スクラブ -これは、黒で塗りつぶすことを意味します。 私たちが持っているすべての数字は、色#606060より低くありません。
次の図が表示されます。
添付ファイルのphpコードを表示できます(以下のリンクを参照)
- カットキャプチャ
この段階で、左右に12pxを切り取ります。
なぜなら 図の高さは14ピクセル以下です。キャプチャ全体の高さに応じて、上部と下部から余分な部分を切り取ります。
取得するもの:
- グラデーションをきれいにする
すべての面で、まだグラデーションの余分なストライプがあります。 また、清掃する必要があります。
最初に上から下へ、次に左から右へ、ストリップの色を取得し、それがソリッド(長さ> 10px)で同じ色の場合、グラデーションストリップであると想定し、クリーニングします。
合計:
ただし、場合によっては(〜5%)、そのようなノイズが残る場合があります。
確かに、彼らはまだ私たちを悩ませません:) それらの色は数字の色と一致しなくなりました。
- プリントで確認する
すべてのピクセルを左から右へ上から下にすべて調べます。その色は数字の色と一致し、すべてのプリントと順番に比較します。
結果
テスト中
テストのために、このようなキャプチャを200個ダウンロードしました。自宅のPCでスクリプトがそれらを19秒で分解しました。
これは1秒あたり約10キャプチャです。
これらの200のうち、単一のエラーは検出されず、スクリプトは正常に機能しました:)
まとめ
キャプチャを解析するクラスCapCrackを作成しました。
アルゴリズムをより詳細に理解したい場合、またはPCでテストしたい場合は、 cap_crack.zipのコードをご覧ください。
私はこの成功に止まらず、自動モードでサイトからファイルをダウンロードするためのスクリプトを書くことにしましたが、これはまったく別の話です:)別の記事に値する...
PS これはHabréに関する私の最初の投稿なので、厳密に判断しないでください:)