用python编写验证码

作为一个用python的生信工程师,平时工作中除了用python来处理些文本文件和搭建流程,没事也想探索些其他有趣的功能。这几天就在网上学习了下如何用python编写验证码,感兴趣的同学也一起来学习下吧!

01

验证码的作用及干扰机制

在编写验证码之前,我们首先来了解下验证码是用来干嘛的吧:

验证码主要是为了防止暴力破解,爬虫模拟登陆以及各种键盘钩子进行登陆;验证码能起到干扰作用的机制主要是靠背景点或线条进行干扰,以及对文字进行扭曲。

02

Python编写验证码实战

我们先来看下采用python编写验证码的一个基本思路:

1.定义一张图片

2.创建画笔

3.绘制线条和点

4.绘制文字

5.定义扭曲的参数

6.使用滤镜

下面我们分步来看一下每一步的代码实现是怎样的吧(注:这里采用的是python2进行编写):

01
导入模块
  1. import random

  2. from PIL import Image,ImageDraw,ImageFont,ImageFilter

这里我们需要用到两个模块,random模块和PTL模块。random模块用来生成随机数,PIL是一个用来处理图片文件的python第三方模块。PIL没有安装的小伙伴可以采用pip install PIL进行安装。PIL中的Image类负责处理图片,ImageDraw负责处理画笔, ImageFont负责处理字体,ImageFilter负责处理滤镜。

02
定义一张图片
  1. img = Image.new("RGB",(150,50),(255,255,255))

这里需要用到三个参数,分别代表我们采用RGB颜色模式,图片的大小,具体的图片颜色。

03
创建画笔
  1. draw = ImageDraw.Draw(img)

04
绘制线条和点

绘制线条

  1. for in range(random.randint(1,10)):

  2. draw.line(    

  3. #在绘制线条时:每条线有两个点,每个点靠x,y两个值来确定位置

  4.        [

  5.             ( random.randint(1,150),random.randint(1,150)),( 

  6. random.randint(1,150),random.randint(1,150))

  7.         ],

  8. fill = (0,0,0)

  9. )

这里random.randint(1,10)函数用来生成1-10之间的随机数,draw.line是用来绘制线条的函数,由于一条线是由两个点组成,所以这里我们采用列表来储存线条的起止坐标。由于验证码中线条的作用就是起干扰作用,所以我们需要绘制出来的线条是没有规律的。这里循环用以生成线条的条数以及线条的起止坐标都采用random函数来随机生成。fill用来给出线条的RGB颜色。

绘制点

  1. for in range(2000):

  2. draw.point(

  3. (random.randint(1,150),random.randint(1,150)),

  4.                 fill =(0,0,0)

  5.             )

同理,我们可以绘制随机坐标的点,这里可以用循环控制绘制点的数量。

05
绘制文字
  1. fontList = list("abdfkjfalemvcjierASDFGHJKLQW123456789")

  2. c_chars = " ".join(random.sample(fontList,5)

  3. #random.sample是在指定的列表当中随机取出指定个元素

  4. font = ImageFont.truetype("simsun.ttc",26)

  5. draw.text((5,5),c_chars,font=font,fill="green")

接下来我们就要绘制显示在验证码上的文字啦,在绘制文字的时候我们要考虑两点,首先我们生成的文字是要随机产生的,另外文字的个数需要是固定的。

这里我们首先利用fontList变量来定义要生成的随机数的字母和数字,接着我们要从定义的随机数列表当中取出指定个数的随机数。这里就要用到random.sample这个函数啦,函数后面接的参数就是取出的随机数的个数,其后我们用join函数将取出的随机数列表连接成字符串。随后用ImageFont.truetype定义字体,函数的第一个参数代表字体类别,第二个参数代表字体大小。最后采用draw.text进行文字的最终绘制,这里第一个参数代表文字的位置,距离上和左方的距离,第二个参数代表文字的内容,第三个参数代表字体,第四个参数定义字体的颜色。

06
定义扭曲参数
  1. params = [1 - float(random.randint(1,2))/100,

  2.          0,

  3.          0,

  4.          0,

  5.          1 - float(random.randint(1,2))/100,

  6.          float(random.randint(1,2))/500,

  7.          0.001,

  8.          float(random.randint(1,1))/500,

  9.          ]

这里的参数有点多,这里就不详细介绍每个数值的含义啦,感兴趣的小伙伴可以自行百度搜索一下。

07
使用滤镜
  1. img = img.transform((150,50),Image.PERSPECTIVE,params)  # 创建扭曲

  2. """

  3. 第一个参数:扭曲的范围,

  4. 第二个参数:扭曲的样式,

  5. 第三个参数:扭曲的参数

  6. """

  7. img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) #滤镜,边界加强(阈值更大)

  8. img.show()

