aqi/utils/ali_ocr.go
2024-06-18 18:09:39 +08:00

140 lines
3.1 KiB
Go

package utils
import (
"encoding/json"
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
stream "github.com/alibabacloud-go/darabonba-stream/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"github.com/tidwall/gjson"
)
type AliOcr struct {
uploadBody []byte
apiParams *openapi.Params
client *openapi.Client
initError error
response any
apiResponse any
accessKey string
secret string
}
func NewAliOcr(accessKey, secret string) *AliOcr {
instance := &AliOcr{
accessKey: accessKey,
secret: secret,
}
//STS see:
//https://help.aliyun.com/document_detail/378661.html
client, err := instance.createClient(tea.String(accessKey), tea.String(secret))
if err != nil {
instance.initError = err
}
instance.client = client
return instance
}
func (ali *AliOcr) Request() error {
if ali.initError != nil {
return ali.initError
}
if ali.uploadBody == nil {
return fmt.Errorf("获取上传内容失败")
}
if ali.client == nil {
return fmt.Errorf("初始化阿里客户端失败")
}
if ali.apiParams == nil {
return fmt.Errorf("请求参数不能为空")
}
// runtime options
runtime := &util.RuntimeOptions{}
request := &openapi.OpenApiRequest{
Stream: stream.ReadFromBytes(ali.uploadBody),
}
// 复制代码运行请自行打印 API 的返回值
// 返回值为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。
res, err := ali.client.CallApi(ali.apiParams, request, runtime)
if err != nil {
return err
}
ali.apiResponse = res
apiJson, err := json.Marshal(res)
if err != nil {
return err
}
statusCode := gjson.Get(string(apiJson), "statusCode").Int()
if statusCode != 200 {
return fmt.Errorf("返回状态码不正确")
}
if ali.response != nil {
bodyData := gjson.Get(string(apiJson), "body.Data").String()
err = json.Unmarshal([]byte(bodyData), ali.response)
if err != nil {
return err
}
}
return nil
}
func (ali *AliOcr) WithResponse(s any) {
ali.response = s
}
func (ali *AliOcr) WithApiName(apiName string) {
//RecognizeDrivingLicense
ali.apiParams = &openapi.Params{
// 接口名称
Action: tea.String(apiName),
// 接口版本
Version: tea.String("2021-07-07"),
// 接口协议
Protocol: tea.String("HTTPS"),
// 接口 HTTP 方法
Method: tea.String("POST"),
AuthType: tea.String("AK"),
Style: tea.String("V3"),
// 接口 PATH
Pathname: tea.String("/"),
// 接口请求体内容格式
ReqBodyType: tea.String("json"),
// 接口响应体内容格式
BodyType: tea.String("json"),
}
}
func (ali *AliOcr) WithBody(body []byte) {
ali.uploadBody = body
}
func (ali *AliOcr) createClient(accessKeyId *string, accessKeySecret *string) (res *openapi.Client, err error) {
config := &openapi.Config{
// 必填,您的 AccessKey ID
AccessKeyId: accessKeyId,
// 必填,您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// 访问的域名
config.Endpoint = tea.String("ocr-api.cn-hangzhou.aliyuncs.com")
res = &openapi.Client{}
res, err = openapi.NewClient(config)
return res, err
}