Python随机验证码案例如何生成验证码

wen python案例 22

本文目录导读:

Python随机验证码案例如何生成验证码

  1. 基础数字验证码
  2. 字母数字混合验证码
  3. 图形验证码(使用PIL/Pillow)
  4. 完整的验证码生成类
  5. Web框架集成(Flask示例)
  6. 安装依赖
  7. 使用建议

我来为你介绍几种生成随机验证码的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

使用建议

  1. 安全性考虑:避免使用容易混淆的字符(如0/O, 1/l/I)
  2. 复杂度平衡:4-6位字符通常足够安全且易于输入
  3. 存储验证码:建议在服务器端存储验证码(session/redis等)
  4. 有效期设置:验证码应设置有效期(通常5分钟)
  5. 错误限制:限制验证码尝试次数防止暴力破解

这些示例可以根据你的具体需求进行调整和扩���。

抱歉,评论功能暂时关闭!