验证码识别的免费 OCR

在做接口自动化以及爬虫的过程中,验证码一般是个很烦的存在,其实大厂们已经做好了一些 OCR 供使用,这里介绍一下百度 OCR 的使用方法。

注册并生成应用

1、注册一个百度智能云账号:http://ai.baidu.com/tech/ocr

2、创建一个自己的应用,分类随便选,名字随便起,重要的是需要这三个小东东:

App ID

Api Key

Secret Key

验证码识别的免费 OCR

3、注册完成后,在“应用列表”内可以找到自己能使用的  API ,截止这篇博客时间为止,还是可以使用过的。高精度的版本是每天恶意免费使用 500 次,普通版本是 5000 次,对于做自动化来讲,是绝对够了。

使用 OCR

SDK 方式

代码其实不用自己写,百度提供好了技术文档,有 py,java,php 等等

验证码识别的免费 OCR

地址:http://ai.baidu.com/docs#/OCR-Python-SDK/top验证码识别的免费 OCR

使用 sdk 的话,以 python 为例:直接 pip install baidu-aip 即可,就可以调用该模块

代码示例(图片在本地的形式):

#创建AipOcr
from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)


#文字识别高精度版本

""" 读取图片 """
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

image = get_file_content('example.jpg')

""" 调用通用文字识别(高精度版) """
client.basicAccurate(image);

""" 如果有可选参数 """
options = {}
options["detect_direction"] = "true"
options["probability"] = "true"

""" 带参数调用通用文字识别(高精度版) """
client.basicAccurate(image, options)

代码示例(图片为 url 的形式):

#创建AipOcr
from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)


#文字识别高精度版本


""" 读取图片 """
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

image = get_file_content('example.jpg')

""" 调用通用文字识别(含位置高精度版) """
client.accurate(image);

""" 如果有可选参数 """
options = {}
options["recognize_granularity"] = "big"
options["detect_direction"] = "true"
options["vertexes_location"] = "true"
options["probability"] = "true"

""" 带参数调用通用文字识别(含位置高精度版) """
client.accurate(image, options)

接口文档:https://ai.baidu.com/docs#/OCR-Python-SDK/top

API 方式

http://ai.baidu.com/docs#/OCR-API-AccurateBasic/top

如果你想在 jmeter/Postman 里面使用,当然也是可以的,这里的方式是将图片存到本地的方式,怎么通过 url 转还没发现。

主要是按通过鉴权,然后调用相关的 api 接口,就能返回验证码的数据,鉴权也是调用一个接口做关联即可。

接口文档如下:

接口描述

用户向服务请求识别某张图中的所有文字,相对于通用文字识别该产品精度更高,但是识别耗时会稍长。

请求说明

请求示例

HTTP 方法:POST

请求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic

URL参数:

参数
access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

Header如下:

参数
Content-Type application/x-www-form-urlencoded

Body中放置请求参数,参数详情如下:

请求参数

参数 是否必选 类型 可选值范围 说明
image true string - 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
detect_direction false string true、false 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
probability false string true、false 是否返回识别结果中每一行的置信度

请求代码示例

请参考通用文字识别(含位置信息版)的代码内容,并更换请求地址。

返回说明

返回参数

字段 是否必选 类型 说明
log_id uint64 唯一的log id,用于问题定位
direction int32 图像方向,当detect_direction=true时存在。
- -1:未定义,
- 0:正向,
- 1: 逆时针90度,
- 2:逆时针180度,
- 3:逆时针270度
words_result array() 识别结果数组
words_result_num uint32 识别结果数,表示words_result的元素个数
+words string 识别结果字符串
probability float 识别结果中每一行的置信度值,包含average:行置信度平均值,variance:行置信度方差,min:行置信度最小值

过程:

关于 api 的实现方式,我们用 jmeter 来举例子:

1、先调用鉴权接口,生成 access_token 关联到识别接口的 url 内;

验证码识别的免费 OCR

2、识别接口的 header 要指定:

Content-Type=application/x-www-form-urlencoded

验证码识别的免费 OCR

3、关于识别接口,需要的消息体的参数做以下转换:将图片转成 base 64 位编码;再将编码 urlencode

实现方式:

beansell 脚本——待补充

通过在线工具将图片上传(该步骤其实也可以 jmeter 实现,有时间找一个不坑的网站),生成 base64 位编码,如果生成的编码有头再将编码去掉头(有些网站在编码前面会加上 data:image/jpeg;base64, 这一部分是要去除的),再将剩余的部分放进 image 的 value 值里面,同时勾选上 "编码" ,这一步其实就是 urlencode 了,发送过去看返回结果:

{
    "log_id": 4143065736996133828,
    "words_result": [
        {
            "words": "4F4T9"
        }
    ],
    "words_result_num": 1
}

发现确实返回了要的结果,大功告成