image_record.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package levelMonitor
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "go.uber.org/zap"
  8. "gorm.io/gorm"
  9. "io/ioutil"
  10. "log-server/global"
  11. "log-server/model/common/request"
  12. "log-server/model/levelMonitor"
  13. levelRequest "log-server/model/levelMonitor/request"
  14. "net/http"
  15. "net/url"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. type ImageRecordService struct {
  21. }
  22. //创建图片记录
  23. func (s *ImageRecordService) CreateImageRecord(record levelMonitor.ImageRecord) (err error) {
  24. //获取今日日期
  25. date := time.Now().Format("2006-01-02")
  26. var entity levelMonitor.ImageRecord
  27. //创建日期赋值
  28. record.CreateDate = date
  29. record.Status = 2
  30. //查找数据库是否存在此账号此游戏今日记录
  31. err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("task_id = ? and account = ? and create_date = ?", record.TaskId, record.Account, date).First(&entity).Error
  32. if !errors.Is(err, gorm.ErrRecordNotFound) {
  33. return errors.New("此记录已存在,请勿重复添加")
  34. }
  35. err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Omit("create_time", "update_time").Create(&record).Error
  36. if err != nil {
  37. return err
  38. }
  39. go s.ImageIdentify(record)
  40. return
  41. }
  42. //删除三日前的图片记录
  43. func (s *ImageRecordService) DeleteExpireImageRecord() {
  44. markTime := time.Now().Add(-time.Hour * 48).Format("2006-01-02")
  45. err := global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Delete("create_date < ?", markTime).Error
  46. if err != nil {
  47. global.GVA_LOG.Info("删除图片信息失败:" + err.Error() + time.Now().Format("2006-01-02 15:04:05"))
  48. }
  49. return
  50. }
  51. //获取图片记录列表
  52. func (s *ImageRecordService) GetImageRecordList(record levelRequest.ImageRecordRequest, info request.PageInfo, order string, desc bool) (recordList []levelMonitor.ImageRecord, total int64, err error) {
  53. limit := info.PageSize
  54. offset := info.PageSize * (info.Page - 1)
  55. db := global.GVA_DB.Model(&levelMonitor.ImageRecord{})
  56. startDate := time.Now().Format("2006-01-02")
  57. endDate := time.Now().Format("2006-01-02")
  58. if len(record.Date) == 2 {
  59. startDate = record.Date[0]
  60. endDate = record.Date[1]
  61. }
  62. //筛选日期
  63. db = db.Where("create_date >= ? and create_date <= ?", startDate, endDate)
  64. if record.TaskId != 0 {
  65. db = db.Where("task_id = ?", record.TaskId)
  66. }
  67. err = db.Count(&total).Error
  68. if err != nil {
  69. return recordList, total, err
  70. } else {
  71. db = db.Limit(limit).Offset(offset)
  72. if order != "" {
  73. var OrderStr string
  74. // 设置有效排序key 防止sql注入
  75. // 感谢 Tom4t0 提交漏洞信息
  76. orderMap := make(map[string]bool, 4)
  77. orderMap["task_id"] = true
  78. orderMap["create_date"] = true
  79. orderMap["create_time"] = true
  80. orderMap["update_time"] = true
  81. if orderMap[order] {
  82. if desc {
  83. OrderStr = order + " desc"
  84. } else {
  85. OrderStr = order
  86. }
  87. } else { // didn't matched any order key in `orderMap`
  88. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  89. return recordList, total, err
  90. }
  91. err = db.Order(OrderStr).Find(&recordList).Error
  92. } else {
  93. err = db.Order("id desc").Find(&recordList).Error
  94. }
  95. }
  96. //遍历更改日期格式
  97. for i, _ := range recordList {
  98. recordList[i].CreateDate = recordList[i].CreateDate[:10]
  99. }
  100. return recordList, total, err
  101. }
  102. const API_KEY = "z9GNcyrC7VeV3g1xXEj3YL1s"
  103. const SECRET_KEY = "VASRBsEzeVsyKduSkkflfL87r5yqoqvj"
  104. const BAIDU_IDENTIFY = "baiduIdentifyToken"
  105. func (s *ImageRecordService) ImageIdentify(record levelMonitor.ImageRecord) {
  106. token, err := GetAccessToken()
  107. if err != nil {
  108. global.GVA_LOG.Error("get token fail", zap.Error(err))
  109. s.UpdateImageRecordStatus(record.Id, "get token fail", -1)
  110. return
  111. }
  112. body, err := Request(token, record.ImageBase64)
  113. if err != nil {
  114. global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
  115. s.UpdateImageRecordStatus(record.Id, err.Error(), -1)
  116. return
  117. }
  118. type Data struct {
  119. WordsResult []struct {
  120. Words string `json:"words"`
  121. } `json:"words_result"`
  122. WordsResultNum int `json:"words_result_num"`
  123. LogId int `json:"log_id"`
  124. }
  125. var data Data
  126. err = json.Unmarshal(body, &data)
  127. if err != nil {
  128. global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
  129. s.UpdateImageRecordStatus(record.Id, "Read Body Fail", -1)
  130. return
  131. }
  132. s.UpdateImageRecordStatus(record.Id, string(body), 1)
  133. identify := 0
  134. if len(data.WordsResult) > 1 {
  135. for _, words := range data.WordsResult {
  136. i, err := strconv.Atoi(words.Words)
  137. if err == nil {
  138. identify = i
  139. break
  140. }
  141. }
  142. } else {
  143. i, _ := strconv.Atoi(data.WordsResult[0].Words)
  144. identify = i
  145. }
  146. if identify == 0 {
  147. return
  148. }
  149. UpdateGameAccountIdentify(record.Account, record.TaskId, identify)
  150. return
  151. }
  152. func (s *ImageRecordService) UpdateImageRecordStatus(id int, result string, status int) {
  153. update := map[string]interface{}{
  154. "result": result,
  155. "status": status,
  156. }
  157. global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("id", id).Updates(update)
  158. }
  159. func Request(baiduToken, content string) (body []byte, err error) {
  160. reqUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + baiduToken
  161. var (
  162. params = url.Values{}
  163. )
  164. params.Set("image", content)
  165. requestData := params.Encode()
  166. payload := strings.NewReader(requestData)
  167. client := &http.Client{}
  168. req, err := http.NewRequest("POST", reqUrl, payload)
  169. if err != nil {
  170. fmt.Println(err)
  171. return
  172. }
  173. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  174. req.Header.Add("Accept", "application/json")
  175. res, err := client.Do(req)
  176. if err != nil {
  177. global.GVA_LOG.Error("request Identify fail", zap.Error(err))
  178. return
  179. }
  180. defer res.Body.Close()
  181. body, err = ioutil.ReadAll(res.Body)
  182. if err != nil {
  183. global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
  184. return
  185. }
  186. fmt.Println(string(body))
  187. return
  188. }
  189. // 更新game_acount
  190. func UpdateGameAccountIdentify(account string, gameId int, identify int) {
  191. global.GVA_DB.Table("game_account").Where("game_id", gameId).Where("account", account).Update("identify", identify)
  192. }
  193. /**
  194. * 使用 AK,SK 生成鉴权签名(Access Token)
  195. * @return string 鉴权签名信息(Access Token)
  196. */
  197. func GetAccessToken() (string, error) {
  198. ctx := context.Background()
  199. token, err := global.GVA_REDIS.Get(ctx, BAIDU_IDENTIFY).Result()
  200. if err != nil || token == "" {
  201. reqUrl := "https://aip.baidubce.com/oauth/2.0/token"
  202. postData := fmt.Sprintf("grant_type=client_credentials&client_id=%s&client_secret=%s", API_KEY, SECRET_KEY)
  203. resp, err := http.Post(reqUrl, "application/x-www-form-urlencoded", strings.NewReader(postData))
  204. if err != nil {
  205. fmt.Println(err)
  206. return "", err
  207. }
  208. defer resp.Body.Close()
  209. body, err := ioutil.ReadAll(resp.Body)
  210. if err != nil {
  211. fmt.Println(err)
  212. return "", err
  213. }
  214. accessTokenObj := map[string]string{}
  215. json.Unmarshal(body, &accessTokenObj)
  216. global.GVA_REDIS.Set(ctx, BAIDU_IDENTIFY, accessTokenObj["access_token"], time.Hour*24*29)
  217. return accessTokenObj["access_token"], err
  218. }
  219. return token, err
  220. }