最近感觉被大数据定义成机器人了,随便看个网页都跳验证码。
我投降!那么今天手把手教大家如何写验证码,去为难别人,让他们头秃。
说错了,其实就是教大家如何通过python代码去生成验证码~~
1.我们需要你电脑有python3.4以上的版本
2.pip安装PIL包
pip install pillow
3.默念一遍"人生苦短,我用python",之后打开IDLE开始码代码!
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 颜色标准去设置的,如果你不喜欢这个背景色可以自己调一下。
运行代码后:
先上代码
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 函数,顾名思义就是开始拿画起画笔开始写字,
第一个参数 写字的坐标;
第二个参数 要写的字;
第三个参数 字的颜色(上面构造过了,你也可以设成一字一色)。
代码跑一下看成果:
既然是验证码,肯定要稍微难识别,上面那个那么傻白甜的验证码是怎么回事??
这一步我们需要导入 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循环的次数越多,画布上噪点也会相应增多。
跑一下代码看看噪点的效果如何:
这一步我将各个参数结合 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模块,效果图如下:
这一步,我们需要把上面的代码封装到函数中,大致把上面代码重构成:
# 使用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))]
代码再跑一下:
在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 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
保证100%免费
】