python 验证码校验_python接入百度文字识别获取登录校验码

pip install baidu-aip

背景:项目在做接口自动化测试,登录接口进行了改造,由之前的用户名+密码的方式改造为:用户名+密码+图片验证码

一:解决方案:

1.在项目配置文件中注释sso登录验证,让接口不进行token验证

调研:项目中服务拆分过多,需要在测试环境每个服务需要进行操作,而且部服务是外组合作,也有接口权限验证,还需跨组去修改服务,比较麻烦。而且作为测试环境,接口权限验证,token失效对于项目的验证也是测试的一部分,不太合适

2.网上其他还有提供说是让开发屏蔽图片验证,和万能验证码

调研:这种其实也可以,但是测试开发环境在代码中并不能保持一直,我们每次测试完成,都是获取测试环境下的分支进行打包发布,一不小心可能把改造过后的打包进去了

3.自动化测试中获取图片中的验证码,进行登录接口权限校验

调研:现在有比较多的公司比比如百度,提供一些图片文字识别的接口,可以获取到验证码,进行接口登录,我是用的就是百度的api

二:百度文字识别接入

1.首先注册并且登录百度ai平台账号,https://login.bce.baidu.com/

image.png

2.进入文字识别菜单下,创建你的项目应用,生成对应的key,接入到项目,并且开通你要使用的接口

image.png

image.png

备注:接口调用每天是有次数限制的,我使用的高精度版本的文字识别,识别的准确率更高,每天免费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就可以塞到请求参数中,进行接口测试了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值