1. ホーム
  2. スクリプト・コラム
  3. パイソン

ピローによる動的キャプチャ認識のためのPythonサンプルコード

2022-01-02 14:49:01

私たちの生活の中で、マイクロブログやメールにログインする際に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の枕のコードの内容は、スクリプト家の前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは、将来的に多くのスクリプト家をサポートして願っています!.