验证码的功能一般是防止使用程序恶意注册、暴力破解或批量发帖而设置的。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。本文就将介绍如何用Python语言生成验证码。
生成验证码要对图片进行操作,在Python中对图片操作就要用到PIL库。下面先简单介绍一下在Linux下如何安装PIL库。
1.下载安装包: URL:http://www.pythonware.com/products/pil/index.htm,要下载支持全平台的。
2.解压缩: tar –zxv –f Imaging-1.1.7.tar.gz
3.进入到解压后的目录: cd Imaging-1.1.7
4.Bulid pakage:python setup.py build_ext –i
5.测试:python selftest.py
6.安装:python setup.py install
执行完上述操作后,就可以在程序里通过from IPL import Image就可以使用Image类了。
生成的验证码图片如下图:
生成验证码要对图片进行操作,在Python中对图片操作就要用到PIL库。下面先简单介绍一下在Linux下如何安装PIL库。
1.下载安装包: URL:http://www.pythonware.com/products/pil/index.htm,要下载支持全平台的。
2.解压缩: tar –zxv –f Imaging-1.1.7.tar.gz
3.进入到解压后的目录: cd Imaging-1.1.7
4.Bulid pakage:python setup.py build_ext –i
5.测试:python selftest.py
6.安装:python setup.py install
执行完上述操作后,就可以在程序里通过from IPL import Image就可以使用Image类了。
生成验证码图片的代码如下:
#coding=utf-8
import random
import string
import sys
import math
from PIL import Image,ImageDraw,ImageFont,ImageFilter
#字体的位置,不同版本的系统会有不同
font_path = "/usr/share/X11/fonts/Type1/c0611bt_.pfb"
#生成几位数的验证码
number = 4
#生成验证码图片的高度和宽度
size = (100,30)
#背景颜色,默认为白色
bgcolor = (255,255,255)
#字体颜色,默认为蓝色
fontcolor = (0,0,255)
#干扰线颜色。默认为红色
linecolor = (255,0,0)
#是否要加入干扰线
draw_line = True
#加入干扰线条数的上下限
line_number = (1,5)
#用来随机生成一个字符串
def gene_text():
source = list(string.letters)
for index in range(0,10):
source.append(str(index))
nums = random.sample(source,number)
text = ''.join(nums)
return text
#用来绘制干扰线
def gene_line(draw,width,height):
line_num = random.randint(line_number[0],line_number[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 = linecolor)
#生成验证码
def gene_code():
width,height = size #宽和高
image = Image.new('RGB',(width,height),bgcolor) #创建图片
font = ImageFont.truetype(font_path,30) #验证码的字体
draw = ImageDraw.Draw(image) #创建画笔
text = gene_text() #生成字符串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
font=font,fill=fontcolor) #填充字符串
if draw_line:
gene_line(draw,width,height)
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
]
image = image.transform(size, Image.PERSPECTIVE, params) #创建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强
image.save('4.jpeg') #保存验证码图片
if __name__ == "__main__":
gene_code()
生成的验证码图片如下图: