图形验证码可以防止:恶意破解密码、刷票、论坛灌水,有bai效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试
虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。
验证码通常使用一些线条和一些不规则的字符组成,主要作用是为了防止一些黑客把密码数据化盗取。
PIL(Python Imaging Library)是一个图像处理的函数标准库。
这个库提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。
核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。为通用图像处理工具提供了坚实的基础。
pillow主要包含如下几个功能:
PIL 设计用于图像归档和图像批量处理,你可以使用它建立缩略图,转换格式,打印图片等等。
现在的版本可以验证和读取大量的图片格式。写入有意设计为只能写入常用的文件格式。
现在的版本包含了 Tk PhotoImage 和 BitmapImage 接口, 以及 Windows DIB interface ,这有助于在 Windows 下使用。
为了方便测试,还提供了 show() 方法,可以保存图像到磁盘并显示。
这个库包含了基本的图像处理功能,包括点操作,使用内置卷积内核过滤,色彩空间转换。
这个库还支持更改图像大小、旋转、自由变换。
有一个直方图方法允许你统计图像,这可以用于对比度增强和全局统计分析。
中文地址:https://pillow-docs-cn.readthedocs.io/zh_CN/latest/handbook/
官方地址:http://pillow.readthedocs.io/en/latest/
pip install pillow
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
# 生成验证码函数
def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
code = []
img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
def rndChar():
"""
生成随机字母
:return:
"""
return chr(random.randint(65, 90))
def rndColor():
"""
生成随机颜色
:return:
"""
return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
# 写文字
font = ImageFont.truetype(font_file, font_size)
for i in range(char_length):
char = rndChar()
code.append(char)
h = random.randint(0, 4)
draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
# 写干扰点
point_chance = random.randint(0, 200)
chance = min(200, max(0, point_chance)) # 大小限制在[0, 100]
for w in range(0, width, 10):
for h in range(0, height, 10):
tmp = random.randint(0, 50)
if tmp > 200 - chance:
draw.point((w, h), fill=(0, 0, 0))
# 写干扰圆圈
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
# 画干扰线
line_num = random.randint(0, 3) # 干扰线条数
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=rndColor())
# 添加模糊效果
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img,''.join(code)
if __name__ == '__main__':
# 写入文件
img,code = check_code()
with open('code.png','wb') as f:
img.save(f,format='png')
ps:生成验证码图片需要添加字体样式,一般为ttf格式的文件
此处提供部分字体文件,可自行下载
链接:https://pan.baidu.com/s/1YSuzXAmy_3oBrdP3XlEOfw
提取码:zt9p