编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

如何使用PIL生成验证码?(pilipili验证码)

wxchong 2024-09-28 02:16:44 开源技术 40 ℃ 0 评论

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开发内容。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表