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就可以塞到请求参数中,进行接口测试了

你可能感兴趣的:(python接入百度文字识别获取登录校验码)