python 图片验证码代码分享

  • Post category:Python

下面我将为您详细介绍如何实现Python图片验证码。

简介

验证码是指利用计算机生成一些图形化的文字或数字,让用户识别之后,输入到指定位置,起到人机交互验证的作用。在现今的互联网应用中,验证码常用于注册、登录等场景,可以有效防范机器自动化操作。

在Python中,我们可以使用Pillow库来生成图片验证码。该库可以创建、操作和处理数百种不同的图片格式,我将在下面的攻略中使用该库来生成图片验证码。

步骤

步骤1: 安装Pillow库

Pillow库可以通过pip安装,只需要在命令行中输入以下命令即可:

pip install Pillow

步骤2: 生成验证码

下面是生成图片验证码的代码,可以将该代码保存为一个.py文件:

import random
from PIL import Image, ImageDraw, ImageFont

# 定义验证码大小
width, height = 200, 100

# 创建一个新的图片
image = Image.new('RGB', (width, height), (255, 255, 255))

# 创建ImageDraw对象
draw = ImageDraw.Draw(image)

# 定义验证码字体样式和大小
font = ImageFont.truetype('arial.ttf', 40)

# 定义验证码字符
characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

# 生成随机字符
code = ''.join(random.sample(characters, 4))

# 在验证码图片中写入验证码字符
for i, char in enumerate(code):
    x = width / 5 + (width * 3 / 5) / 4 * i
    y = height / 3
    draw.text((x, y), char, font=font, fill=(0, 0, 255))

# 添加干扰点
for _ in range(100):
    x = random.randint(0, width)
    y = random.randint(0, height)
    draw.point((x, y), fill=(0, 0, 0))

# 保存图片
image.save('code.jpg')

代码中有注释,一些主要的步骤包括:

  1. 创建一个新的白色图片;
  2. 使用ImageDraw对象,绘制验证码的样式和颜色;
  3. 生成随机字符,并在图片中写入这些字符;
  4. 在图片中添加干扰点,增加识别难度;
  5. 图片保存到本地。

步骤3: 测试

保存完代码后运行该代码,将会生成一个名为code.jpg的图片。浏览该图片,您将看到一个带有四个随机字符的图片。

示例一

下面是一个基于Flask框架的示例,实现了一个简单的验证码生成和显示功能。可以尝试在本地运行该代码,查看验证码图片效果。

import random
import io
from PIL import Image, ImageDraw, ImageFont
from flask import Flask, Response, request

app = Flask(__name__)

@app.route('/get_code')
def generate_code():
    # 定义验证码大小
    width, height = 200, 100

    # 创建一个新的图片
    image = Image.new('RGB', (width, height), (255, 255, 255))

    # 创建ImageDraw对象
    draw = ImageDraw.Draw(image)

    # 定义验证码字体样式和大小
    font = ImageFont.truetype('arial.ttf', 40)

    # 定义验证码字符
    characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

    # 生成随机字符
    code = ''.join(random.sample(characters, 4))

    # 在验证码图片中写入验证码字符
    for i, char in enumerate(code):
        x = width / 5 + (width * 3 / 5) / 4 * i
        y = height / 3
        draw.text((x, y), char, font=font, fill=(0, 0, 255))

    # 添加干扰点
    for _ in range(100):
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.point((x, y), fill=(0, 0, 0))

    # 创建io对象,将验证码图片以字节流的形式输出
    io_obj = io.BytesIO()
    image.save(io_obj, 'JPEG')
    io_obj.seek(0)

    # 将验证码图片返回给前端
    return Response(io_obj.getvalue(), mimetype='image/jpeg')

示例二

下面是一个Python脚本示例,该示例实现了生成多张图片验证码,并创建包含了每个验证码的CSV文件。csv文件中每一行代表一个验证码,第一列是验证码字符,第二列是该验证码等级(1、2或3,等级越高,验证码的难度越大)。可以尝试在本地运行该代码,查看生成的验证码图片和CSV文件。

import random
import csv
from PIL import Image, ImageDraw, ImageFont

# 定义生成验证码数量
num_codes = 10

# 定义验证码等级
level = [1, 2, 3]

# 定义验证码大小
width, height = 200, 100

# 创建CSV文件
with open('codes.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['Code', 'Level'])

    # 生成多个验证码,存储在csv文件中
    for i in range(num_codes):
        # 创建一个新的图片
        image = Image.new('RGB', (width, height), (255, 255, 255))

        # 创建ImageDraw对象
        draw = ImageDraw.Draw(image)

        # 定义验证码字体样式和大小
        font = ImageFont.truetype('arial.ttf', random.randint(30, 50))

        # 定义验证码字符
        characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

        # 随机生成验证码字符和等级
        code = ''.join(random.sample(characters, 4))
        lv = random.choice(level)

        # 在验证码图片中写入验证码字符
        for i, char in enumerate(code):
            x = width / 5 + (width * 3 / 5) / 4 * i
            y = height / 3
            draw.text((x, y), char, font=font, fill=(0, 0, 255))

        # 添加干扰点
        for _ in range(100):
            x = random.randint(0, width)
            y = random.randint(0, height)
            draw.point((x, y), fill=(0, 0, 0))

        # 保存图片
        filename = f'code_{i}.jpg'
        image.save(filename)

        # 将验证码信息存储在CSV文件中
        writer.writerow([code, lv])

结论

以上就是利用Python生成图片验证码的完整攻略,通过本攻略、示例代码和说明,你应该已经掌握了如何利用Pillow库来实现图片验证码的生成。