作者:Kevin
来源:麦叔编程
最近感觉被大数据定义成机器人了,随便看个网页都跳验证码。
怎么用python绕验证码是个令人头秃的事情,
我投降!那么今天手把手教大家如何写验证码,去为难别人,让他们头秃。
说错了,其实就是教大家如何通过python代码去生成验证码~~
pip install pillow
# 导入相关的绘画模块 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颜色
运行代码后:
先上代码
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循环的次数越多,画布上噪点也会相应增多。
跑一下代码看看噪点的效果如何:
感觉还是有点傻白甜,我们来循环1000次的试试:
10000次!
够了。
这一步我将各个参数结合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))]
代码再跑一下:
上面的验证码是 DZNO还是DZN0?
在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} 验证码生成成功!!')
最后再跑一下:
部分验证码展示:
“
作者注:
如果再将本文中的代码进行变形或改写,可能会得到更五花八门的验证码,怎么发挥就看屏幕钱你的了。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
持证人简介:贺渲雯 ,CDA 数据分析师一级持证人,互联网行业数据分析师 今天我将为大家带来一个关于用户私域用户质量数据分析 ...
2025-04-18一、CDA持证人介绍 在数字化浪潮席卷商业领域的当下,数据分析已成为企业发展的关键驱动力。为助力大家深入了解数据分析在电商行 ...
2025-04-17CDA持证人简介:居瑜 ,CDA一级持证人,国企财务经理,13年财务管理运营经验,在数据分析实践方面积累了丰富的行业经验。 一、 ...
2025-04-16持证人简介: CDA持证人刘凌峰,CDA L1持证人,微软认证讲师(MCT)金山办公最有价值专家(KVP),工信部高级项目管理师,拥有 ...
2025-04-15持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。在实际生活中,我们可能会 ...
2025-04-14在 Python 编程学习与实践中,Anaconda 是一款极为重要的工具。它作为一个开源的 Python 发行版本,集成了众多常用的科学计算库 ...
2025-04-14随着大数据时代的深入发展,数据运营成为企业不可或缺的岗位之一。这个职位的核心是通过收集、整理和分析数据,帮助企业做出科 ...
2025-04-11持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。 本次分享我将以教培行业为 ...
2025-04-11近日《2025中国城市长租市场发展蓝皮书》(下称《蓝皮书》)正式发布。《蓝皮书》指出,当前我国城市住房正经历从“增量扩张”向 ...
2025-04-10在数字化时代的浪潮中,数据已经成为企业决策和运营的核心。每一位客户,每一次交易,都承载着丰富的信息和价值。 如何在海量客 ...
2025-04-09数据是数字化的基础。随着工业4.0的推进,企业生产运作过程中的在线数据变得更加丰富;而互联网、新零售等C端应用的丰富多彩,产 ...
2025-04-094月7日,美国关税政策对全球金融市场的冲击仍在肆虐,周一亚市早盘,美股股指、原油期货、加密货币、贵金属等资产齐齐重挫,市场 ...
2025-04-08背景 3月26日,科技圈迎来一则重磅消息,苹果公司宣布向浙江大学捐赠 3000 万元人民币,用于支持编程教育。 这一举措并非偶然, ...
2025-04-07在当今数据驱动的时代,数据分析能力备受青睐,数据分析能力频繁出现在岗位需求的描述中,不分岗位的任职要求中,会特意标出“熟 ...
2025-04-03在当今数字化时代,数据分析师的重要性与日俱增。但许多人在踏上这条职业道路时,往往充满疑惑: 如何成为一名数据分析师?成为 ...
2025-04-02最近我发现一个绝招,用DeepSeek AI处理Excel数据简直太爽了!处理速度嘎嘎快! 平常一整天的表格处理工作,现在只要三步就能搞 ...
2025-04-01你是否被统计学复杂的理论和晦涩的公式劝退过?别担心,“山有木兮:统计学极简入门(Python)” 将为你一一化解这些难题。课程 ...
2025-03-31在电商、零售、甚至内容付费业务中,你真的了解你的客户吗? 有些客户下了一两次单就消失了,有些人每个月都回购,有些人曾经是 ...
2025-03-31在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的需求持续飙升。世界经济论坛发布的《未来就业报告》, ...
2025-03-28你有没有遇到过这样的情况?流量进来了,转化率却不高,辛辛苦苦拉来的用户,最后大部分都悄无声息地离开了,这时候漏斗分析就非 ...
2025-03-27