pip install baidu-aip
背景:項(xiàng)目在做接口自動(dòng)化測(cè)試,登錄接口進(jìn)行了改造嗜湃,由之前的用戶名+密碼的方式改造為:用戶名+密碼+圖片驗(yàn)證碼
一:解決方案:
1.在項(xiàng)目配置文件中注釋sso登錄驗(yàn)證奈应,讓接口不進(jìn)行token驗(yàn)證
調(diào)研:項(xiàng)目中服務(wù)拆分過(guò)多,需要在測(cè)試環(huán)境每個(gè)服務(wù)需要進(jìn)行操作购披,而且部服務(wù)是外組合作杖挣,也有接口權(quán)限驗(yàn)證,還需跨組去修改服務(wù)刚陡,比較麻煩惩妇。而且作為測(cè)試環(huán)境,接口權(quán)限驗(yàn)證筐乳,token失效對(duì)于項(xiàng)目的驗(yàn)證也是測(cè)試的一部分歌殃,不太合適
2.網(wǎng)上其他還有提供說(shuō)是讓開(kāi)發(fā)屏蔽圖片驗(yàn)證,和萬(wàn)能驗(yàn)證碼
調(diào)研:這種其實(shí)也可以蝙云,但是測(cè)試開(kāi)發(fā)環(huán)境在代碼中并不能保持一直氓皱,我們每次測(cè)試完成,都是獲取測(cè)試環(huán)境下的分支進(jìn)行打包發(fā)布,一不小心可能把改造過(guò)后的打包進(jìn)去了
3.自動(dòng)化測(cè)試中獲取圖片中的驗(yàn)證碼波材,進(jìn)行登錄接口權(quán)限校驗(yàn)
調(diào)研:現(xiàn)在有比較多的公司比比如百度股淡,提供一些圖片文字識(shí)別的接口,可以獲取到驗(yàn)證碼廷区,進(jìn)行接口登錄唯灵,我是用的就是百度的api
二:百度文字識(shí)別接入
1.首先注冊(cè)并且登錄百度ai平臺(tái)賬號(hào),https://login.bce.baidu.com/
2.進(jìn)入文字識(shí)別菜單下隙轻,創(chuàng)建你的項(xiàng)目應(yīng)用埠帕,生成對(duì)應(yīng)的key,接入到項(xiàng)目玖绿,并且開(kāi)通你要使用的接口
備注:接口調(diào)用每天是有次數(shù)限制的敛瓷,我使用的高精度版本的文字識(shí)別,識(shí)別的準(zhǔn)確率更高镰矿,每天免費(fèi)500次琐驴,跑一次接口項(xiàng)目只用獲取一次,500夠用了
3.在項(xiàng)目中調(diào)用
- 安裝百度api依賴:pip install baidu_aip秤标,并且導(dǎo)入到文件內(nèi):from aip import AipOcr
- 調(diào)用項(xiàng)目中加載圖片的接口绝淡,獲取圖片和圖片的id,并且把圖片保存到本地
def getImage():
res = Request('debug').get_request('你的圖片獲取地址', None, None)
data = res['data']
image = data['image'].split(',')
#獲取圖片的imageId,這個(gè)作為參數(shù)放到登錄接口
imageId = data['imageId']
pic_url = image[1]
#base64轉(zhuǎn)碼圖片
imagedata = base64.b64decode(pic_url)
#保存圖片都項(xiàng)目文件夾下Pic/下苍姜,每次命名為code.png
file = open('../Pic/code.png', "wb")
file.write(imagedata)
file.close()
#方法返回一個(gè)imageId
return imageId
- 調(diào)用百度接口牢酵,識(shí)別保存的驗(yàn)證碼
def getNumFromImage():
# encoding:utf-8
""" APPID"""
APP_ID = '你在百度平臺(tái)應(yīng)用的id'
API_KEY = '應(yīng)用的key'
SECRET_KEY = '應(yīng)用的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()
#調(diào)用的百度的高精度識(shí)別文字接口,每次識(shí)別Pic下的code.png
result1 = client.basicAccurate(get_file_content('../Pic/code.png'))
#處理返回?cái)?shù)據(jù)衙猪,最終只得到圖片上的驗(yàn)證碼
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()
#拿到圖片驗(yàn)證碼
imageCode = getNumFromImage()
#登錄參數(shù)用戶名馍乙,密碼,圖片驗(yàn)證碼垫释,對(duì)應(yīng)的圖片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不為空說(shuō)明登錄成功了丝格,拿到了登錄信息
if tokenData is not None:
token = tokenData['token']
break
#處理驗(yàn)證碼錯(cuò)誤的情況下,登錄失敗拿不到token棵譬,再進(jìn)行獲取也驗(yàn)證显蝌,控制循環(huán)5次
else:
num = num + 1
if (num == 4):
print('調(diào)用圖片驗(yàn)證碼5次,依然沒(méi)有找到token')
return token
備注:這個(gè)接口識(shí)別四位數(shù)的驗(yàn)證碼準(zhǔn)確度比較高订咸,但是還是會(huì)有錯(cuò)的情況曼尊,沒(méi)有登錄成功,繼續(xù)循環(huán)脏嚷,在我測(cè)試下骆撇,基本上5次循環(huán)一定會(huì)登錄成功。
- 拿到token就可以塞到請(qǐng)求參數(shù)中父叙,進(jìn)行接口測(cè)試了