本文目录导读:

我来为你介绍几种生成随机验证码的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分钟)
- 错误限制:限制验证码尝试次数防止暴力破解
这些示例可以根据你的具体需求进行调整和扩���。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播