用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,让我们一起在学习练习中进步吧!

原文发布于微信公众号 - 生信技能树(biotrainee)

原文发表时间:2017-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏上善若水

001计算机图形学vs2015配置openGL及第一个opengl程序

OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库; gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含...

713
来自专栏图形学与OpenGL

机械版CG 实验4 裁剪

了解二维图形裁剪的原理(点的裁剪、直线的裁剪、多边形的裁剪),利用VC+OpenGL实现直线的裁剪算法。

991
来自专栏FreeBuf

中文点选验证码之自动识别

某次测试中遇到了汉字点选的验证码,看着很简单,尝试了一下发现有两种简单的识别方法,终于有空给重新整理一下,分享出来。

2014
来自专栏北京马哥教育

Python 绘图库 Matplotlib 入门教程

Matplotlib是一个Python语言的2D绘图库,它支持各种平台,并且功能强大,能够轻易绘制出各种专业的图像。本文是对它的一个入门教程。

731
来自专栏北京马哥教育

十分钟入门 Python 绘图库 Matplotlib 入门教程

Matplotlib是一个Python语言的2D绘图库,它支持各种平台,并且功能强大,能够轻易绘制出各种专业的图像。本文是对它的一个入门教程。

720
来自专栏CDA数据分析师

Python图像处理库:Pillow 初级教程

Pillow由PIL而来,所以该导入该库使用import PIL 本文相关的代码:https://github.com/445141126/pillow_ex...

3409
来自专栏阿凯的Excel

金字塔图绘制(Excel绘制图表系列课程)

今天和大家分享金字塔图的绘制 什么是金字塔图呢?就是长得很像金字塔的图! 哦! 问:那是长这样? ? 答:额,有点像,但是不是! 问:那是怎样? 答:如下图。...

2923
来自专栏深度学习之tensorflow实战篇

Python生成词云图,TIIDF方法文本挖掘: 词频统计,词云图

python中使用wordcloud包生成的词云图。 下面来介绍一下wordcloud包的基本用法。 class wordcloud.WordCloud(fon...

3646
来自专栏华章科技

纯干货:手把手教你用Python做数据可视化(附代码)

导读:制作提供信息的可视化(有时称为绘图)是数据分析中的最重要任务之一。可视化可能是探索过程的一部分,例如,帮助识别异常值或所需的数据转换,或者为建模提供一些想...

1392
来自专栏逍遥剑客的游戏开发

Nebula3绘制2D纹理

1336

扫码关注云+社区