百度圖片識別orc實現普通驗證碼識別

在爬取網站的時候都遇到過驗證碼,那麼咱們有什麼方法讓程序自動的識別驗證碼呢?其實網上已有不少打碼平臺,可是這些都是須要money。但對於僅僅爬取點數據而接入打碼平臺實屬浪費。因此百度免費orc正好能夠利用。(天天500次免費)git

一、註冊百度帳號、百度雲管理中心建立應用、生成AppKey、SecretKey(程序調用接口是要生成access_token)
圖片描述圖片描述github

二、利用AppKey、SecretKey生成access_token
向受權服務地址https://aip.baidubce.com/oaut...發送請求(推薦使用POST)並在URL中帶上如下參數:
grant_type: 必須參數,固定爲client_credentials;
client_id: 必須參數,應用的API Key;
client_secret: 必須參數,應用的Secret Key
代碼以下:json

/**
 1. 獲取AccessToken
 2. APIKey:
 3. SecretKey:
 4. @return
 */
public static String getAccessToken() {
    String accessToken = "";
    HttpRequestData httpRequestData = new HttpRequestData();
    HashMap<String, String> params = new HashMap<>();
    params.put("grant_type", "client_credentials");
    params.put("client_id", "你的APIKey");
    params.put("client_secret", "SecretKey");
    httpRequestData.setRequestMethod("GET");
    httpRequestData.setParams(params);
    httpRequestData.setRequestUrl("https://aip.baidubce.com/oauth/2.0/token");
    HttpResponse response = HttpClientUtils.execute(httpRequestData);
    String json = "";
    try {
        json = IOUtils.toString(response.getEntity().getContent());
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (response.getStatusLine().getStatusCode() == 200) {
        JSONObject jsonObject = JSONObject.parseObject(json);
        if (jsonObject != null && !jsonObject.isEmpty()) {
            accessToken = jsonObject.getString("access_token");
        }
    }
    return accessToken;
}

三、請求百度orc通用文字識別API(下面以百度通用識別api識別爲例)
請求API的URL https://aip.baidubce.com/rest...
請求方法 POST
請求URL參數 access_token
請求頭 (Header) Content-Type application/x-www-form-urlencoded
Body中放置請求參數,主要參數詳情以下:api

  • image : 圖像數據,base64編碼,要求base64編碼後大小不超過4M,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式,當image字段存在時url字段失效數組

  • url : 圖片完整URL,URL長度不超過1024字節,URL對應的圖片base64編碼後大小不超過4M,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式,當image字段存在時url字段失效app

/**
 * 獲取識別驗證碼
 * @param imageUrl
 * @return
 */
public static String OCRVCode(String imageUrl){
    String VCode = "";

    if (StringUtils.isBlank(ACCESS_TOKEN)) {
        logger.error("accessToken爲空");
        return VCode;
    }
    OCRUrl = OCRUrl + "?access_token=" + ACCESS_TOKEN;

    HashMap<String, String> headers = new HashMap<>();
    headers.put("Content-Type", "application/x-www-form-urlencoded");

    HashMap<String, String> params = new HashMap<>();
    imageUrl = ImageBase64ToStringUtils.imageToStringByBase64(imageUrl);
    params.put("image", imageUrl);

    HttpRequestData httpRequestData = new HttpRequestData();
    httpRequestData.setHeaders(headers);
    httpRequestData.setRequestMethod("post");
    httpRequestData.setParams(params);
    httpRequestData.setRequestUrl(OCRUrl);
    HttpResponse response = HttpClientUtils.execute(httpRequestData);
    String json = "";
    if (response.getStatusLine().getStatusCode() == 200) {
        try {
            json = IOUtils.toString(response.getEntity().getContent());
            JSONObject jsonObject = JSONObject.parseObject(json);
            JSONArray wordsResult = jsonObject.getJSONArray("words_result");
            VCode = wordsResult.getJSONObject(0).getString("words");
        } catch (IOException e) {
            logger.error("請求識別失敗!", e);
        }
    }
    return VCode;
}

對圖片進行base64編碼字符工具

/**
 * 將本地圖片進行Base64位編碼
 * @param imageFile
 * @return
 */
public static String encodeImgageToBase64(String imageFile) {
    // 其進行Base64編碼處理
    byte[] data = null;
    // 讀取圖片字節數組
    try {
        InputStream in = new FileInputStream(imageFile);
        data = new byte[in.available()];
        in.read(data);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 對字節數組Base64編碼
    return Base64Util.encode(data);
}
四、返回結果以json方式返回
{
    "log_id": 2471272194,
        "words_result_num": 2,
        "words_result": 
[
    {"words": " TSINGTAO"},
    {"words": "青島睥酒"}
]
}

項目github地址:https://github.com/xwlmdd/ipP...
注:orc圖片識別模塊在這個項目裏的一個工具類post

個人公衆號,喜歡的朋友能夠關注哦
圖片描述網站

相關文章
相關標籤/搜索