在做接口自動化以及爬蟲的過程中,驗證碼一般是個很煩的存在,其實大廠們已經做好了一些 OCR 供使用,這里介紹一下百度 OCR 的使用方法。
注冊並生成應用
1、注冊一個百度智能雲賬號:http://ai.baidu.com/tech/ocr
2、創建一個自己的應用,分類隨便選,名字隨便起,重要的是需要這三個小東東:
App ID
Api Key
Secret Key
3、注冊完成后,在“應用列表”內可以找到自己能使用的 API ,截止這篇博客時間為止,還是可以使用過的。高精度的版本是每天惡意免費使用 500 次,普通版本是 5000 次,對於做自動化來講,是絕對夠了。
使用 OCR
SDK 方式
代碼其實不用自己寫,百度提供好了技術文檔,有 py,java,php 等等
地址:http://ai.baidu.com/docs#/OCR-Python-SDK/top
使用 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 內;
2、識別接口的 header 要指定:
Content-Type=application/x-www-form-urlencoded
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 }
發現確實返回了要的結果,大功告成