。1つの #!は/ usr / binに/ envをPythonの 2 #- * -コーディング:UTF-8 - * - 。3 。4 インポートランダム 。5 から PIL インポート画像、ImageDraw、ImageFont、のImageFilter 。6 。7 _letter_cases = " abcdefghjkmnpqrstuvwxy " #を削除小文字可能な干渉I、L、O、Z 8 _upper_cases _letter_cases.upper =() #大文字 。9 _numbers = '' .join(MAP(STR、範囲(3、10))) #の数 10 init_chars = '' .join ((_letter_cases、_upper_cases、_numbers)) 11 12 13 デフ create_validate_code(サイズ=(120、30 )、 14 文字= init_chars、 15 img_type = " GIF " 、 16 モード= " RGB " 、 17 BG_COLOR =(255、255、255 )、 18 fg_color =(0,0 、255 )、 19 FONT_SIZE = 18 、 20 font_type = " Monaco.ttf " 、 21 4 =長さ、 22は draw_lines = 、真 23は n_line =(1、2 ) 24 draw_points = 真、 25 point_chance = 2 ): 26は "" " 27 に確認コード画像生成:@todo 28 @paramサイズ:画像のサイズ、フォーマット(幅、高さ)、デフォルトでは(120、30)である 29 許可される文字の集合、フォーマット文字列:@paramの文字 30 @paramのimg_type:画像の保存形式、GIFのための任意のGIF、JPEG、TIFFのデフォルト、PNG 31は @paramモード:RGBの画像モード既定 32 @param BG_COLOR:背景色は、デフォルトは白 33 @paramのfg_color:前景の色、文字の色コード、デフォルトブルー0000FF# 34は @paramのFONT_SIZE:フォントサイズコード 35 @paramのfont_type:フォントコード、デフォルトae_AlArabiya.ttf 36 @param長さ:1つの文字コード数 37 [ @param draw_lines:干渉ドローラインかどうか 38である 真draw_linesにのみ有効条干渉回線番号の範囲、タプル形式、デフォルト(1、2)、:@param n_lines 39 干渉ビデオのポイントかどうか:@paramのdraw_points 40 @paramのpoint_chance:干渉点の発生確率、範囲のサイズ[0、100] 41である @return:[0]:PIL画像例 42は、 @return:[1]:検証コード画像列 43は " "" 44は 45 幅、=高さサイズ #の幅と高さ 46 #グラフィック作成する 47 = IMG Image.new(MODE、サイズ、BG_COLOR) 48 描画= ImageDraw.Draw(IMG) #ブラシの作成 49 50 DEF GET_CHARS(): 51は "" " 与えられた長さのために生成された文字列は、リスト形式を返す""" 52 戻りrandom.sample(文字、長さ) 53は、 54である DEF create_lines(): 55 "" " ライン干渉を描く" "" 56れる LINE_NUM random.randint =(* n_line) #1 回線の干渉番号 57は 58 のための I にレンジ(LINE_NUM): 59 #開始点 60 =(random.randint(0、サイズ[0])、random.randint(0、サイズを[1始める])) 61である #エンドポイント 62で 終了=(random.randint(0、サイズ[0])、random.randint (0、サイズ[1 ])) 63である draw.line([開始、終了]、塗りつぶし= (0、0、0)) 64 65 DEFのcreate_points(): 66 "" " 描画干渉点" "" 67 チャンス=分(100、MAX(0、INT(point_chance))) #のサイズ制限[0、100] 68 69 のために W でレンジ(幅): 70 のための H における範囲(高さ): 71のIS random.randint = TMP(0、100 ) 72 IF TMP> 100 - チャンス: 73である draw.point((W、H)、フィル= (0、0、0)) 74 75 DEFのcreate_strs(): 76 "" " 文字コードレンダリング"" " 77 c_chars = GET_CHARS() 78件 のSTRを= ' %S '%' ' .join(c_chars) #各文字がスペースで区切られた後 79 80 フォント= ImageFont.truetype(font_type、FONT_SIZE) 81 font_width、font_height =font.getsize(STRS) 82 83 draw.text(((幅- font_width)/ 3、(高- font_height)/ 3 )、 84 STRS、フォント=フォント、フィル= fg_color) 85 86 リターン '' .join(c_chars ) 87 88 ならdraw_lines: 89 create_lines() 90 ならdraw_points: 91 create_points() 92 STRS = create_strs() 93 94 #图形扭曲参数 95件 のparams = [1 -フロート(random.randint(1、2))/ 100 、 96 0、 97 0、 98 0、 99 1 -フロート(random.randint(1、10)。)/ 100 、 100 フロート(random.randint(1、2)。)/ 500 、 101 0.001から、 102 フロート(random.randint( 。1、2))/ 500 103 ] 104 IMG = img.transform(サイズ、Image.PERSPECTIVE、paramsは) #は、歪みを作成する 105 106 IMG = img.filter(ImageFilter.EDGE_ENHANCE_MORE) #1 )境界(より高い閾値を強化、フィルタ 107 108 リターン IMG、STRを
どのように使用するには:
1 #生成验证码图片 2 DEF get_check_code(リクエスト): 3 = F BytesIO() 4 IMG、コード= check_code.create_validate_code() 5 ますrequest.session [ " check_code " = コード 6 img.save(F、" PNG " ) 7 リターンのHttpResponse(f.getvalue())
フロントエンドの認証コードをクリックしてイベントを交換するには画像をクリックしてください:
1つの 関数reload_check_code(TH){ 2 th.src = th.src + " ?" 。 3 }