本文目录导读:

我来为你介绍几种生成随机验证码的Python方法:
基础数字验证码
import random
import string
def generate_digit_code(length=6):
"""生成纯数字验证码"""
code = ''.join(random.choices('0123456789', k=length))
return code
# 示例
print(generate_digit_code()) # 输出: 385729
print(generate_digit_code(4)) # 输出: 6291
字母数字混合验证码
import random
import string
def generate_alphanumeric_code(length=6):
"""生成字母数字混合验证码"""
# 排除容易混淆的字符(如0和O,1和l)
characters = string.ascii_uppercase + string.digits
characters = characters.replace('0', '').replace('O', '').replace('1', '').replace('I', '')
code = ''.join(random.choices(characters, k=length))
return code
# 示例
print(generate_alphanumeric_code()) # 输出: K3W7B9
图形验证码(使用PIL/Pillow)
from PIL import Image, ImageDraw, ImageFont
import random
import string
def generate_image_captcha(text=None, width=200, height=80):
"""生成图形验证码"""
if text is None:
# 生成随机文本
characters = string.ascii_uppercase + string.digits
characters = characters.replace('0', '').replace('O', '').replace('1', '').replace('I', '')
text = ''.join(random.choices(characters, k=4))
# 创建图像
image = Image.new('RGB', (width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(image)
# 添加干扰线
for _ in range(3):
start = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([start, end], fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
# 绘制文本
font_size = 40
font = ImageFont.truetype('arial.ttf', font_size)
# 逐个字符绘制,增加旋转效果
x_offset = 20
for char in text:
# 随机颜色
color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150))
# 绘制字符
draw.text((x_offset, random.randint(15, 30)), char, font=font, fill=color)
x_offset += 40
# 添加噪点
for _ in range(100):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
return image, text
# 示例
captcha_image, captcha_text = generate_image_captcha()
captcha_image.save('captcha.png')
print(f"验证码文本: {captcha_text}")
完整的验证码生成类
import random
import string
from PIL import Image, ImageDraw, ImageFont
import io
class CaptchaGenerator:
def __init__(self, width=200, height=80, length=4):
self.width = width
self.height = height
self.length = length
self.characters = string.ascii_uppercase + string.digits
# 排除容易混淆的字符
ambiguous_chars = '0O1Il'
self.characters = ''.join(c for c in self.characters if c not in ambiguous_chars)
def generate_text(self):
"""生成随机验证码文本"""
return ''.join(random.choices(self.characters, k=self.length))
def generate_image(self, text=None):
"""生成验证码图片"""
if text is None:
text = self.generate_text()
# 创建图像
image = Image.new('RGB', (self.width, self.height), color=(255, 255, 255))
draw = ImageDraw.Draw(image)
# 添加随机背景色
bg_color = (random.randint(230, 255), random.randint(230, 255), random.randint(230, 255))
image = Image.new('RGB', (self.width, self.height), color=bg_color)
draw = ImageDraw.Draw(image)
# 添加干扰线
for _ in range(5):
start = (random.randint(0, self.width), random.randint(0, self.height))
end = (random.randint(0, self.width), random.randint(0, self.height))
line_color = (random.randint(100, 200), random.randint(100, 200), random.randint(100, 200))
draw.line([start, end], fill=line_color, width=2)
# 绘制文本
try:
font = ImageFont.truetype('arial.ttf', 35)
except:
font = ImageFont.load_default()
# 计算文本位置使其居中
text_width = self.length * 30 # 估算宽度
start_x = (self.width - text_width) // 2
for i, char in enumerate(text):
char_color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150))
# 随机y轴偏移
y_offset = random.randint(-5, 10)
draw.text((start_x + i * 35, self.height//3 + y_offset),
char, font=font, fill=char_color)
# 添加噪点
for _ in range(200):
x = random.randint(0, self.width)
y = random.randint(0, self.height)
noise_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
draw.point((x, y), fill=noise_color)
return image, text
def get_bytes(self, text=None):
"""获取图片的字节数据"""
image, text = self.generate_image(text)
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr.seek(0)
return img_byte_arr.getvalue(), text
# 使用示例
if __name__ == "__main__":
# 创建验证码生成器
captcha = CaptchaGenerator(width=240, height=80, length=6)
# 生成验证码
image, text = captcha.generate_image()
image.save('captcha.png')
print(f"验证码: {text}")
Web框架集成(Flask示例)
from flask import Flask, session, make_response, send_file
import io
app = Flask(__name__)
app.secret_key = 'your-secret-key-here'
@app.route('/captcha')
def get_captcha():
"""生成验证码并返回图片"""
captcha = CaptchaGenerator()
image, text = captcha.generate_image()
# 保存验证码文本到session用于验证
session['captcha'] = text
# 返回图片
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr.seek(0)
response = make_response(send_file(img_byte_arr, mimetype='image/png'))
return response
@app.route('/verify', methods=['POST'])
def verify_captcha():
"""验证用户输入的验证码"""
user_input = request.form.get('captcha_input')
if user_input.upper() == session.get('captcha', ''):
return "验证码正确!"
return "验证码错误!"
安装依赖
# 基础版本不需要额外安装 # 图形验证码需要Pillow pip install Pillow # Flask集成需要Flask pip install Flask
使用建议
- 安全性考虑:避免使用容易混淆的字符(如0/O, 1/l/I)
- 复杂度平衡:4-6位字符通常足够安全且易于输入
- 存储验证码:建议在服务器端存储验证码(session/redis等)
- 有效期设置:验证码应设置有效期(通常5分钟)
- 错误限制:限制验证码尝试次数防止暴力破解
这些示例可以根据你的具体需求进行调整和扩���。