首页 > 科普 > 科学原理 >
阅读

用python绕过验证码(被验证码搞懵了)

时间:2023-06-10 17:13 来源:网络 作者: 小叶

简介:被验证码搞懵了作者:Kevin来源:麦叔编程最近感觉被大数据定义成机器人了,随便看个网页都跳验证码怎么用pytho

【红叶网探索分享】

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

用python绕过验证码(被验证码搞懵了)(1)

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

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

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

用python绕过验证码(被验证码搞懵了)(2)

先搞环境

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

pip安装PIL包

pip install pillow

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

用python绕过验证码(被验证码搞懵了)(3)

开始码代码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颜色标准去设置的,如果你不喜欢这个背景色可以自己调一下。

用python绕过验证码(被验证码搞懵了)(4)

常见的RGB颜色

运行代码后:

用python绕过验证码(被验证码搞懵了)(5)

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函数,顾名思义就是开始拿画起画笔开始写字,

第一个参数 写字的坐标;

第二个参数 要写的字;

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

代码跑一下看成果:

用python绕过验证码(被验证码搞懵了)(6)

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

3. 加干扰

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

用python绕过验证码(被验证码搞懵了)(7)

这一步我们需要导入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循环的次数越多,画布上噪点也会相应增多。

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

用python绕过验证码(被验证码搞懵了)(8)

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

用python绕过验证码(被验证码搞懵了)(9)

10000次!

用python绕过验证码(被验证码搞懵了)(10)

够了。

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模块,效果图如下:

用python绕过验证码(被验证码搞懵了)(11)

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))]

代码再跑一下:

用python绕过验证码(被验证码搞懵了)(12)

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

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

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

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

用python绕过验证码(被验证码搞懵了)(13)

完整代码:

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绕过验证码(被验证码搞懵了)(14)

最后再跑一下:

用python绕过验证码(被验证码搞懵了)(15)

部分验证码展示:

用python绕过验证码(被验证码搞懵了)(16)

用python绕过验证码(被验证码搞懵了)(17)

声明:本文内容仅代表作者个人观点,与本站立场无关。如有内容侵犯您的合法权益,请及时与我们联系,我们将第一时间安排处理。更多精彩内容请关注红叶网

大家都爱看

猜你喜欢