生成图片验证码是Web开发中常见的安全措施,用于防止自动化机器人恶意注册、登录或防止自动化程序(如爬虫)的恶意攻击。通过要求用户输入图片中的随机字符,可以有效地区分人类用户和机器。Python提供了多种库来生成和处理图像,其中最常用的是Pillow库。

1、安装Pillow库

使用Pillow库之前,如没有安装,需要先安装Pillow库,一个非常强大的图像处理库,是Python Imaging Library (PIL) 的一个分支。

pip install Pillow

2、随机生成6位验证码

Python中,可以使用标准库中的random模块或第三方库如string模块来生成一个6位的随机 验证码。验证码可以是纯数字、纯字母或字母数字混合。

# -*- coding: utf-8 -*-
import random
def generate_verification_code():
    ''' randomly generated a 6 bit verification code '''
    code_list = []
    for i in range(10): # 0-9 number
        code_list.append(str(i))
    for i in range(65, 91): # A-Z
        code_list.append(chr(i))
    for i in range(97, 123): # a-z
        code_list.append(chr(i))
    myslice = random.sample(code_list, 6)  
    verification_code = ''.join(myslice) # list to string
    # print code_list
    # print type(myslice)
    return verification_code
if __name__ == '__main__':
    code = generate_verification_code()
    print code

参考文档:Python 随机生成6位验证码

3、生成验证码图片

通过上面代码生成验证码的内容,需要在使用Pillow库生成图片,并且将验证码的内容绘制在图片中。

from PIL import Image, ImageDraw, ImageFont
import random

# 生成随机6位验证码
def generate_verification_code():
    ''' randomly generated a 6 bit verification code '''
    code_list = []
    for i in range(10): # 0-9 number
        code_list.append(str(i))
    for i in range(65, 91): # A-Z
        code_list.append(chr(i))
    for i in range(97, 123): # a-z
        code_list.append(chr(i))
    myslice = random.sample(code_list, 6)  
    verification_code = ''.join(myslice) # list to string
    # print code_list
    # print type(myslice)
    return verification_code
# 创建验证码图片
def create_verification_image(code):
    # 图片尺寸和背景色
    width, height = 200, 100
    background_color = (255, 255, 255)  # 白色

    # 创建图片对象
    image = Image.new('RGB', (width, height), background_color)
    draw = ImageDraw.Draw(image)

    # 设置字体和字号
    font = ImageFont.load_default()#ImageFont.truetype("arial.ttf", size=50)

    # 计算文本位置使其居中
    text_width, text_height = draw.textsize(code, font=font)
    text_x = (width - text_width) / 2
    text_y = (height - text_height) / 2

    # 在图片上绘制验证码
    draw.text((text_x, text_y), code, fill=(0, 0, 0), font=font)

    # 保存图片为文件或显示图片
    image.save("verification_code.png")
    image.show()

# 生成验证码并创建图片
code = generate_verification_code()
create_verification_image(code)

4、增强安全性

为了进一步增强验证码的安全性,在图像中添加随机噪点,使图像更难被自动化程序识别。对文本进行轻微的扭曲或旋转,增加识别难度。使用多种颜色绘制文本和背景,使验证码更加复杂。

from PIL import Image, ImageDraw, ImageFont
import random


def add_noise(draw, width, height): 
    for _ in range(100): 
        x = random.randint(0,  width) 
        y = random.randint(0,  height) 
        draw.point((x,  y), fill=(0, 0, 0)) 

def create_verification_image(code):
    # 图片尺寸和背景色
    width, height = 200, 100
    background_color = (255, 255, 255)  # 白色
    
    # 创建图片对象
    image = Image.new('RGB', (width, height), background_color)
    draw = ImageDraw.Draw(image)
    
    # 在生成验证码函数中调用add_noise 
    add_noise(draw, width, height) 
    # 设置字体和字号
    font = ImageFont.load_default()#ImageFont.truetype("arial.ttf", size=50)

    # 计算文本位置使其居中
    text_width, text_height = draw.textsize(code, font=font)
    text_x = (width - text_width) / 2
    text_y = (height - text_height) / 2

    # 在图片上绘制验证码
    draw.text((text_x, text_y), code, fill=(0, 0, 0), font=font)

    # 保存图片为文件或显示图片
    image.save("verification_code.png")
    image.show()

推荐文档