pip install baidu-aip
背景:项目在做接口自动化测试,登录接口进行了改造,由之前的用户名+密码的方式改造为:用户名+密码+图片验证码
一:解决方案:
1.在项目配置文件中注释sso登录验证,让接口不进行token验证
调研:项目中服务拆分过多,需要在测试环境每个服务需要进行操作,而且部服务是外组合作,也有接口权限验证,还需跨组去修改服务,比较麻烦。而且作为测试环境,接口权限验证,token失效对于项目的验证也是测试的一部分,不太合适
2.网上其他还有提供说是让开发屏蔽图片验证,和万能验证码
调研:这种其实也可以,但是测试开发环境在代码中并不能保持一直,我们每次测试完成,都是获取测试环境下的分支进行打包发布,一不小心可能把改造过后的打包进去了
3.自动化测试中获取图片中的验证码,进行登录接口权限校验
调研:现在有比较多的公司比比如百度,提供一些图片文字识别的接口,可以获取到验证码,进行接口登录,我是用的就是百度的api
二:百度文字识别接入
1.首先注册并且登录百度ai平台账号,https://login.bce.baidu.com/
2.进入文字识别菜单下,创建你的项目应用,生成对应的key,接入到项目,并且开通你要使用的接口
备注:接口调用每天是有次数限制的,我使用的高精度版本的文字识别,识别的准确率更高,每天免费500次,跑一次接口项目只用获取一次,500够用了
3.在项目中调用
- 安装百度api依赖:pip install baidu_aip,并且导入到文件内:from aip import AipOcr
- 调用项目中加载图片的接口,获取图片和图片的id,并且把图片保存到本地
def getImage():
res = Request('debug').get_request('你的图片获取地址', None, None)
data = res['data']
image = data['image'].split(',')
#获取图片的imageId,这个作为参数放到登录接口
imageId = data['imageId']
pic_url = image[1]
#base64转码图片
imagedata = base64.b64decode(pic_url)
#保存图片都项目文件夹下Pic/下,每次命名为code.png
file = open('../Pic/code.png', "wb")
file.write(imagedata)
file.close()
#方法返回一个imageId
return imageId
- 调用百度接口,识别保存的验证码
def getNumFromImage():
# encoding:utf-8
""" APPID"""
APP_ID = '你在百度平台应用的id'
API_KEY = '应用的key'
SECRET_KEY = '应用的SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# Read Image
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
#调用的百度的高精度识别文字接口,每次识别Pic下的code.png
result1 = client.basicAccurate(get_file_content('../Pic/code.png'))
#处理返回数据,最终只得到图片上的验证码
words = result1['words_result']
print(str(words[0]['words']))
codeWord = str(words[0]['words'])
return codeWord
- 登录接口获取token
def login():
num = 0
#登录
while num < 5:
#拿到图片id
imageId = getImage()
#拿到图片验证码
imageCode = getNumFromImage()
#登录参数用户名,密码,图片验证码,对应的图片id
loginData = {"account": "your account", "imageCode": imageCode, "imageId": imageId,
"password": "your pwd"}
res = Request('debug').post_request('your login api', loginData, None)
#处理登录接口的返回
tokenData = res['body']['data']
#接口返回的data不为空说明登录成功了,拿到了登录信息
if tokenData is not None:
token = tokenData['token']
break
#处理验证码错误的情况下,登录失败拿不到token,再进行获取也验证,控制循环5次
else:
num = num + 1
if (num == 4):
print('调用图片验证码5次,依然没有找到token')
return token
备注:这个接口识别四位数的验证码准确度比较高,但是还是会有错的情况,没有登录成功,继续循环,在我测试下,基本上5次循环一定会登录成功。
- 拿到token就可以塞到请求参数中,进行接口测试了