随机验证码生成和获取——基于python tkinter、pytesseract实现
滴~ 今日打卡!
之前接触了一下tkinter,对GUI编程有点兴趣,所以就自己琢磨着写一个小程序(哈哈,小得不能再小的程序)。嗯,毕竟是为自动化测试而学的这些东西,所以还是做个跟自动化测试有关系的咯。上周博主的笔记中有提到过写自动化登录脚本时,遇到验证码的解决办法。
之前提到了四种解决方式,先来回顾一下:
(1)去掉验证码:把验证码代码注释掉
(2)设置万能码
(3)验证码识别技术(通过python-tesseract识别图片验证码)
(4)记录cookie,绕过验证码(在用户登录之前,通过add_cookie()方法将用户名密码写入浏览器cookie,再次访问系统登录连接将自动登录)
其中,第3种方法之前没有详细说到,今天就是使用tesserach来识别自己写的小程序中生成的随机验证码啦。
好的,代码之旅开始!
1.创建并初始化一个窗口
#Tk()是一个创建窗口的类
root = Tk()
#设置窗体大小
root.geometry("400x300")
#把root这个顶层窗体作为一个对象传入我们定义的window类
app = Window(root)
2.在窗体中绑定一些菜单和按钮,并给按钮添加一个command进行事务处理
edit=Menu(menu)
edit.add_command(label='获取验证码',command=self.readIdentifyingCode)
edit.add_command(label=u'生成英文验证码',command=self.showIdentifying_english)
menu.add_cascade(label='Edit',menu=edit)
3.写按钮的响应事务啦。这里有两个,一个是随机生成验证码,一个是扫描获取刚刚生成的验证码
(1)生成随机验证码
主要思路就是用random.randint()函数随机生成字符、背景色和text颜色。然后用ImageDraw.Draw逐点填充。生成一个image后对image做模糊化处理,就获得一个验证码图啦
分别写三个方法,随机生成字符、背景色及字体颜色:
return chr(random.randint(65,90)) #生成随机字符
return (random.randint(64,255),random.randint(64,255),random.randint(64,255)) #生成随机背景色/字体颜色
填充背景和生成随机4位验证码
draw=ImageDraw.Draw(image)
for x in range(width):
for y in range(heigth):
draw.point((x,y),fill=Window.rndColor())
for t in range(4):
draw.text((60*t+10,10),Window.rndChar(),font=font,fill=Window.rndColorTxt())
最后,对生成的图片做模糊处理
image=image.filter(ImageFilter.BLUR)
好的,运行脚本,得到效果图如下
接下来,获取验证码。基本思路就是获取验证码图片,然后做二值化、增强对比度等一系列操作,然后调用pytesseract.image_to_string()方法去获取
image=Image.open(u'E:\自动化测试脚本\code.jpg')
image1=image.convert('L') #图像加强,二值化
image2=ImageEnhance.Contrast(iamge1) #增强对比度
image2=sharpness.enhance(2.0)
code=pytesseract.image_to_string(image2)
这样就可以获取到刚刚生成的随机验证码啦