利用Python生成随机验证码详解

 更新时间:2022年01月25日 14:13:53   作者:程序猿李巡天  
怎么用python绕验证码是个令人头秃的事情,这篇文章将为大家详细 介绍如何利用Python生成随机的验证码,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起试试

最近感觉被大数据定义成机器人了,随便看个网页都跳验证码。

怎么用python绕验证码是个令人头秃的事情,

我投降!那么今天手把手教大家如何写验证码,去为难别人,让他们头秃。

说错了,其实就是教大家如何通过python代码去生成验证码~~

1.先搞环境

1.我们需要你电脑有python3.4以上的版本

2.pip安装PIL包

pip install pillow

3.默念一遍"人生苦短,我用python",之后打开IDLE开始码代码!

2.开始码代码

1. 确定画布大小和背景色

# 导入相关的绘画模块
from PIL import Image, ImageDraw, ImageFont

# 设置背景色
bg_color = (100, 100, 255)

#设置画布长宽(像素)
width = 400
height = 100

# 通过设置生成新的画布
im = Image.new('RGB',(width,height),bg_color)
# 展示画布
im.show()

在这 bg_color 背景色的设置是用 RGB 颜色标准去设置的,如果你不喜欢这个背景色可以自己调一下。

“常见的RGB颜色

运行代码后:

2. 往背景布上画字符

先上代码

from PIL import Image, ImageDraw, ImageFont


# 省略第一步的代码

# 创建画笔对象
draw = ImageDraw.Draw(im)
# 验证码文本
string = 'MSBC'
# 构造字体对象
font = ImageFont.truetype('./ziti.ttf', 90)
# font = ImageFont.load_default().font
# 构造字体颜色
fontcolor = (255, 100, 100)
# 绘制4个字
draw.text((10, 2), string[0], font=font, fill=fontcolor)
draw.text((110, 2), string[1], font=font, fill=fontcolor)
draw.text((210, 2), string[2], font=font, fill=fontcolor)
draw.text((310, 2), string[3], font=font, fill=fontcolor)


#释放画笔
del draw
#展示图片
im.show()

代码分析:

draw = ImageDraw.Draw(im)

在im画布上实例化一只笔。

font = ImageFont.truetype('./ziti.ttf', 90)
# font = ImageFont.load_default().font

第一个参数是设置字体,我这有下载一个ttf的字体文件所以可以用它,如果没有指定的字体文件可以使用默认的 # font = ImageFont.load_default().font;

第二个参数是绘制字体的大小,因为我们画布是400x100的 所以我们为了美观就把字体设成90x90的尺寸。

# 构造字体颜色
fontcolor = (255, 100, 100)

字体文本的颜色,参照第一步画布的 RGB 设置。

# 绘制4个字
draw.text((10, 2), string[0], font=font, fill=fontcolor)
draw.text((110, 2), string[1], font=font, fill=fontcolor)
draw.text((210, 2), string[2], font=font, fill=fontcolor)
draw.text((310, 2), string[3], font=font, fill=fontcolor)

这里 draw.text 函数,顾名思义就是开始拿画起画笔开始写字,

第一个参数 写字的坐标;

第二个参数 要写的字;

第三个参数 字的颜色(上面构造过了,你也可以设成一字一色)。

代码跑一下看成果:

效果还行,就是总觉得少了点什么?

3. 加干扰

既然是验证码,肯定要稍微难识别,上面那个那么傻白甜的验证码是怎么回事??

这一步我们需要导入 random 模块,因为干扰是不规则随机生成的。

import random
from PIL import Image, ImageDraw, ImageFont

# 省略第一步代码

# 省略第二步代码

#使用point函数绘制噪点
for i in range(0, 100):
    xy = (random.randrange(0, width), random.randrange(0, height))
    fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
    draw.point(xy, fill=fill)
    
#释放画笔
del draw   
im.show()

代码分析:

import random

别忘了导入 random 模块

for i in range(0, 100):
    xy = (random.randrange(0, width), random.randrange(0, height))
    fill = (255, 255, 255)
    draw.point(xy, fill=fill)

