web项目中遇到使用验证码的情况有很多,进行介绍下使用PIL 生成验证码的方法。
安装
开始安装PIL的过程确实麻烦各种问题层出不绝,不过不断深入后就没有这方面的困扰了:
windows安装:直接安装Pillow,最好使用编译好的对应版本。
linux系统:直接使用yum或apt-get包管理工具安装python-imaging包即可正常使用
遇到难缠的问题,请资源:http://stackoverflow.com/
使用
首先导入模块
from PIL import Image,ImageDraw, ImageFont
实现如图:此截图是截取自Tornado框架的项目中所以会有cookie代码,下面是代码:
头条对代码的格式化着实让人头疼,请对照上图自行缩进
size=(160, 70)
im = Image.new('RGB',size ,(random.randrange(160,255), random.randrange(160,255),random.randrange(160,255)))
draw = ImageDraw.Draw(im)
#绘制干扰线
line_num = random.randint(*(5, 10)) # 干扰线条数
for i in range(line_num):
# 起始点
begin = (random.randint(0, size[0]), random.randint(0, size[1]))
# 结束点
end = (random.randint(0, size[0]), random.randint(0, size[1]))
draw.line([begin, end], fill=(random.randrange(0,255), random.randrange(0,255),random.randrange(0,255)))
#绘制干扰点
point_chance = 2
chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
for w in xrange(size[0]):
for h in xrange(size[1]):
tmp = random.randint(0, 100)
if tmp > 100 - chance:
draw.point((w, h), fill=(random.randrange(0,255), random.randrange(0,255),random.randrange(0,255)))
mp =getMd5(str(datetime.now()))
rand_str = mp[0:4] #验证码内容
index=10
for i in rand_str:
draw.text((index,10), i, font=ImageFont.truetype(SERVER.S_PATH+"/static/font/arial.ttf" , random.randrange(40,50)),
fill=(random.randrange(0,200), random.randrange(0,200),random.randrange(0,200)))
index=index+size[0]/4
del draw
self.set_cookie("checkcode",str(rand_str))
buf = cStringIO.StringIO()
im.save(buf, 'gif')
网站验证流程是:
提交验证码申请→生成验证码→将验证码存在cookie→验证图片发送到页面中→用户输入后→后台校验验证码→完成验证
成功通过,不成功返回错误,重新提交验证码申请。
此文章由Python实践派原创,转载请注明。
欢迎订阅我的头条号,关注最实践的Python开发内容。