利用百度OCR實現驗證碼自動識別

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

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

 

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

/**
     * 獲取AccessToken
     * 百度開發
     * AppId:
     * APIKey:
     * SecretKey:
     *
     * @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", "xxxxxx");
        params.put("client_secret", "xxxxxx");
        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;
    }

 


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

  •  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字段失效
/**
     * 獲取識別驗證碼
     * @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編碼字符api

/**
     * 將本地圖片進行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/ipProxyPool
注:ocr圖片識別模塊在這個項目裏的一個工具類app

相關文章
相關標籤/搜索