80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package service
|
||
|
||
import (
|
||
"encoding/base64"
|
||
"encoding/json"
|
||
"fmt"
|
||
"github.com/tidwall/gjson"
|
||
"io/ioutil"
|
||
"net/http"
|
||
"strings"
|
||
)
|
||
|
||
type BaiduOCR struct {
|
||
API_KEY, SECRET_KEY string
|
||
}
|
||
|
||
func (this *BaiduOCR) OCR(imgBase64 string) (string, error) {
|
||
url := "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + this.GetAccessToken()
|
||
|
||
// image 可以通过 GetFileContentAsBase64("C:\fakepath\微信图片_20240430171848.jpg") 方法获取,如需转码请使用 url.QueryEscape()
|
||
payload := strings.NewReader("image=" + imgBase64)
|
||
client := &http.Client{}
|
||
req, err := http.NewRequest("POST", url, payload)
|
||
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
|
||
req.Header.Add("Accept", "application/json")
|
||
|
||
res, err := client.Do(req)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
defer res.Body.Close()
|
||
|
||
body, err := ioutil.ReadAll(res.Body)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
words := gjson.Get(string(body), "words_result").Array()
|
||
result := ""
|
||
for _, word := range words {
|
||
result += word.Get("words").String()
|
||
}
|
||
return result, nil
|
||
}
|
||
func (this *BaiduOCR) GetAccessToken() string {
|
||
url := "https://aip.baidubce.com/oauth/2.0/token"
|
||
postData := fmt.Sprintf("grant_type=client_credentials&client_id=%s&client_secret=%s", this.API_KEY, this.SECRET_KEY)
|
||
resp, err := http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(postData))
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
return ""
|
||
}
|
||
defer resp.Body.Close()
|
||
body, err := ioutil.ReadAll(resp.Body)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
return ""
|
||
}
|
||
accessTokenObj := map[string]any{}
|
||
_ = json.Unmarshal([]byte(body), &accessTokenObj)
|
||
return accessTokenObj["access_token"].(string)
|
||
}
|
||
|
||
/**
|
||
* 获取文件base64编码
|
||
* @param string path 文件路径
|
||
* @return string base64编码信息,不带文件头
|
||
*/
|
||
func GetFileContentAsBase64(path string) string {
|
||
srcByte, err := ioutil.ReadFile(path)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
return ""
|
||
}
|
||
return base64.StdEncoding.EncodeToString(srcByte)
|
||
}
|