一个循环100次的 for 循环,

xy 变量是画干扰点的坐标值

fill 变量是噪点的颜色,还是 RGB 标准的

draw.point 画点的动作

“这个for循环的次数越多,画布上噪点也会相应增多。

跑一下代码看看噪点的效果如何:

感觉还是有点傻白甜,我们来循环1000次的试试:

10000次!

够了。

4. 加入更多的干扰

这一步我将各个参数结合 random 模块,使我们的验证码更难辨别!

import random
from PIL import Image, ImageDraw, ImageFont


bg_color = (random.randrange(20, 120), random.randrange(20, 120), random.randrange(150, 255))
width = 400
height = 100

im = Image.new('RGB',(width,height),bg_color)
# 创建画笔对象
draw = ImageDraw.Draw(im)

# 构造字体对象
font = ImageFont.truetype('./ziti.ttf', 100)
# font = ImageFont.load_default().font
# 构造字体颜色
fontcolor = (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255))
# 绘制4个字
string = 'MSBC'
draw.text((random.randint(10, 30), (random.randint(0, 10))), string[0], font=font, fill=fontcolor)
draw.text((random.randint(90, 130), (random.randint(0, 10))), string[1], font=font, fill=fontcolor)
draw.text((random.randint(180, 230), (random.randint(0, 10))), string[2], font=font, fill=fontcolor)
draw.text((random.randint(270, 330), (random.randint(0, 10))), string[3], font=font, fill=fontcolor)

#调用画笔的point()函数绘制噪点
for i in range(0, 10000):
    xy = (random.randrange(0, width), random.randrange(0, height))
    fill = (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255))
    draw.point(xy, fill=fill)

#释放画笔
del draw
im.show()

我把字体颜色,噪点颜色,文本位置都结合了random模块,效果图如下:

5. 验证码 + 随机字符

这一步,我们需要把上面的代码封装到函数中,大致把上面代码重构成:

# 使用for循环生成文本字符

# 生成验证码图片的函数,参数就是上面生成的文本

# 调用生成验证码图片函数

重构后:

import random
from PIL import Image, ImageDraw, ImageFont

string = ''
#随机选取4个值作为验证码
rand_str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for i in range(0, 4):
    string += rand_str[random.randrange(0, len(rand_str))]


def gen_verify_img(text):
    bg_color = (random.randrange(20, 120), random.randrange(20, 120), random.randrange(150, 255))
    width = 400
    height = 100

    im = Image.new('RGB',(width,height),bg_color)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)

    # 构造字体对象
    font = ImageFont.truetype('./ziti.ttf', 100)
    # font = ImageFont.load_default().font
    # 构造字体颜色
    fontcolor = (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255))
    # 绘制4个字
    draw.text((random.randint(10, 30), (random.randint(0, 10))), string[0], font=font, fill=fontcolor)
    draw.text((random.randint(90, 130), (random.randint(0, 10))), string[1], font=font, fill=fontcolor)
    draw.text((random.randint(180, 230), (random.randint(0, 10))), string[2], font=font, fill=fontcolor)
    draw.text((random.randint(270, 330), (random.randint(0, 10))), string[3], font=font, fill=fontcolor)

    #调用画笔的point()函数绘制噪点
    for i in range(0, 10000):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255))
        draw.point(xy, fill=fill)

    #释放画笔
    del draw
    im.show()

# 调用函数
gen_verify_img(string)

把原先代码中的 string 变量提到了函数外,把它变成函数需要传入的参数,

再用 for 循环,随机选出4个字符。

string = ''
#随机选取4个值作为验证码
rand_str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for i in range(0, 4):
    string += rand_str[random.randrange(0, len(rand_str))]

代码再跑一下:

上面的验证码是 DZNO 还是 DZN0 ?

6. 验证码保存本地(选)

在web开发的登录操作,和训练验证码识别的神经运算中,都需要大量的验证码图片。

所以需要把大量的验证码图片文件,我们将批量验证码保存到本地。

完整代码:

