1. 简介
验证码是用来判断用户是真实人类还是自动程序访问的重要工具,目的是保护网站或者网页不被黑客攻击。本文将介绍如何使用Python中的Pillow和Image模块,生成两种不同的图像验证码。
2. Pillow模块介绍
2.1 Pillow模块的安装
Pillow模块是Python中一个强大的图像库,它扩展了Python Imaging Library(PIL),提供了更强大的图像处理工具。在Python 2中,需要安装PIL库,但是在Python 3中,需要安装Pillow库。
!pip install Pillow
2.2 Pillow模块的使用
在生成图像验证码中,我们需要用Pillow模块中的Image和ImageDraw两个类。其中,Image类用来表示图像对象,ImageDraw类用来处理图像中的绘图操作。
3. 生成数字验证码
3.1 原理介绍
数字验证码是一种常见的图像验证码,它由一串数字组成,通常用于网站的注册、登录等功能。生成数字验证码的原理很简单,就是在一张图片上随机生成一些数字,再加上一些干扰线和干扰点,最终形成一张带有数字的图像。
3.2 代码实现
下面是代码实现:
import random
from PIL import Image, ImageDraw, ImageFont
def generate_random_code(number):
"""
随机生成number位数字验证码,返回验证码和图像
"""
# 定义图像大小,背景颜色
size = (120, 50)
bgcolor = (255, 255, 255)
# 定义画笔
draw = ImageDraw.Draw(Image.new(mode='RGB', size=size, color=bgcolor))
# 定义字体
font = ImageFont.truetype('arial.ttf', size=40)
# 定义可选字符集,去掉容易混淆的0、1、i、o
digits = '23456789abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
code = ''
# 随机生成number位数字验证码
for i in range(number):
char = random.choice(digits)
code += char
# 将验证码绘制在图像上
draw.text((10+i*20, 10), char, font=font, fill=(0, 0, 0))
# 绘制干扰线
for i in range(random.randint(1, 2*number)):
x1, y1 = random.randint(0, size[0]), random.randint(0, size[1])
x2, y2 = random.randint(0, size[0]), random.randint(0, size[1])
draw.line((x1, y1, x2, y2), fill=(0, 0, 0), width=2)
# 绘制干扰点
for i in range(random.randint(1, 2*number)):
x, y = random.randint(10, size[0]-10), random.randint(10, size[1]-10)
draw.point((x, y), fill=(0, 0, 0))
image = Image.new(mode='RGB', size=size, color=bgcolor)
image.paste(Image.new(mode='RGB', size=size, color=bgcolor), mask=draw)
return code, image
if __name__ == '__main__':
code, image = generate_random_code(4)
image.show()
3.3 代码解释
在上面的代码中:
首先定义了图像的大小和背景颜色。
然后定义了画笔和字体,用来绘制验证码。
接着定义了可选字符集,这里去掉了一些容易混淆的字符。
随机生成number位数字验证码,将验证码绘制在图像上。
最后在图像上绘制干扰线和干扰点。
3.4 演示效果
下面展示生成的数字验证码的演示效果:
4. 生成字母验证码
4.1 原理介绍
字母验证码是一种常见的图像验证码,它由一些字母组成,通常用于网站的注册、登录等功能。生成字母验证码的原理和数字验证码类似,只不过可选字符集从数字扩展到了字母。
4.2 代码实现
下面是代码实现:
import random
from PIL import Image, ImageDraw, ImageFont
def generate_random_code(number):
"""
随机生成number位字母验证码,返回验证码和图像
"""
# 定义图像大小,背景颜色
size = (120, 50)
bgcolor = (255, 255, 255)
# 定义画笔
draw = ImageDraw.Draw(Image.new(mode='RGB', size=size, color=bgcolor))
# 定义字体
font = ImageFont.truetype('arial.ttf', size=40)
# 定义可选字符集,去掉容易混淆的0、1、i、o
letters = 'abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
code = ''
# 随机生成number位字母验证码
for i in range(number):
char = random.choice(letters)
code += char
# 将验证码绘制在图像上
draw.text((10+i*20, 10), char, font=font, fill=(0, 0, 0))
# 绘制干扰线
for i in range(random.randint(1, 2*number)):
x1, y1 = random.randint(0, size[0]), random.randint(0, size[1])
x2, y2 = random.randint(0, size[0]), random.randint(0, size[1])
draw.line((x1, y1, x2, y2), fill=(0, 0, 0), width=2)
# 绘制干扰点
for i in range(random.randint(1, 2*number)):
x, y = random.randint(10, size[0]-10), random.randint(10, size[1]-10)
draw.point((x, y), fill=(0, 0, 0))
image = Image.new(mode='RGB', size=size, color=bgcolor)
image.paste(Image.new(mode='RGB', size=size, color=bgcolor), mask=draw)
return code, image
if __name__ == '__main__':
code, image = generate_random_code(4)
image.show()
4.3 代码解释
在上面的代码中,与生成数字验证码的代码基本相同,只不过要更换可选字符集:
# 定义可选字符集,去掉容易混淆的0、1、i、o
letters = 'abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
4.4 演示效果
下面展示生成的字母验证码的演示效果:
5. 小结
本文介绍了如何使用Python中的Pillow和Image模块,生成数字和字母验证码。通过随机生成一些数字或字母,以及一些干扰线和干扰点,最终形成一张带有验证码的图像。
在实际应用中,我们可以根据自己的需求来选择不同的图像验证码生成方式,以提高网站的安全性和防范恶意攻击。