Python編寫產生驗證碼的指令碼的教程

來源:互聯網
上載者:User
在web開發中經常用到驗證碼,為了防止機器人註冊或者惡意登陸和查詢等,作用不容小覷

但是驗證碼其實不是一個函數就能搞定的,它需要產生圖片和浮水印,其實每種語言都有相關的函數產生圖片和文字浮水印。包括我熟悉的php,呵呵,今天主要來分享如何用python產生驗證碼。

python產生驗證碼主要用到如下模組:Image, ImageDraw, ImageFont, ImageFilter和隨機數產生模組Random。

代碼如下:

#!/usr/bin/env python#coding=utf-8import randomimport Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小寫字母,去除可能干擾的i,l,o,z_upper_cases = _letter_cases.upper() # 大寫字母_numbers = ''.join(map(str, range(3, 10))) # 數字init_chars = ''.join((_letter_cases, _upper_cases, _numbers))fontType="/usr/share/fonts/truetype/freefont/FreeSans.ttf" def create_validate_code(size=(120, 30),               chars=init_chars,               img_type="GIF",               mode="RGB",               bg_color=(255, 255, 255),               fg_color=(0, 0, 255),               font_size=18,               font_type=fontType,               length=4,               draw_lines=True,               n_line=(1, 2),               draw_points=True,               point_chance = 2): ''' @todo: 產生驗證碼圖片 @param size: 圖片的大小,格式(寬,高),預設為(120, 30) @param chars: 允許的字元集合,格式字串 @param img_type: 圖片儲存的格式,預設為GIF,可選的為GIF,JPEG,TIFF,PNG @param mode: 圖片模式,預設為RGB @param bg_color: 背景顏色,預設為白色 @param fg_color: 前景色彩,驗證碼字元顏色,預設為藍色#0000FF @param font_size: 驗證碼字型大小 @param font_type: 驗證碼字型,預設為 ae_AlArabiya.ttf @param length: 驗證碼字元個數 @param draw_lines: 是否劃幹擾線 @param n_lines: 幹擾線的條數範圍,格式元組,預設為(1, 2),只有draw_lines為True時有效 @param draw_points: 是否畫幹擾點 @param point_chance: 幹擾點出現的機率,大小範圍[0, 100] @return: [0]: PIL Image執行個體 @return: [1]: 驗證碼圖片中的字串 '''  width, height = size # 寬, 高 img = Image.new(mode, size, bg_color) # 建立圖形 draw = ImageDraw.Draw(img) # 建立畫筆 if draw_lines:  create_lines(draw,n_line,width,height) if draw_points:  create_points(draw,point_chance,width,height) strs = create_strs(draw,chars,length,font_type, font_size,width,height,fg_color)  # 圖形扭曲參數 params = [1 - float(random.randint(1, 2)) / 100,      0,      0,      0,      1 - float(random.randint(1, 10)) / 100,      float(random.randint(1, 2)) / 500,      0.001,      float(random.randint(1, 2)) / 500      ] img = img.transform(size, Image.PERSPECTIVE, params) # 建立扭曲  img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 濾鏡,邊界加強(閾值更大)  return img, strs  def create_lines(draw,n_line,width,height): '''繪製幹擾線''' line_num = random.randint(n_line[0],n_line[1]) # 幹擾線條數 for i in range(line_num):  # 起始點  begin = (random.randint(0, width), random.randint(0, height))  #結束點  end = (random.randint(0, width), random.randint(0, height))  draw.line([begin, end], fill=(0, 0, 0)) def create_points(draw,point_chance,width,height): '''繪製幹擾點''' chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]   for w in xrange(width):  for h in xrange(height):   tmp = random.randint(0, 100)   if tmp > 100 - chance:    draw.point((w, h), fill=(0, 0, 0)) def create_strs(draw,chars,length,font_type, font_size,width,height,fg_color): '''繪製驗證碼字元''' '''產生給定長度的字串,返回列表格式''' c_chars = random.sample(chars, length) strs = ' %s ' % ' '.join(c_chars) # 每個字元前後以空格隔開   font = ImageFont.truetype(font_type, font_size) font_width, font_height = font.getsize(strs)  draw.text(((width - font_width) / 3, (height - font_height) / 3),strs, font=font, fill=fg_color)   return ''.join(c_chars)  if __name__ == "__main__":  code_img = create_validate_code()  code_img[0].save("validate.gif", "GIF")  print code_img[1]
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.