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.