44

Python制作图片验证码?也就三行代码罢了

 3 years ago
source link: https://mp.weixin.qq.com/s/jyV56Ih2Oic6rGg5T25Fpg
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

            ↑ "奶糖猫"一个值得星标的公众号

                         640?wx_fmt=jpeg

         本文约1800字,阅读大概需要7分钟

现在验证码的种类真的是越来越多,短信验证码、语音验证码、图片验证码、滑块验证码 ... 我们在 PC 的网页端或者手机上的 app 进行登录或者注册时,应该总会遇见图片验证码,比如下面这类:
640?wx_fmt=png上面这些图片验证码都是通过Python制作出来的,方法有很多,但主要都是依赖Python强大的第三方库,下面就介绍一下制作图片验证码的三种方法,难度由高到低。

Pillow库

Pillow是一个非常强大的图片处理模块,其中Image是Pillow中最为重要的类,实现了Pillow中大部分的功能,这个类的主要用来表示图片对象。生成图片验证码需要下面这四个类:

  • 1、Image:含有图片对象主体上的一些应用
  • 2、ImageDraw:画笔,用来向图片上添加验证码
  • 3、ImageFont:设置验证码的字体形式
  • 4、ImageFilter:对图片验证码进行模糊处理

先贴上生成验证码的代码:

from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random,string
#获取随机4个字符组合
def getRandomChar():
    chr_all = string.ascii_letters+string.digits
    chr_4 = ''.join(random.sample(chr_all,4))
    return chr_4
#获取随机颜色
def getRandomColor(low,high):
    return (random.randint(low,high),random.randint(low,high),random.randint(low,high))
#制作验证码图片
def getPicture():
    width,height = 180,60
    #创建空白画布
    image = Image.new('RGB',(width,height),getRandomColor(20,100))
    #验证码的字体
    font = ImageFont.truetype('C:/Windows/fonts/stxinwei.ttf',40)
    #创建画笔
    draw = ImageDraw.Draw(image)
    #获取验证码
    char_4 = getRandomChar()
    #向画布上填写验证码
    for i in range(4):
        draw.text((40*i+10,0),char_4[i],font = font,fill=getRandomColor(100,200))
    #绘制干扰点
    for x in range(random.randint(200,600)):
        x = random.randint(1,width-1)
        y = random.randint(1,height-1)
        draw.point((x,y),fill=getRandomColor(50,150))
    #模糊处理
    image = image.filter(ImageFilter.BLUR)
    image.save('./%s.jpg' % char_4)

我们都知道图片验证码一般都是以一张图片为底,有不同的背景颜色,然后上面印有4个不同的字符,可能是数字、可能是字母、 也可能是这两种的组合,并且这些字符看起来不会很清晰。上面代码中的三个函数就分别实现生成图片验证码的某个需求,首先 getRandomChar 函数就用来生成4个随机字符的组合,其中 chr_all 包含了大写字母、小写字母和数字:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

random.sample 方法就是在这些字符的组合中随机挑出若干个(这里我们选的是4个)生成一个新的列表。getRandomColor 函数则是用来设置RGB三个阈值,RGB是一种最常用的颜色系统,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,每个通道的阈值都在[0,255]之间。getPicture 函数用来制作图片验证码,具体代码作用都有注释,这里建议字体的颜色与背景颜色的阈值不要重叠,容易出现某个字符可见度很低的情况,这种方式生成的图片验证码是这种形式的:

640?wx_fmt=jpeg

captcha库

如果你像我一样好奇这个库的中文意思可以有道一下,你会发现它的中文含义就是验证码,也就是说这个库可能就是用来专门制作验证码的:

640?wx_fmt=png

你可以先利用清华镜像安装captcha库:

pip install captcha -i https://pypi.tuna.tsinghua.edu.cn/simple

利用captcha库生成图片验证码的代码:

from captcha.image import ImageCaptcha
import random,string

chr_all = string.ascii_letters + string.digits
chr_4 = ''.join(random.sample(chr_all, 4))
image = ImageCaptcha().generate_image(chr_4)
image.save('./%s.jpg' % chr_4)

可以看到我们需要的操作就是将随机生成的4个字符组合传入 ImageCaptcha 类下的 generate_image 方法中,然后他就会自动生成一个图片验证码,形式如下:

640?wx_fmt=jpeg

gvcode库

最后一种方法是最简单的,简单到仅需要3行代码就可以实现上面的操作,首先我们也需要安装这个库,注意利用pip安装时要用下面名字:

pip install graphic-verification-code -i https://pypi.tuna.tsinghua.edu.cn/simple

然后贴上生成图片验证码的代码:

import gvcode
s,v = gvcode.generate()
s.save('./%s.jpg' % v)

你没看错~这三行代码就可以生成一张图片验证码,其中还有一行用来导包,也就说有效代码仅两行!

print(type(s))
print(v)
print(type(v))

其中 s 就是最终生成的图片验证码,v 就是图片验证码上的4个字符,也就是字符串类型,打印一下:

640?wx_fmt=png

最后这种方法生成的图片验证码形式如下:

640?wx_fmt=jpeg

这三种方法生成图片验证码各有利弊,第一种方法虽说复杂,但是可以DIY呀,第二种方法生成的图片验证码应该是与我们平时接触的最相似,第三种方法虽说操作最为简单,但是生成的图片验证码有那么一点点看不清。也算是比较有趣的小知识,伙伴们可以去自己试一下啦!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK