mirror of
https://github.com/wonli/aqi.git
synced 2024-06-28 09:57:05 +08:00
140 lines
3.1 KiB
Go
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
|
|
}
|