简易随机验证码原理实现
新人刚来吾爱论坛,有什么发帖不对的请大家谅解一下这是我以前学习python中PIL模块写的,因为只是随便写的,就没有用面向对象来实现,只是简单的定义方法。
以前就对验证码的实现有点感兴趣,现在便简单说明一下本人的实现原理,可能与别人有些不同,希望有好想法的指出来。
首先创建一个画布的对象
宽和高为全局变量
然后定义获取随机颜色值方法
该方法返回元组对应RGB值,数值用随机整数产生
接着for循环遍历画布每一个点,产生随机颜色,使得画布出现颗粒感
然后算法实现产生随机0-9,a-z,A-Z中的一个值
根据ascill码对应65-90A-Z,97-122a-z,或者是0-9,利用随机数产生其中一个值,并返回。
接着定义字体列表
该方法返回列表中随机一个字体,当然也可以自己增删改列表中字体,ImageFont.truetype()方法获取的是本地字体,请先了解本地字体有哪些,再改动。当然如果有此处报错,可能是你本地字体与我电脑不同导致。
然后循环四次调用get_char()方法获得值,并添加到画布上
yzm变量记录四个值并控制台打印,或者可以写入文件之类的,用后以后验证。
验证码就基本实现完毕了,可以稍微加些直线增加辨认难度,防止验证码识别程序之类的轻易破解。
完成效果如图
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()
把代码格式化了下,看着舒服些。 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() 我添加的图片好像显示不出来?{:1_908:} 奥利给啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 有点看不懂 但是觉得非常高大上回贴保存 回头学习 还可以对文字旋转角度,进一步增加自动识别的难度。 halfone 发表于 2020-7-22 09:03
from PIL import Image,ImageDraw,ImageFont
import random
width,height=100, ...
啊!谢谢谢谢!新人不懂怎么格式化,能教一下我吗 jkj 发表于 2020-7-22 08:30
还可以对文字旋转角度,进一步增加自动识别的难度。
啊!很厉害!我没想到这样 哈_喽 发表于 2020-7-22 09:36
啊!谢谢谢谢!新人不懂怎么格式化,能教一下我吗
客气了,先选中工具栏中<>,然后把代码粘进来就行了。
页:
[1]
2