情報から人々を保護するサイトの単一のレジストリのキャプチャを「デジタル化」します

ごく最近、 統一された州の登録サイトのポータル開かれました。 他のすべてとは別に、私は非常に弱いキャプチャが好きで、それを克服することにしました。



私はすでにそのようなことを扱っていますが、そのような規模ではありません。 GNU / BashimagemagickおよびTesseract -ocrのみを使用して57%の認識効率を得る方法に興味がある場合は、catへようこそ。



以下の手順は、他の同様の弱いキャプチャ用に簡単に変更できます。



エントリー



キャプチャ画像自体の認識は、正確に2つの段階に分けることができます。





画像を取得して結果を送信するには、curl(またはwgetを使用しますが、私はそれと友達を作りませんでした)を使用して簡単に実行できます。



画像の準備



ImageMagickには、特殊効果を作成するためのFx言語が組み込まれています。 レジストリcaptchaの文字は常に黒であるため、黒ではないものをすべて削除するスクリプトの最も単純なバージョンは次のようになります。



convert file.png -colorspace cmyk -fx 'k * (k >= 1.0)' file.ppm
      
      







実行には10分の1秒かかりますが、これは許容範囲です。 ただし、画質はそうではないため、もう一度確認する必要があります。 文字が線で触れられた場合、この場所では、2つの反対側からピクセルシェーディングされた隣人が一度に存在するはずであるという事実に頼ることができます。



 convert file.ppm -colorspace cmyk -fx 'k || (p[-1].k && p[+1].k) || (p[0,-1].k && p[0,+1].k)' out.ppm
      
      







さらに半秒間犠牲にするものは何ですか。 後で判明するように、これにより成功率が1%から22%に増加します(100枚のコントロール画像で)。



文字認識



まだ簡単です。 写真にテセラクトを毒し、ファイルから結果を取得します。 必要に応じて、captchaフォントを別の言語として教えることもできますが、ゲームはろうそくに値しません。



  tesseract out.ppm result -psm 8 nobatch digits 2>/dev/null res=$(cat result.txt | sed -e 's/[^0-9]//g')
      
      





フィールドテスト



上で言ったように、この組み合わせは100枚のテスト画像のうち22枚に正しい答えを与えました。 しかし、テストは面白くなく、実際の条件で作業の速度をチェックすることにしました。



メインスクリプト
 #!/bin/bash c=$(curl -c cook.txt http://zapret-info.gov.ru/ | iconv -f cp1251 | grep capcha | sed -e 's/"/\n/g' | grep services) url="http://zapret-info.gov.ru$c" r=work01 #get curl -b cook.txt "$url" > "$r.png" #prepare convert $r.png -colorspace cmyk -fx 'k * (k >= 1.0)' $r.png convert $r.png -colorspace cmyk -fx 'k || (p[-1].k && p[+1].k) || (p[0,-1].k && p[0,+1].k)' $r.png #exterminate tesseract $r.png $r -psm 8 nobatch digits res=`cat $r.txt | sed -e 's/[^0-9]//g'` #check if [ "$(echo $res | wc -c)" -ne 9 ]; then echo fail && exit fi #send code=$(echo $c | sed -e 's/[^0-9]//g') fin=`curl -b cook.txt -d "act=search&secretcodeId=$code&searchstring=ya.ru&secretcodestatus=$res" 'http://zapret-info.gov.ru/'| iconv -f cp1251` if echo "$fin" | grep -q ' '; then echo succ else echo tesfail fi rm $r.png $r.txt cook.txt
      
      



ラッパー
 #!/bin/bash score=0 all=0 while [ "$score" -lt 41 ]; do r=`bash per.sh 2>/dev/null` [ "$r" = 'succ' ] && let score++ let all++ echo "$score/$all; $r" done
      
      





発射ライン
 time bash tt.sh | tee -a log.txt
      
      







結果、統計



上記のスクリプトセットは、レジストリにya.ruが存在するかどうかを41回正常にチェックします。 それに関するいくつかの統計:



  : 41  : 218  : 5  4  (5m4.178s) : 19%      ,     : 57%     : 33%     : 12%
      
      







改善する方法




All Articles