我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用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验证码的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

利用Python生成随机4位验证码

"""           作者:白           时间:2018年1月8日           功能: 生成随机4位验证码(必须由两个2字母和2个数字组成)"""import  randomdef main():    list_n
2023-01-31

python生成随机图形验证码详解

使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块pip install pillow2.pillow模块的基本使用 1.创建图片from PIL import Image #定义使用Image类实例化一
2022-06-04

python生成随机验证码

一、生成随机验证码(纯数字及字母加数字):import randomimport stringcheckcod=''for i in range(5): #5位验证码 ''' #纯数字验证码 #随机值1-9取可以保证5位
2023-01-31

Android随机生成验证码

Android随机生成验证码,Android利用随机数绘制不规则的验证码,加强用户登录或者注册的安全性。 具体思路如下: 在一块固定宽高的画布上,画上固定个数的随机数字和字母,再画上固定条数的干扰线 随机数和干扰线的颜色随机生成,随机数的样
2022-06-06

Python使用PIL模块生成随机验证码

Python生成随机验证码,需要使用PIL模块,具体内容如下安装:pip3 install pillow基本使用 1. 创建图片from PIL import Image img = Image.new(mode='RGB', size=(
2022-06-04

Python3 生成一个随机验证码

'''设计一个八位随机验证码,验证码是由大写字母,小写字母和数字三种字符组成。定义一个范围只有1,2,3的随机数,如果这个随机数是1,则八位验证码的当前位置用大写字母;                            如果这个随机数是
2023-01-31

利用Java 编写一个随机生成验证码功能

这篇文章给大家介绍利用Java 编写一个随机生成验证码功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java 实现随机验证码功能简单实例现在许多系统的注册、登录或者发布信息模块都添加的随机码功能,就是为了避免自动注
2023-05-31

Python生成随机验证码的两种方法

使用python生成随机验证码的方法有很多种,今天小编给大家分享两种方法,大家可以灵活运用这两种方法,设计出适合自己的验证码方法。 方法一: 利用range方法,对于range方法不清楚的同学,请参考文章《python开发的range()函
2022-06-04

QT如何生成随机验证码

这篇“QT如何生成随机验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“QT如何生成随机验证码”文章吧。一、先创建一个QT
2023-07-02

怎么用Python实现随机生成图片验证码

本篇内容主要讲解“怎么用Python实现随机生成图片验证码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现随机生成图片验证码”吧!导入模块import randomfrom
2023-06-26

php怎么能随机生成验证码

这篇文章给大家分享的是有关php怎么能随机生成验证码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下:
2023-06-15

React tsx如何生成随机验证码

这篇文章主要介绍React tsx如何生成随机验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!React tsx 生成随机验证码,具体内容如下最近开发React 使用tsx编写,没有找到什么好的随机生成验证码的插
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录