aliyun.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package services
  2. import (
  3. "crypto/tls"
  4. "encoding/base64"
  5. "encoding/json"
  6. "fmt"
  7. openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
  8. ocr20191230 "github.com/alibabacloud-go/ocr-20191230/v3/client"
  9. util "github.com/alibabacloud-go/tea-utils/v2/service"
  10. "github.com/alibabacloud-go/tea/tea"
  11. "hongze/hz_crm_api/utils"
  12. "io/ioutil"
  13. "net/http"
  14. "strings"
  15. rhttp "github.com/rdlucklib/rdluck_tools/http"
  16. )
  17. const (
  18. AlAppKey = "203889624"
  19. AlAppSecret = "voampGGl0yGNx5xA1sZdmZlV2EiBct2P"
  20. AlAppCode = "22553c4ba74545568aba70ac6cfd441d"
  21. )
  22. type OcrItem struct {
  23. Image string `json:"image"`
  24. }
  25. type OcrResult struct {
  26. Addr []string `json:"addr"`
  27. Company []string `json:"company"`
  28. Success bool `json:"success"`
  29. TelCell []string `json:"tel_cell"`
  30. Departments []string `json:"departments"`
  31. Name string `json:"name"`
  32. OfficePhoneNumbers []string `json:"office_phone_numbers"`
  33. Titles []string `json:"titles"`
  34. }
  35. // /ocr_business_card.json
  36. func AliyunBusinessCard(imgUrl string) (result *OcrResult, err error) {
  37. postUrl := `https://dm-57.data.aliyun.com/rest/160601/ocr/ocr_business_card.json`
  38. imgBody, err := rhttp.Get(imgUrl)
  39. if err != nil {
  40. return
  41. }
  42. imageBase64 := base64.StdEncoding.EncodeToString(imgBody)
  43. item := new(OcrItem)
  44. item.Image = imageBase64
  45. jsonBody, err := json.Marshal(item)
  46. if err != nil {
  47. fmt.Println("json.Marshal Err:" + err.Error())
  48. return
  49. }
  50. tr := &http.Transport{
  51. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  52. }
  53. client := &http.Client{Transport: tr}
  54. req, err := http.NewRequest("POST", postUrl, strings.NewReader(string(jsonBody)))
  55. if err != nil {
  56. fmt.Println("err:" + err.Error())
  57. return
  58. }
  59. req.Header.Set("Content-Type", "application/json")
  60. req.Header.Set("Authorization", "APPCODE "+AlAppCode)
  61. resp, err := client.Do(req)
  62. if err != nil {
  63. fmt.Println("client.Do Err:" + err.Error())
  64. return
  65. }
  66. fmt.Println("resp")
  67. fmt.Println(resp)
  68. defer resp.Body.Close()
  69. body, err := ioutil.ReadAll(resp.Body)
  70. if err != nil {
  71. fmt.Println("err:" + err.Error())
  72. return
  73. }
  74. fmt.Println("body:", string(body))
  75. utils.FileLog.Info(fmt.Sprintf("aliyun card;imgUrl:%s; Body:%s", imgUrl, string(body)))
  76. err = json.Unmarshal(body, &result)
  77. return
  78. }
  79. // AliyunBusinessCardOcr 阿里云的ocr识别
  80. func AliyunBusinessCardOcr(imgUrl string) (result OcrResult, err error) {
  81. config := &openapi.Config{
  82. // 2、"YOUR_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_SECRET" 的生成请参考https://help.aliyun.com/document_detail/175144.html
  83. // 如果您是用的子账号AccessKey,还需要为子账号授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
  84. // 您的 AccessKey ID
  85. AccessKeyId: tea.String(utils.AccessKeyId),
  86. // 您的 AccessKey Secret
  87. AccessKeySecret: tea.String(utils.AccessKeySecret),
  88. }
  89. // 3、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
  90. config.Endpoint = tea.String("ocr.cn-shanghai.aliyuncs.com")
  91. // 4、这里只是以ocr为例,其他能力请使用相应类目的包
  92. client, err := ocr20191230.NewClient(config)
  93. if err != nil {
  94. return
  95. }
  96. httpClient := http.Client{}
  97. file, _ := httpClient.Get(imgUrl)
  98. // 5、这里只是以ocr的RecognizeBankCard为例,其他能力请使用相应类目的包和类
  99. recognizeBusinessCardAdvanceRequest := &ocr20191230.RecognizeBusinessCardAdvanceRequest{
  100. ImageURLObject: file.Body,
  101. }
  102. runtime := &util.RuntimeOptions{}
  103. // 6、这里只是以ocr的RecognizeBankCard为例,其他能力请使用相应类目的包和类,注意RecognizeBankCardWithOptions也需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为SegmentCommonImageWithOptions。
  104. recognizeBusinessCardResponse, err := client.RecognizeBusinessCardAdvance(recognizeBusinessCardAdvanceRequest, runtime)
  105. if err != nil {
  106. // 获取整体报错信息
  107. //fmt.Println(err.Error())
  108. utils.FileLog.Info(fmt.Sprintf("aliyun card;imgUrl:%s; err:%s", imgUrl, err))
  109. return
  110. }
  111. // 获取整体结果
  112. //fmt.Println(recognizeBusinessCardResponse)
  113. //// 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
  114. //fmt.Println(recognizeBusinessCardResponse.Body.Data.Name)
  115. // 地址
  116. for _, v := range recognizeBusinessCardResponse.Body.Data.Addresses {
  117. result.Addr = append(result.Addr, *v)
  118. }
  119. // company
  120. for _, v := range recognizeBusinessCardResponse.Body.Data.Companies {
  121. result.Company = append(result.Company, *v)
  122. }
  123. // tel_cell
  124. for _, v := range recognizeBusinessCardResponse.Body.Data.CellPhoneNumbers {
  125. result.TelCell = append(result.TelCell, *v)
  126. }
  127. // Departments
  128. for _, v := range recognizeBusinessCardResponse.Body.Data.Departments {
  129. result.Departments = append(result.Departments, *v)
  130. }
  131. // OfficePhoneNumbers
  132. for _, v := range recognizeBusinessCardResponse.Body.Data.OfficePhoneNumbers {
  133. result.OfficePhoneNumbers = append(result.OfficePhoneNumbers, *v)
  134. }
  135. // Titles
  136. for _, v := range recognizeBusinessCardResponse.Body.Data.Titles {
  137. result.Titles = append(result.Titles, *v)
  138. }
  139. if recognizeBusinessCardResponse.Body.Data.Name != nil {
  140. result.Name = *recognizeBusinessCardResponse.Body.Data.Name
  141. }
  142. result.Success = true
  143. return
  144. }