下面是一个用python PIL 生成验证码的函数。
过程是:创建一张有底色的图片、在背景上添加杂色、写上特定文字、保存图片
# -*- coding: utf-8 -*-
import random
import Image
import ImageFont
import ImageDraw
import ImageFilter
def gen_captcha(text, fnt, fnt_sz, file_name, fmt='JPEG'):
# 随机生成背景色
fgcolor = random.randint(0,0xffff00)
bgcolor = fgcolor ^ 0xffffff
# 生成文字
font = ImageFont.truetype(fnt,fnt_sz)
dim = font.getsize(text)
im = Image.new('RGB', (dim[0]+5,dim[1]+5), bgcolor)
d = ImageDraw.Draw(im)
x, y = im.size
r = random.randint
# 给背景添加杂色
for num in range(100):
d.rectangle((r(0,x), r(0,y), r(0,x), r(0,y)), fill=r(0, 0xffffff))
# 添加文字
d.text((3,3), text, font=font, fill=fgcolor)
im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
im.save(file_name, format=fmt)
def gen_random_word(wordLen=6):
allowedChars = "abcdefghijklmnopqrstuvwzyzABCDEFGHIJKLMNOPQRSTUVWZYZ0123456789"
word = ""
for i in range(0, wordLen):
word = word + allowedChars[random.randint(0,0xffffff) % len(allowedChars)]
return word
if __name__ == '__main__':
word = gen_random_word()
print word
gen_captcha(word.strip(), 'porkys.ttf', 65, "test.jpg")
进阶使用
一般情况不会要求填写验证码,避免影响用户体验。在特定情况下,如当用户登录密码出错N 次后,当用户频繁发贴时。
可对验证码作更复杂的变换,当用户输入验证码出错次数为N 时,增加其难度,如增加字符集、变化字体等。