接下来我们就要使用滤镜来对文字进行扭曲,首先使用img.transform这个函数来创建扭曲,其中的三个参数,分别代表扭曲的范围、扭曲的样式、扭曲的参数,接着使用img.filter来进行扭曲。

最后我们来看下生成的效果吧:

是不是很简单呢,上述代码我们也可以封装成函数进行编写,感兴趣的小伙伴们可以自己动手试下哦。

我们在学习python的过程中可以多找一些自己感兴趣的项目来练习提高自己的编程能力,比如多练习下生信技能树中的生信编程题,也可以找一些自己感兴趣的应用来学习,比如试着用爬虫爬取自己感兴趣的内容,也可以试着用python写一些小游戏玩玩,人生苦短,我用python,让我们一起在学习练习中进步吧!

(0)

相关推荐

  • 5行Python代码就能让你的电脑 “永不息屏”?

    Python入门与进阶 今天 以下文章来源于快学Python ,作者黄伟呢 快学PythonPython可视化.自动化办公.数据分析.爬虫.Web开发!人生苦短,快学Python! Python不亏是 ...

  • python+opencv图像处理(十三)

    直方图 又回到了校园,空气是如此的新鲜,人是如此的少...... 心情有点微妙... 看一看窗户外面的天... 直方图,在高中数学里好像就出现了. 它是数值数据分布的图形表示. 在Python里,直方 ...

  • 谁说不能用中文写代码?

    现代计算机和编程的起源和推动力量主要源自美国,再加上26个字母很便于表示(算上大小写,6位bit就够了),因此英语一直是编程领域的不二之选.但这就给部分非英语国家的编程学习者带来一些困扰.以至于有些人 ...

  • 深入理解 Python 内部函数和闭包(进阶)

    大家好,我是安果! 本文以内部函数为主线,深入讲解内部函数和闭包的应用场景和原理,学会后你的 Python 水平会再上一个台阶,对工作面试或实战应用都会很有帮助 本文包括: 函数是一等公民 内部函数定 ...

  • 第31天:Python random 模块

    在本节中继续介绍 Python 提供的常用模块 random 模块,它的主要功能是用来生成伪随机数的. random 模块 Python 提供的 random 模块实现了各种分布式的伪随机数生成器.该 ...

  • 用 python 编写简单的证书域名到期报警脚本

    将脚本放在服务器的计划任务内,定时检测,证书到期不足60天发送报警邮件及钉钉提醒. 在服务器上需要提前安装好 requests 库. pip install requests 钉钉机器人 https: ...

  • 如何用简单的Python编写Web应用程序?

    全文共6260字,预计学习时长13分钟 不了解任何网页框架?没关系,本文将教你如何轻松搞定从数据科学项目到超棒程序的无缝转换. 图片来源:Cody Black Unsplash 稍作休息,开始编码. ...

  • Python编写窃取摄像头照片程序

    来源:http://nxw.so/5nIWK  作者: Henrik-Yao 教你用python做一个属于自己的窃取摄像头照片的软件. 需要安装python3.5以上版本,在官网下载即可. 然后安装库 ...

  • 使用python编写一个EXE软件(一)

    李斯 李斯学python 5月22日 简介 初学python的同学(例如我自己),会以解决日常问题为目的而编写python脚本,练习python的同时也减少了很多重复劳动. 但是,脚本写完之后,如果需 ...

  • ​慎用!用 Python 编写网页病毒

    Hello everyone,今天给大家康康两种网页病毒.这次代码真的只需要亿点点哦~~(拿去恶搞基友吧!) 第一种 我们先进入第一种,这个的威力没有你们想象的那么大,我们来看下方: import w ...

  • 爆强!直接把 Python 编写的图形程序打包为安卓 APP

    作者丨州的先生 来源丨州的先生(ID:zmister2016) 如果想使用 Python 语言编写图形界面程序,那么有不少的框架可以提供支持,比如 Tkinter.Qt for Python.WxPy ...

  • 十分钟学会python编写小游戏

    春节过了一大半,各位生信技能树的童鞋们,亲戚问你的生信专业能干哈没? 卤煮早就咬牙切齿准备好了:无聊了都能自己编游戏自己玩!(到底是有多寂寞--) 那么看完这一篇推送,赶紧拿出手机,秀秀自己编的游戏, ...

  • 用Python编写基于Supertrend“超级趋势线”强化策略

    『正文』 ˇ 简文: 什么是超级趋势指标SuperTrend Indicator? 超级趋势指标SuperTrend Indicator是一个在外汇交易中常用指标,它的设计者是Jason Robins ...

  • python编写器哪个好用?

    看我独角兽吗 互联网算法工程师 优质科技领域创作者 03-28 23:56  这个就有很多啦.使用Python IDE有很多好处,例如开发质量更好的代码,调试功能,证明笔记本为什么方便使用,使开发人员 ...