4行Python代码生成图像验证码(2种)

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模块,生成数字和字母验证码。通过随机生成一些数字或字母,以及一些干扰线和干扰点,最终形成一张带有验证码的图像。

在实际应用中,我们可以根据自己的需求来选择不同的图像验证码生成方式,以提高网站的安全性和防范恶意攻击。

后端开发标签