百度OCR识别

已知痛点

在web页面登录的时候,很多小伙伴都会遇到这个问题,登录的时候,需要输入图片中的验证码,验证通过之后才登录成功;往往一些操作,都是需要登录之后才能往下操作,这对我们进行接口测试(接口自动化、UI自动化)产生了极大的困扰

痛点解决方案

  1. 测试环境无所谓,直接叫开发改成万能验证码,或者测试环境关闭验证码验证
  2. 使用Python OCR库进行识别,如tesserocr
  3. 使用第三方 OCR服务(api),例如阿里云,百度云,腾讯云

方案分析

  1. 改一下代码或者配置文件即可屏蔽验证码,测试环境无所谓,线上根本不行!此方案可作为备用方案
  2. 通过tesserocr库去识别验证码,前期需要我们学习一下这个库相关的api,未知领域探索,可能需要花较长时间~此方案作为备用方案
  3. 调用第三方OCR服务,通常都会完善的API文档或者对应的SDK,第三方OCR识别成功率还可以,此方案推荐!

方案选择

我这边选择了方案3,第三方 OCR服务(百度云),最主要是集成SDK,下载SDK即可调用,而且还是免费,可以白嫖,每个月有一定的免费次数,足够你使用了!用这高大上的第三方OCR服务,领导听了之后,马上说牛逼!还能给你加KPI(手动狗头),虽然每个月拿着A还会扣钱,但是为了不被扣那么多嘛,必须得用! 推荐推荐推荐!

方案实现过程(rap2登录)

rap2登录时要输入验证码,我们通过百度OCR识别这个验证码,通过请求登录接口(账号+密码+验证码)模拟前端向后台发起请求,获取登录态后,再获取接口文档数据

OCR服务申请

百度智能云地址:login.bce.baidu.com/

  • 首先我们去到百度智能云里,在左边菜单栏的产品服务中搜索"文字识别",点击【领取免费资源】,将所有的免费资源领取,领取之后要半个小时之后才能生效。

  • 回到主面板,我们要进行创建应用,填写相关的信息即可创建成功,应用创建好之后会生成AppID、API Key和Secret Key,注意这3项不要告诉别人哦!

阅读官方文档

文字识别官方文档:cloud.baidu.com/doc/OCR/ind…

  • 点击应用名称,查看该应用详情,里面有个查看文档,我们先可以看看是怎么用的
  • 里面有两种方式,一种是API,另一种是SDK

识别demo

先来识别这张图片试试

看了一下官方的SDK demo,少量代码即可实现识别功能 先通过pip install baidu-aip下载SDK 按照官方demo测试一下

config = random.choice(OCR_CONFIG)
client = AipOcr(config['app_id'],config['api_key'],config['secret_key'])
options = {}
options["language_type"] = "ENG"
options["detect_language"] = "true"
with open(f"{IMG_PATH}/code.jpg", 'rb') as img:
    #调用百度OCR SDK,这里我用的高精度版,通过传入图像数据
    #你也可以用这个方法basicGeneralUrl,直接传入图片url
    code_data = client.basicAccurate(img.read())
    print(code_data)
打印输出:{'words_result': [{'words': ' HdAX'}], 'log_id': 1421303125069946686, 'words_result_num': 1}

这里有几个踩坑点,要注意下

  • image,图像数据,base64编码,base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
  • url,图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
  • 识别回来的验证码有可能跟图片的验证码不一致
  • 有可能无法识别,接口直接返回空数据
  • 有可能返回来的验证码结果是带有空格的

rap2登录实战

首先我们去到登录页面,用F12看看验证码是怎么生成的,发现验证码是通过一个图片url随机生成的。那我们直接使用这个方法basicGeneralUrl,直接传入图片url试试,发现跟本调不通,出现报错

url = 'https://rap2api.xxxx.com.cn/captcha?t=1626914290792'
code_data = client.basicGeneralUrl(url=url)
print(code_data)
打印输出: {'log_id': 1421464435711407280, 'error_msg': 'image format error', 'error_code': 216201}

通过查阅官方文档,得知是因为上传的图片格式错误,现阶段支持的图片格式为:PNG、JPG、JPEG、BMP,要进行转码~看到这里是不是慌了,先别慌,我们首先分析一下的图片到底是什么格式的;

打开图片URL,右键另存为,发现这个验证码图片格式是SVG!!!呀,这把我坑进去了!那我们现在要转换一下思路,只能使用basicAccurate这个方法,先下载SVG格式图片,再转码成JPG格式后传入图像数据。SVG转码成JPG,可以用这个库 svglib,相关的用法可以看教程:blog.csdn.net/weixin_3998… 完整代码实现

class Rap2Data(object):

    session = None

    @classmethod
    def rap_login(cls):
        config = random.choice(OCR_CONFIG)
        client = AipOcr(config['app_id'],config['api_key'],config['secret_key'])
        options = {}
        options["language_type"] = "ENG"
        options["detect_language"] = "true"
        cls.session = requests.session()
        img_content = cls.session.get(url=CODE_URL).content
        #下载验证码图片
        with open(f"{IMG_PATH}/code.svg", "wb") as f:
            f.write(img_content)
        # svg转jpg
        drawing = svg2rlg(f"{IMG_PATH}/code.svg")
        #保存jpg图片
        renderPM.drawToFile(drawing, f"{IMG_PATH}/code.jpg", fmt="JPG")
        with open(f"{IMG_PATH}/code.jpg", 'rb') as img:
            #调用百度OCR SDK
            code_data = client.basicAccurate(img.read())
            code_list = code_data.get('words_result', [])
            if code_list:
                #有时候结果存在空格
                code_str = code_list[0]['words'].replace(" ", "")
                RAP_ACCOUNT['captcha'] = code_str
                res = cls.session.post(url=RAP_LOGIN_URL, json=RAP_ACCOUNT)
                res_data = res.json()
                #验证是否登录成功,返回id即成功
                if res_data['data'].get('id', None):
                    return True

    @classmethod
    def rap_data(cls, id):
        #传入接口文档id,获取接口文档数据
        login_result = False
        #这里循环调用登录方法,判断是否登录成功,因为OCR识别并不是百分百成功的
        #这里之后要改一下,为了避免重复调用,用表存储cookies,cookies失效了,再重新获取
        while not login_result:
            login_result = cls.rap_login()
        params = {"id": id}
        res = cls.session.get(url=RAP_PROJECT_URL,params=params)
        return res.json()

rap2登录大概是这样子的,通过验证码URL生成cookies,如果你登录成功了,这个cookies就是你的令牌,有了这个令牌你就可以访问接口文档。上述代码中,直接使用了session对象,不用每次请求都传入cookies

后续扩展

  • 解析接口文档数据,生成Excel格式的接口自动化用例或者yaml格式接口自动化用例
  • 解析接口文档数据,生成jmeter脚本(jmx),再也不用一个个复制粘贴写脚本
  • 基于上述功能,做成前端页面,供其他人使用

总结

本期介绍了百度OCR的使用方法,更多使用场景可以结合自己的需求,下一期解析rap2接口文档数据生成Excel接口自动化用例~

题外话

发现痛点时,首先先想一下问题的根本,解决方案有哪些,分析一下解决方案的弊端、可行性和好处,痛点的解决方案可以先去公司的内部知识库看有没有类似的,再通过搜索引擎查找一下相关的方案,多与同行交流(水群、水论坛),抛出你的痛点,看看前辈们解决方案,再结合自身实际,选择适合自己的,避免重复造轮子~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值