📜  使用Python生成验证码(1)

📅  最后修改于: 2023-12-03 15:36:36.827000             🧑  作者: Mango

使用Python生成验证码

验证码是一种用于验证用户是否为人类的技术,能够有效地防止恶意软件和机器人的攻击。在Web应用程序中,验证码被广泛使用,常常用于用户注册、登录、忘记密码等场景。

Python是一种强大的编程语言,它可以很方便地生成各种类型的验证码。本文将介绍如何使用Python生成图片验证码、音频验证码和数学验证码。

图片验证码

图片验证码(CAPTCHA)是最常用的一种验证码,它通常由随机生成的字符或数字组成,用户需要输入正确的文本才能通过验证。

安装Pillow库

在生成图片验证码之前,我们需要先安装Pillow库,它是Python中一个处理图片的库。

pip install pillow
生成验证码图片

以下是生成图片验证码的Python代码片段:

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

# 生成随机字符
def random_char():
    char_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    return char_list[randint(0, len(char_list)-1)]
    
# 生成随机颜色
def random_color():
    return (randint(0, 255), randint(0, 255), randint(0, 255))
    
# 生成验证码图像
def generate_captcha():
    # 图像大小
    width = 120
    height = 40
    
    # 创建图像对象
    image = Image.new('RGB', (width, height), (255, 255, 255))
    
    # 创建Draw对象
    draw = ImageDraw.Draw(image)
    
    # 创建字体对象
    font = ImageFont.truetype('arial.ttf', size=36)
    
    # 绘制字符
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=random_color())
            
    for i in range(4):
        char = random_char()
        draw.text((5+i*30, 5), char, font=font, fill=random_color())
    
    # 模糊处理
    image = image.filter(ImageFilter.BLUR)
    
    return image

该代码片段生成一个大小为120x40的图像对象,其中包含四个随机生成的字符,每个字符都使用不同的颜色。图像对象在生成后会经过模糊处理,以增加识别难度和防止机器识别。

展示验证码图片

以下是如何将验证码图片展示在Web页面上的Python代码片段:

from io import BytesIO
from flask import Flask, make_response

app = Flask(__name__)

@app.route('/captcha')
def captcha():
    image = generate_captcha()
    buf = BytesIO()
    image.save(buf, 'jpeg')
    buf_str = buf.getvalue()
    response = make_response(buf_str)
    response.headers['Content-Type'] = 'image/jpeg'
    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '0'
    return response

该代码片段使用Flask Web框架将验证码图片作为一个HTTP响应返回,当用户访问/captcha路径时,会调用captcha函数生成并返回验证码图片。

音频验证码

音频验证码(CAPTCHA)是一种通过语音播放随机数字或字母,要求用户输入正确文本的验证码。

安装pyaudio库

在生成音频验证码之前,我们需要先安装pyaudio库,它是Python中一个处理音频的库:

pip install pyaudio
生成验证码音频

以下是生成音频验证码的Python代码片段:

from random import randint
import pyaudio
import wave

# 生成随机字符
def random_char():
    char_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    return char_list[randint(0, len(char_list)-1)]

# 生成随机数字
def random_number():
    return str(randint(0, 9))

# 生成播放音频
def generate_audio():
    # 音频长度
    length = 3 # 3秒

    # 设置音频参数
    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, output=True)

    # 生成音频数据
    frames = []
    for i in range(length*44100):
        if i % 441 == 0:
            char = random_char()
        else:
            char = random_number()
        if i % 2205 == 0: # 每50ms播放一个字符
            data = char.encode('utf-8') // 播放字符
        else:
            data = bytes([randint(-128, 127)]) // 播放噪声
        frames.append(data)
    
    # 关闭音频流
    stream.write(b''.join(frames))
    stream.stop_stream()
    stream.close()
    p.terminate()

该代码片段生成一个长度为3秒的随机播放数字和字符的音频。

数学验证码

数学验证码(Math CAPTCHA)是一种要求用户解决简单数学问题的验证码,它通常由加、减、乘、除等简单数学运算组成。

生成验证码

以下是生成数学验证码的Python代码片段:

from random import randint
from operator import add, sub, mul, truediv

# 生成数学验证码
def generate_math_captcha():
    a = randint(1, 9)
    b = randint(1, 9)
    op = choice([add, sub, mul, truediv])
    if op == add:
        question = '{} + {}'.format(a, b)
        answer = a + b
    elif op == sub:
        question = '{} - {}'.format(a, b)
        answer = a - b
    elif op == mul:
        question = '{} × {}'.format(a, b)
        answer = a * b
    else:
        question = '{} ÷ {}'.format(a * b, a)
        answer = b
    return question, answer

该代码片段生成一个简单的数学问题和正确答案,然后将问题和答案作为元组返回给调用函数。