kefu/wechathook/service/baidu_ocr.go

80 lines
2.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}