ピローによる動的キャプチャ認識のためのPythonサンプルコード
私たちの生活の中で、マイクロブログやメールにログインする際にCAPTCHAに遭遇することはよくあることです。仕事でも、何かデータをクロールしようと思えば、CAPTCHAという障害に遭遇する。この実験では、CAPTCHAの特徴を説明し、PythonのPillowライブラリを使ってCAPTCHAを解読していきます。
環境設定
- Python 2.7
- Pillowモジュール
問題点としては、python2.7は現在2020年までしか使えません。2.7を使っていろいろダウンロードするとエラーが出るので、まだ2.7の環境に依存するpython3.7に更新する時期です。
CAPTCHAを認識するためのコードは、以下からダウンロードできます。 python_captcha_jb51.rar
ピロー(PIL)ライブラリのインストール
/*
ci_string s( "AbCdE" );
// case insensitive
//
assert( s == "abcde" );
assert( s == "ABCDE" );
// natürlich unter Beibehaltung der Groß-/Kleinschreibung
//
assert( strcmp( s.c_str(), "AbCdE" ) == 0 );
assert( strcmp( s.c_str(), "abcde" ) != 0 );
// die char_traits definieren, wie Zeichen interagieren - und vergleichen!
// die char_traits eq(), lt(), compare(), find().
*/
#include <iostream>
#include <string>
using namespace std;;
// alle anderen Funktionen, die wir nicht ersetzen müssen, einfach erben
struct ci_char_traits : public char_traits<char>
{
static bool eq(char c1, char c2)
{ return toupper(c1) == toupper(c2); }
static bool lt(char c1, char c2)
{ return toupper(c1) < toupper(c2); }
static int compare(const char* s1, const char* s2, size_t n)
{ return memicmp( s1, s2, n ); }
// falls auf Ihrer Plattform verfügbar, andernfalls können Sie Ihre eigene Methode entwickeln
static const char* find(const char* s, int n, char a)
{
while(n-- > 0 && toupper(*s) != toupper(a))
{
++s;
}
return n >= 0 ? s : 0;
}
};
// char_traits steuern die Zeichen eines Strings
typedef basic_string<char, ci_char_traits> ci_string;
int main()
{
ci_string a("aaa");
cout << a.c_str() << endl;
// typedef basic_ostream<char, char_traits<char> > ostream;
// string b;
// string c = a + b;
//
// cout << b;
}
プロセスの特定
キャプチャファイルpython_captchaをrunディレクトリにダウンロードして解凍し、python_captchaディレクトリに新しいcrack.pyファイルを作成し、編集します。
#-*- coding:utf8 -*-
from PIL import Image
im = Image.open("captcha.gif")
# (converts the image to 8-bit pixel mode)
im.convert("P")
# Print the color histogram
print im.histogram()
出力します。
カラーヒストグラムの各桁は、画像中の対応する色のビットを含む画素の数を表します。
各画素点は256色を表現することができ、白い点が最も多いことがわかります(最後のビットである白の序数255が確認でき、白い画素は625個あります)。赤の画素は序数200あたりで、これを選別することで有用な色を得ることができます。
his = im.histogram()
values = {}
for i in range(256):
values[i] = his[i]
for j,k in sorted(values.items(),key=lambda x:x[1],reverse = True)[:10]:
print j, k
出力します。
画像の中で最も多い10色を取得し、そのうち220と227が必要な赤と灰色であり、このメッセージを使って白黒2値画像を構成することができるのです。
#-*- coding:utf8 -*-
from PIL import Image
im = Image.open("captcha.gif")
im.convert("P")
im2 = Image.new("P",im.size,255)
for x in range(im.size[1]):
for y in range(im.size[0]):
pix = im.getpixel((y,x))
if pix == 220 or pix == 227: # these are the numbers to get
im2.putpixel((y,x),0)
im2.show()
出力します。
制限と問題点
#-*- coding:utf8 -*-
コマンドストリームのこの行は、Windows環境で実行すると、次の理由でエラーが報告されます。 python (2) 中国語のエンコーディングが文字化けする問題 は
このコマンドストリームには大きな制限があり、認識される動的サロゲートビはこのタイプのみです。
これは、動的CAPTCHAを識別するためのpythonの枕のコードの例に関するこの記事の終わりです、より関連するpythonの枕のコードの内容は、スクリプト家の前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは、将来的に多くのスクリプト家をサポートして願っています!.
関連
-
[解決済み] TypeError: 引数に複数の値が指定されました。
-
[解決済み] plt.close()とplt.clf()の相違点
-
[解決済み] ImportError: scapy.allという名前のモジュールはありません。
-
[解決済み] spyder python 変数エクスプローラを再度開く方法
-
[解決済み] icon_clock.gif と icon_calender.gif のための django 静的管理画面 404
-
[解決済み] matplotlibのpyplotの凡例で線の幅を変更する [重複] [重複
-
LinearAlgebraError: SVDが収束しなかった(PYTHON)
-
TypeError: 非反復可能な float オブジェクトをアンパックできない (20191105)
-
[Python] numpy library array splicing np.concatenate 公式ドキュメントの詳細と例です。
-
AttributeError: モジュール 'wordcloud' には属性 'WordCloud' がありません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
[解決済み】エラトステネスのふるい - 素数を求める Python
-
行列の平均と標準偏差を詳細に計算するPython Numpyの実装
-
PythonでExcelとWordを自動化し、オフィスの自動化を実現
-
Pythonを使用して、Desertプラグインを正常に呼び出すためのゲームランタイムスクリプトを開発する。
-
[解決済み] matplotlib: RuntimeError: Python はフレームワークとしてインストールされていません
-
[解決済み] python辞書エラー AttributeError: 'list' オブジェクトには 'keys' という属性がありません。
-
[解決済み] ImportError: virtualenv という名前のモジュールがありません。
-
[解決済み] forまたはwhileループでn回何かを行う
-
[解決済み] NLTK python エラー。"TypeError: 'dict_keys' object is not subscriptable" です。