用python编写验证码
作为一个用python的生信工程师,平时工作中除了用python来处理些文本文件和搭建流程,没事也想探索些其他有趣的功能。这几天就在网上学习了下如何用python编写验证码,感兴趣的同学也一起来学习下吧!
01
验证码的作用及干扰机制
在编写验证码之前,我们首先来了解下验证码是用来干嘛的吧:
验证码主要是为了防止暴力破解,爬虫模拟登陆以及各种键盘钩子进行登陆;验证码能起到干扰作用的机制主要是靠背景点或线条进行干扰,以及对文字进行扭曲。
02
Python编写验证码实战
我们先来看下采用python编写验证码的一个基本思路:
1.定义一张图片
2.创建画笔
3.绘制线条和点
4.绘制文字
5.定义扭曲的参数
6.使用滤镜
下面我们分步来看一下每一步的代码实现是怎样的吧(注:这里采用的是python2进行编写):
01
导入模块
import randomfrom PIL import Image,ImageDraw,ImageFont,ImageFilter
这里我们需要用到两个模块,random模块和PTL模块。random模块用来生成随机数,PIL是一个用来处理图片文件的python第三方模块。PIL没有安装的小伙伴可以采用pip install PIL进行安装。PIL中的Image类负责处理图片,ImageDraw负责处理画笔, ImageFont负责处理字体,ImageFilter负责处理滤镜。
02
定义一张图片
img = Image.new("RGB",(150,50),(255,255,255))
这里需要用到三个参数,分别代表我们采用RGB颜色模式,图片的大小,具体的图片颜色。
03
创建画笔
draw = ImageDraw.Draw(img)
04
绘制线条和点
绘制线条
for i in range(random.randint(1,10)):
draw.line(
#在绘制线条时:每条线有两个点,每个点靠x,y两个值来确定位置 [
( random.randint(1,150),random.randint(1,150)),(
random.randint(1,150),random.randint(1,150))
],
fill = (0,0,0) )
这里random.randint(1,10)函数用来生成1-10之间的随机数,draw.line是用来绘制线条的函数,由于一条线是由两个点组成,所以这里我们采用列表来储存线条的起止坐标。由于验证码中线条的作用就是起干扰作用,所以我们需要绘制出来的线条是没有规律的。这里循环用以生成线条的条数以及线条的起止坐标都采用random函数来随机生成。fill用来给出线条的RGB颜色。
绘制点
for i in range(2000):
draw.point(
(random.randint(1,150),random.randint(1,150)),
fill =(0,0,0)
)
同理,我们可以绘制随机坐标的点,这里可以用循环控制绘制点的数量。
05
绘制文字
fontList = list("abdfkjfalemvcjierASDFGHJKLQW123456789")
c_chars = " ".join(random.sample(fontList,5)
#random.sample是在指定的列表当中随机取出指定个元素
font = ImageFont.truetype("simsun.ttc",26)
draw.text((5,5),c_chars,font=font,fill="green")
接下来我们就要绘制显示在验证码上的文字啦,在绘制文字的时候我们要考虑两点,首先我们生成的文字是要随机产生的,另外文字的个数需要是固定的。
这里我们首先利用fontList变量来定义要生成的随机数的字母和数字,接着我们要从定义的随机数列表当中取出指定个数的随机数。这里就要用到random.sample这个函数啦,函数后面接的参数就是取出的随机数的个数,其后我们用join函数将取出的随机数列表连接成字符串。随后用ImageFont.truetype定义字体,函数的第一个参数代表字体类别,第二个参数代表字体大小。最后采用draw.text进行文字的最终绘制,这里第一个参数代表文字的位置,距离上和左方的距离,第二个参数代表文字的内容,第三个参数代表字体,第四个参数定义字体的颜色。
06
定义扭曲参数
params = [1 - float(random.randint(1,2))/100,
0,
0,
0,
1 - float(random.randint(1,2))/100,
float(random.randint(1,2))/500,
0.001,
float(random.randint(1,1))/500,
]
这里的参数有点多,这里就不详细介绍每个数值的含义啦,感兴趣的小伙伴可以自行百度搜索一下。
07
使用滤镜
img = img.transform((150,50),Image.PERSPECTIVE,params) # 创建扭曲
"""
第一个参数:扭曲的范围,
第二个参数:扭曲的样式,
第三个参数:扭曲的参数
"""
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强(阈值更大)
img.show()
接下来我们就要使用滤镜来对文字进行扭曲,首先使用img.transform这个函数来创建扭曲,其中的三个参数,分别代表扭曲的范围、扭曲的样式、扭曲的参数,接着使用img.filter来进行扭曲。
最后我们来看下生成的效果吧:
是不是很简单呢,上述代码我们也可以封装成函数进行编写,感兴趣的小伙伴们可以自己动手试下哦。
我们在学习python的过程中可以多找一些自己感兴趣的项目来练习提高自己的编程能力,比如多练习下生信技能树中的生信编程题,也可以找一些自己感兴趣的应用来学习,比如试着用爬虫爬取自己感兴趣的内容,也可以试着用python写一些小游戏玩玩,人生苦短,我用python,让我们一起在学习练习中进步吧!
- c#:Reflector+Reflexil 修改编译后的dll/exe文件
- testNG java.net.SocketException: Software caused connection abort: socket write error
- MyBatis.Net 学习手记
- 基于JavaScript 声明全局变量的三种方式详解
- 网页基础篇之如何制作简单的静态网页
- Mybatis.Net 整合 ODP.NET Managed
- 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement
- 知道这几点,用微信小程序留住海量客户不是问题
- C#:DataTable映射成Model
- jenkins 多选框
- Oracle:ODP.NET Managed 小试牛刀
- C#:Func的同步、异步调用
- Python之路-day6
- hadoop1.2.1伪分布模式配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis系列:单机主从模式搭建
- Python 爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战
- 10 个冷门但又非常实用的 Docker 使用技巧!
- 利用 Shell 脚本实现邮件监控 Linux 系统的内存
- 拥有此神技,脚本调试从此与 echo、set、test 说分手!
- 很少用到,但掏出来让人感到牛逼的Web API
- 突击并发编程JUC系列-并发工具 CountDownLatch
- 推出 TF Lite Task Library 接口,简化 ML移动端开发流程
- 排序算法之我观
- 线性筛素数(探索中的不断优化)
- 麦森数
- 5款工具,让你轻松创建并分享优美的项目源码
- 过河卒
- 低调的 Linux 文件系统家族
- 圆点