广告位联系
返回顶部
分享到

Python创建一个功能齐全的随机验证码生成器

python 来源:互联网 作者:佚名 发布时间:2024-04-20 22:18:50 人浏览
摘要

验证码(CAPTCHA)是一种常用的用于验证用户身份的技术。它通过生成一张包含难以识别的文本、数字或图像的图像,要求用户正确输入其中的内容,用于验证用户身份、防止自动化攻击和确保数据

验证码(CAPTCHA)是一种常用的用于验证用户身份的技术。它通过生成一张包含难以识别的文本、数字或图像的图像,要求用户正确输入其中的内容,用于验证用户身份、防止自动化攻击和确保数据安全。本篇教程将带领您一步步使用Python创建一个功能齐全的随机验证码生成器。我们将通过导入必要的库、定义辅助函数以及编写主函数check_code(),来实现生成包含随机字符、多彩背景、干扰元素及边缘增强效果的验证码图片。让我们开始动手实践吧!

1. 导入所需库

首先,我们需要引入以下几个Python库来支持验证码生成过程中的图像处理和随机数生成:

1

2

import random

from PIL import Image, ImageDraw, ImageFont, ImageFilter

random库:用于生成各种随机数,包括字符选择、颜色值确定等。
PIL(Python Imaging Library):这是一个强大的图像处理库,包含Image、ImageDraw、ImageFont和ImageFilter模块,分别用于创建和操作图像、绘制图形、加载字体以及应用图像滤镜。

2. 定义辅助函数

为了使代码更清晰、易读,我们定义两个辅助函数:rndChar() 和 rndColor(),分别用于生成随机字符和随机颜色。

2.1 rndChar():生成随机字母或数字

1

2

3

4

5

6

7

8

9

10

def rndChar():

    """

    生成随机字母或数字

    :return:

    """

    random_char = random.choice(

        [chr(random.randint(65, 90)),  # 字母(大写)

         str(random.randint(0, 9))]  # 数字

    )

    return random_char

此函数通过random.choice()从一个列表中随机选取一个元素。列表中包含两种类型的元素:大写字母(ASCII码范围65到90)和数字(0到9)。每次调用rndChar()会返回一个随机的字母或数字。

2.2 rndColor():生成随机颜色

1

2

3

4

5

6

def rndColor():

    """

    生成随机颜色

    :return:

    """

    return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

该函数返回一个包含三个整数的元组,分别代表红、绿、蓝(RGB)通道的颜色值。每个值都在指定范围内随机选取,确保生成的色彩丰富且具有良好的可读性。

3. 主函数check_code()

接下来,我们编写主函数check_code(),它接受一系列参数并负责整个验证码的生成过程,包括创建空白图像、绘制字符、添加干扰元素,以及最后的图像滤镜处理。

3.1 初始化与设置

1

2

3

4

5

def check_code(width=120, height=30, char_length=5, font_file='Monaco.ttf', font_size=28):

    code = []  # 存储生成的验证码字符序列

    # 创建一张图片

    img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))

    draw = ImageDraw.Draw(img, mode='RGB')

函数接受以下参数:

width和height:验证码图片的宽度和高度,默认为120像素宽、30像素高。
char_length:验证码字符数量,默认为5个。
font_file:字体文件路径,默认使用’Monaco.ttf’。
font_size:验证码字符的字体大小,默认为28像素。
首先创建一个空白的RGB模式图像,并设置其背景色为白色。接着,创建一个ImageDraw对象draw,用于在图像上绘制文本和图形。

3.2 绘制验证码字符

1

2

3

4

5

6

7

8

9

10

def rndChar():

    ...

def rndColor():

    ...

font = ImageFont.truetype(font_file, font_size)

for i in range(char_length):

    char = rndChar()

    code.append(char)

    h = random.randint(0, 4)  # 随机字符基线偏移

    draw.text([i * width / char_length, h], char, font=font, fill=rndColor())

使用ImageFont.truetype()加载指定的字体文件,并设置字体大小。然后,循环char_length次,每次生成一个随机字符、将其添加到code列表中,并在图像上绘制。字符的位置根据索引i均匀分布,基线高度有一个随机的小幅偏移(0到4像素),以增加视觉复杂度。字符颜色由rndColor()函数随机生成。

3.3 添加干扰元素

为了降低机器识别的成功率,我们在验证码图片中加入多种干扰元素:

3.3.1 干扰点

1

2

for i in range(40):

    draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

随机生成40个点,其坐标在图像范围内均匀分布,颜色同样由rndColor()函数提供。

3.3.2 干扰圆圈

1

2

3

4

5

for i in range(40):

    draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

    x = random.randint(0, width)

    y = random.randint(0, height)

    draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())

除了点状干扰,还生成40个直径为4像素的弧形(近似小圆圈),位置和颜色均为随机。

3.3.3 干扰线

1

2

3

4

5

6

for i in range(5):

    x1 = random.randint(0, width)

    y1 = random.randint(0, height)

    x2 = random.randint(0, width)

    y2 = random.randint(0, height)

    draw.line((x1, y1, x2, y2), fill=rndColor())

最后,绘制5条随机起点、终点和颜色的直线作为干扰线。

3.4 应用图像滤镜

1

img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)

为了进一步提升验证码的抗噪声能力,对生成的图像应用ImageFilter.EDGE_ENHANCE_MORE滤镜,增强图像边缘对比度。

3.5 返回结果

1

return img, ''.join(code)

函数返回生成的验证码图片以及对应的字符序列。

总结

通过上述步骤,我们成功创建了一个Python随机验证码生成器。只需调用check_code()函数,即可得到一张包含随机字符、多种干扰元素及边缘增强效果的验证码图片,同时返回对应的验证码字符串。这样的验证码设计有助于防止自动化脚本的破解,提升系统的安全性。您可以根据实际需求调整函数参数,定制符合项目要求的验证码样式。现在,您可以将此代码集成到您的应用程序中,为用户登录、注册或其他敏感操作提供可靠的验证码保护机制。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计