哈_喽 发表于 2020-7-21 23:31

简易随机验证码原理实现

新人刚来吾爱论坛,有什么发帖不对的请大家谅解一下
这是我以前学习python中PIL模块写的,因为只是随便写的,就没有用面向对象来实现,只是简单的定义方法。
以前就对验证码的实现有点感兴趣,现在便简单说明一下本人的实现原理,可能与别人有些不同,希望有好想法的指出来。
首先创建一个画布的对象

             宽和高为全局变量


然后定义获取随机颜色值方法


该方法返回元组对应RGB值,数值用随机整数产生


接着for循环遍历画布每一个点,产生随机颜色,使得画布出现颗粒感




然后算法实现产生随机0-9,a-z,A-Z中的一个值


根据ascill码对应65-90A-Z,97-122a-z,或者是0-9,利用随机数产生其中一个值,并返回。


接着定义字体列表


该方法返回列表中随机一个字体,当然也可以自己增删改列表中字体,ImageFont.truetype()方法获取的是本地字体,请先了解本地字体有哪些,再改动。当然如果有此处报错,可能是你本地字体与我电脑不同导致。


然后循环四次调用get_char()方法获得值,并添加到画布上


yzm变量记录四个值并控制台打印,或者可以写入文件之类的,用后以后验证。


验证码就基本实现完毕了,可以稍微加些直线增加辨认难度,防止验证码识别程序之类的轻易破解。






完成效果如图











halfone 发表于 2020-7-22 09:03

from PIL import Image,ImageDraw,ImageFont
import random
width,height=100,100

bg=Image.new('RGB',(width,height),'white')
obj=ImageDraw.Draw(bg)
def get_color():
    return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
for x in range(width):
    for y in range(height):
      obj.point((x,y),fill=get_color())
def get_char():
    if random.randint(0,1):
      if random.randint(0,1):
            return chr(random.randint(65,90))
      else:
            return chr(random.randint(97,122))
    else:
      return str(random.randint(0,9))
def get_font():
    return random.choice()
yzm=''
for i in range(4):
    tmp=get_char()
    yzm=yzm+tmp
    obj.text((10+i*20,40),tmp,font=get_font(),fill='black')
print(yzm)
for i in range(8):
    obj.line((random.randint(0,width),random.randint(0,height),random.randint(0,width),random.randint(0,height)),width=1,fill='green')
bg.show()

把代码格式化了下,看着舒服些。

哈_喽 发表于 2020-7-21 23:36

from PIL import Image,ImageDraw,ImageFont
import random
width,height=100,100

bg=Image.new('RGB',(width,height),'white')
obj=ImageDraw.Draw(bg)
def get_color():
    return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
for x in range(width):
    for y in range(height):
      obj.point((x,y),fill=get_color())
def get_char():
    if random.randint(0,1):
      if random.randint(0,1):
            return chr(random.randint(65,90))
      else:
            return chr(random.randint(97,122))
    else:
      return str(random.randint(0,9))
def get_font():
    return random.choice()
yzm=''
for i in range(4):
    tmp=get_char()
    yzm=yzm+tmp
    obj.text((10+i*20,40),tmp,font=get_font(),fill='black')
print(yzm)
for i in range(8):
    obj.line((random.randint(0,width),random.randint(0,height),random.randint(0,width),random.randint(0,height)),width=1,fill='green')
bg.show()

哈_喽 发表于 2020-7-21 23:38

我添加的图片好像显示不出来?{:1_908:}

meethigher 发表于 2020-7-22 07:36

奥利给啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

mac860 发表于 2020-7-22 07:56

有点看不懂 但是觉得非常高大上回贴保存 回头学习

jkj 发表于 2020-7-22 08:30

还可以对文字旋转角度,进一步增加自动识别的难度。

哈_喽 发表于 2020-7-22 09:36

halfone 发表于 2020-7-22 09:03
from PIL import Image,ImageDraw,ImageFont
import random
width,height=100, ...

啊!谢谢谢谢!新人不懂怎么格式化,能教一下我吗

哈_喽 发表于 2020-7-22 09:42

jkj 发表于 2020-7-22 08:30
还可以对文字旋转角度,进一步增加自动识别的难度。

啊!很厉害!我没想到这样

halfone 发表于 2020-7-22 09:55

哈_喽 发表于 2020-7-22 09:36
啊!谢谢谢谢!新人不懂怎么格式化,能教一下我吗

客气了,先选中工具栏中<>,然后把代码粘进来就行了。
页: [1] 2
查看完整版本: 简易随机验证码原理实现