📅  最后修改于: 2023-12-03 15:36:36.827000             🧑  作者: Mango
验证码是一种用于验证用户是否为人类的技术,能够有效地防止恶意软件和机器人的攻击。在Web应用程序中,验证码被广泛使用,常常用于用户注册、登录、忘记密码等场景。
Python是一种强大的编程语言,它可以很方便地生成各种类型的验证码。本文将介绍如何使用Python生成图片验证码、音频验证码和数学验证码。
图片验证码(CAPTCHA)是最常用的一种验证码,它通常由随机生成的字符或数字组成,用户需要输入正确的文本才能通过验证。
在生成图片验证码之前,我们需要先安装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
库,它是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
该代码片段生成一个简单的数学问题和正确答案,然后将问题和答案作为元组返回给调用函数。