import random
from PIL import Image, ImageDraw, ImageFont


def gen_verify_img(text):
    bg_color = (random.randrange(20, 120), random.randrange(20, 120), random.randrange(150, 255))
    width = 400
    height = 100

    im = Image.new('RGB',(width,height),bg_color)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)

    # 构造字体对象
    font = ImageFont.truetype('./ziti.ttf', 100)
    # font = ImageFont.load_default().font
    # 构造字体颜色
    fontcolor = (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255))
    # 绘制4个字
    draw.text((random.randint(10, 30), (random.randint(0, 10))), string[0], font=font, fill=fontcolor)
    draw.text((random.randint(90, 130), (random.randint(0, 10))), string[1], font=font, fill=fontcolor)
    draw.text((random.randint(180, 230), (random.randint(0, 10))), string[2], font=font, fill=fontcolor)
    draw.text((random.randint(270, 330), (random.randint(0, 10))), string[3], font=font, fill=fontcolor)

    #调用画笔的point()函数绘制噪点
    for i in range(0, 10000):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255))
        draw.point(xy, fill=fill)

    #释放画笔
    del draw
    # im.show()
    im.save(f'./{text}.png','png')


for i in range(100):
    string = ''
    #随机选取4个值作为验证码
    rand_str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    for i in range(0, 4):
        string += rand_str[random.randrange(0, len(rand_str))]
    gen_verify_img(string)
    print(f'{string} 验证码生成成功!!')

最后再跑一下:

部分验证码展示:

注:如果再将本文中的代码进行变形或改写,可能会得到更五花八门的验证码,怎么发挥就看屏幕钱你的了。

以上就是利用Python生成随机验证码详解的详细内容,更多关于Python验证码的资料请关注脚本之家其它相关文章!

相关文章

  • python OpenCV学习笔记

    python OpenCV学习笔记

    这篇文章主要介绍了python OpenCV的相关资料,帮助大家更好的理解和学习使用python的opencv,感兴趣的朋友可以了解下
    2021-03-03
  • Tensorflow卷积实现原理+手写python代码实现卷积教程

    Tensorflow卷积实现原理+手写python代码实现卷积教程

    这篇文章主要介绍了Tensorflow卷积实现原理+手写python代码实现卷积教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python unix时间戳转换毫秒的实现

    python unix时间戳转换毫秒的实现

    Unix时间戳是一种常见的时间表示方式,本文主要介绍了python unix时间戳转换毫秒的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Python实现读取大量Excel文件并跨文件批量计算平均值

    Python实现读取大量Excel文件并跨文件批量计算平均值

    这篇文章主要为大家详细介绍了如何利用Python语言,实现对多个不同Excel文件进行数据读取与平均值计算的方法,感兴趣的可以了解一下
    2023-02-02
  • python自定义分页器的实现

    python自定义分页器的实现

    这篇文章主要介绍了python自定义分页器的实现,通过自定义分页器封装展开主题并对其实用方法简单介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • 深入解析python返回函数和匿名函数

    深入解析python返回函数和匿名函数

    这篇文章主要介绍了python返回函数和匿名函数的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • python 共现矩阵的实现代码

    python 共现矩阵的实现代码

    这篇文章主要介绍了python 共现矩阵的实现代码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • numpy.meshgrid()理解(小结)

    numpy.meshgrid()理解(小结)

    这篇文章主要介绍了numpy.meshgrid()理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Python 利用pandas和mysql-connector获取Excel数据写入到MySQL数据库

    Python 利用pandas和mysql-connector获取Excel数据写入到MySQL数据库

    在实际应用中,我们可能需要将Excel表格中的数据导入到MySQL数据库中,以便于进行进一步的数据分析和处理,本文将介绍如何使用Python将Excel表格中的数据插入到MySQL数据库中,需要的朋友可以参考下
    2023-10-10
  • 解决Django的request.POST获取不到内容的问题

    解决Django的request.POST获取不到内容的问题

    今天小编就为大家分享一篇解决Django的request.POST获取不到内容的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论