activity_poster.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. package cygx
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/go-resty/resty/v2"
  7. "hongze/hz_crm_api/models"
  8. "hongze/hz_crm_api/models/cygx"
  9. "hongze/hz_crm_api/services"
  10. "hongze/hz_crm_api/services/alarm_msg"
  11. "hongze/hz_crm_api/utils"
  12. "io"
  13. "io/ioutil"
  14. "net/http"
  15. "os"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. var (
  21. ServerUrl = "http://127.0.0.1:5008/"
  22. Cygx_activity_sigin_html = "cygx_activity_sigin_html"
  23. Cygx_mp3_html = "cygx_mp3_html"
  24. Cygx_mp4_html = "cygx_mp4_html"
  25. Cygx_mp3_yx_html = "cygx_mp3_yx_html"
  26. Cygx_mp4_yx_html = "cygx_mp4_yx_html"
  27. )
  28. type Html2ImgResp struct {
  29. Code int `json:"code"`
  30. Msg string `json:"msg"`
  31. Data string `json:"data"`
  32. }
  33. // postHtml2Img 请求htm2img接口
  34. func postHtml2Img(param map[string]interface{}) (resp *Html2ImgResp, err error) {
  35. // 目前仅此处调用该接口,暂不加授权、校验等
  36. postUrl := ServerUrl + "htm2img"
  37. postData, err := json.Marshal(param)
  38. if err != nil {
  39. return
  40. }
  41. result, err := Html2ImgHttpPost(postUrl, string(postData), "application/json")
  42. if err != nil {
  43. return
  44. }
  45. if err = json.Unmarshal(result, &resp); err != nil {
  46. return
  47. }
  48. return resp, nil
  49. }
  50. // Html2ImgHttpPost post请求
  51. func Html2ImgHttpPost(url, postData string, params ...string) ([]byte, error) {
  52. body := ioutil.NopCloser(strings.NewReader(postData))
  53. client := &http.Client{}
  54. req, err := http.NewRequest("POST", url, body)
  55. if err != nil {
  56. return nil, err
  57. }
  58. contentType := "application/x-www-form-urlencoded;charset=utf-8"
  59. if len(params) > 0 && params[0] != "" {
  60. contentType = params[0]
  61. }
  62. req.Header.Set("Content-Type", contentType)
  63. resp, err := client.Do(req)
  64. if err != nil {
  65. return nil, err
  66. }
  67. defer resp.Body.Close()
  68. b, err := ioutil.ReadAll(resp.Body)
  69. fmt.Println("HttpPost:" + string(b))
  70. return b, err
  71. }
  72. //func init() {
  73. // MakeActivitySigninImg(2161)
  74. //}
  75. // MakeActivitySigninImg 生成太阳码并上传OSS
  76. func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
  77. var msg string
  78. defer func() {
  79. if err != nil || msg != "" {
  80. fmt.Println(err)
  81. utils.FileLog.Info("MakeActivitySigninImg Err:", err.Error())
  82. go alarm_msg.SendAlarmMsg("扫码签到日志记录,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
  83. }
  84. }()
  85. activityInfo, e := cygx.GetAddActivityInfoById(activityId)
  86. if e != nil {
  87. err = errors.New("活动不存在, Err: " + e.Error())
  88. return
  89. }
  90. if activityInfo == nil {
  91. return
  92. }
  93. if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 6 && activityInfo.ActivityTypeId != 8 {
  94. return
  95. }
  96. itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
  97. if err != nil {
  98. return
  99. }
  100. if itemToken.AccessToken == "" {
  101. msg = "accessToken is empty"
  102. return
  103. }
  104. var envVersion string
  105. var resourceUrl string
  106. if utils.RunMode == "release" {
  107. envVersion = "release"
  108. } else {
  109. envVersion = "trial"
  110. }
  111. url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
  112. method := "POST"
  113. payload := strings.NewReader(`{
  114. "page":"` + utils.WX_MSG_PATH_ACTIVITY_SIGNIN + `",
  115. "scene":"` + strconv.Itoa(activityId) + `",
  116. "env_version":"` + envVersion + `",
  117. "check_path":false,
  118. "auto_color":true
  119. }`)
  120. client := &http.Client{}
  121. req, err := http.NewRequest(method, url, payload)
  122. if err != nil {
  123. msg = "获取微信二维码失败,Err:" + err.Error()
  124. return
  125. }
  126. req.Header.Add("Content-Type", "application/json")
  127. postBody, err := client.Do(req)
  128. if err != nil {
  129. msg = "获取微信二维码失败,Err:" + err.Error()
  130. return
  131. }
  132. defer postBody.Body.Close()
  133. uploadDir := "static/img/share/"
  134. uuid := utils.GetRandStringNoSpecialChar(28)
  135. if !utils.FileIsExist(uploadDir) {
  136. err = os.MkdirAll(uploadDir, 0755)
  137. if err != nil {
  138. msg = "生成文件夹失败,Err:" + err.Error()
  139. return
  140. }
  141. }
  142. imagePath := uploadDir + uuid + ".jpg"
  143. switch header := postBody.Header.Get("Content-Type"); {
  144. case strings.HasPrefix(header, "application/json"):
  145. tokenResp := ReturnBodyRule{}
  146. decoder := json.NewDecoder(postBody.Body)
  147. if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
  148. msg = "获取微信二维码失败,Err:" + decodeErr.Error()
  149. return
  150. }
  151. case strings.HasPrefix(header, "image"):
  152. reply, e := ioutil.ReadAll(postBody.Body)
  153. if e != nil {
  154. err = e
  155. msg = "获取微信二维码失败,Err:" + err.Error()
  156. return
  157. }
  158. imageContent, e := os.Create(imagePath)
  159. if e != nil {
  160. err = e
  161. msg = "获取微信二维码失败,Err:" + err.Error()
  162. return
  163. }
  164. writeStringRes, e := io.WriteString(imageContent, string(reply))
  165. if e != nil {
  166. err = e
  167. fmt.Println(writeStringRes)
  168. return
  169. }
  170. closeErr := imageContent.Close()
  171. if closeErr != nil {
  172. err = closeErr
  173. return
  174. }
  175. randStr := utils.GetRandStringNoSpecialChar(28)
  176. fileName := randStr + ".jpg"
  177. savePath := uploadDir + time.Now().Format("200601/20060102/")
  178. savePath += fileName
  179. //上传到阿里云
  180. err = services.UploadFileToAliyun(fileName, imagePath, savePath)
  181. if err != nil {
  182. fmt.Println("文件上传失败,Err:" + err.Error())
  183. return
  184. }
  185. fileHost := "https://hzstatic.hzinsights.com/"
  186. resourceUrl = fileHost + savePath
  187. defer func() {
  188. os.Remove(imagePath)
  189. }()
  190. default:
  191. msg = "生成二维码失败"
  192. return
  193. }
  194. fmt.Println("resourceUrl", resourceUrl)
  195. detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
  196. if e != nil {
  197. err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
  198. return
  199. }
  200. configValue := detailConfig.ConfigValue
  201. configValue = strings.Replace(configValue, "{{TITLE}}", activityInfo.ActivityName, -1)
  202. configValue = strings.Replace(configValue, "{{IMG}}", resourceUrl, -1)
  203. configValue = strings.Replace(configValue, "{{PLEASE}}", "请扫码确认签到", -1)
  204. configValue = strings.Replace(configValue, "{{SHOWTEXT}}", "将签到成功页面出示给接待人员", -1)
  205. htm2ImgReq := make(map[string]interface{})
  206. htm2ImgReq["html_content"] = configValue
  207. htm2ImgReq["width"] = 1364
  208. htm2ImgReq["height"] = 2060
  209. res, err := postHtml2Img(htm2ImgReq)
  210. if err != nil || res == nil {
  211. msg = "html转图片请求失败"
  212. return
  213. }
  214. if res.Code != 200 {
  215. msg = "html转图片请求失败"
  216. err = errors.New("html转图片失败: " + res.Msg)
  217. return
  218. }
  219. imgUrl = res.Data
  220. // 记录海报信息
  221. err = cygx.UpdateCygxActivitySigninImg(imgUrl, activityId)
  222. if err != nil {
  223. return
  224. }
  225. item := new(cygx.CygxActivityPoster)
  226. item.ActivityId = activityId
  227. item.ImgXcx = resourceUrl
  228. item.ImgPoster = imgUrl
  229. item.CreateTime = time.Now()
  230. err = cygx.AddCygxActivityPoster(item)
  231. return
  232. }
  233. // 生成音视频分享封面图
  234. func MakeCygxMp3HtmlImg(videoDuration string, chartPermissionId int) (imgUrl string, err error) {
  235. var msg string
  236. defer func() {
  237. if err != nil || msg != "" {
  238. fmt.Println(err)
  239. go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp3HtmlImg:"+err.Error()+";msg:"+msg, 3)
  240. }
  241. }()
  242. var configCode string
  243. if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
  244. configCode = Cygx_mp3_yx_html
  245. } else {
  246. configCode = Cygx_mp3_html
  247. }
  248. detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
  249. if e != nil {
  250. err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error())
  251. return
  252. }
  253. // 处理时长带有小数点的字符串
  254. slice := strings.Split(videoDuration, ".")
  255. for k, v := range slice {
  256. if k != 0 {
  257. continue
  258. }
  259. videoDuration = v
  260. }
  261. //先转换时长展示样式再替换
  262. secondNum, _ := strconv.Atoi(videoDuration)
  263. videoDuration = utils.HideSecondsToMs(secondNum)
  264. configValue := detailConfig.ConfigValue
  265. configValue = strings.Replace(configValue, "{{TIME}}", videoDuration, -1)
  266. htm2ImgReq := make(map[string]interface{})
  267. htm2ImgReq["html_content"] = configValue
  268. htm2ImgReq["width"] = 1364
  269. htm2ImgReq["height"] = 2060
  270. res, err := postHtml2Img(htm2ImgReq)
  271. if err != nil || res == nil {
  272. msg = "html转图片请求失败"
  273. return
  274. }
  275. if res.Code != 200 {
  276. msg = "html转图片请求失败"
  277. err = errors.New("html转图片失败: " + res.Msg)
  278. return
  279. }
  280. imgUrl = res.Data
  281. return
  282. }
  283. // 生成音视频分享封面图
  284. func MakeCygxMp4HtmlImg(videoDuration string, chartPermissionId int) (imgUrl string, err error) {
  285. var msg string
  286. defer func() {
  287. if err != nil || msg != "" {
  288. fmt.Println(err)
  289. go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp4HtmlImg:"+err.Error()+";msg:"+msg, 3)
  290. }
  291. }()
  292. var configCode string
  293. if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
  294. configCode = Cygx_mp4_yx_html
  295. } else {
  296. configCode = Cygx_mp4_html
  297. }
  298. detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
  299. if e != nil {
  300. err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error())
  301. return
  302. }
  303. // 处理时长带有小数点的字符串
  304. slice := strings.Split(videoDuration, ".")
  305. for k, v := range slice {
  306. if k != 0 {
  307. continue
  308. }
  309. videoDuration = v
  310. }
  311. //先转换时长展示样式再替换
  312. secondNum, _ := strconv.Atoi(videoDuration)
  313. videoDuration = utils.HideSecondsToMs(secondNum)
  314. configValue := detailConfig.ConfigValue
  315. configValue = strings.Replace(configValue, "{{TIME}}", videoDuration, -1)
  316. htm2ImgReq := make(map[string]interface{})
  317. htm2ImgReq["html_content"] = configValue
  318. htm2ImgReq["width"] = 1364
  319. htm2ImgReq["height"] = 2060
  320. res, err := postHtml2Img(htm2ImgReq)
  321. if err != nil || res == nil {
  322. msg = "html转图片请求失败"
  323. return
  324. }
  325. if res.Code != 200 {
  326. msg = "html转图片请求失败"
  327. err = errors.New("html转图片失败: " + res.Msg)
  328. return
  329. }
  330. imgUrl = res.Data
  331. return
  332. }
  333. //func init() {
  334. // //MakeActivityMomentsImg(2850)
  335. // var condition string
  336. // var pars []interface{}
  337. // condition = " AND chart_permission_id = 31 AND publish_status = 1 AND active_state = 1 ORDER BY activity_id DESC "
  338. // list, errList := cygx.GetActivityListAll(condition, pars, 0, 9999)
  339. // if errList != nil {
  340. // fmt.Println(errList)
  341. // return
  342. // }
  343. // fmt.Println("list", len(list))
  344. //
  345. // //return
  346. // for _, v := range list {
  347. // MakeActivityMomentsImg(v.ActivityId)
  348. // }
  349. //
  350. //}
  351. // 生成活动分享到朋友圈的图片
  352. func MakeActivityMomentsImg(activityId int) {
  353. var err error
  354. //time.Sleep(3*time.Second) // 有时候同时添加多个活动,延迟三秒
  355. defer func() {
  356. if err != nil {
  357. fmt.Println("err:", err)
  358. go alarm_msg.SendAlarmMsg("生成活动分享到朋友圈的图片失败,MakeActivityMomentsImg Err:"+err.Error()+"活动ID"+strconv.Itoa(activityId), 3)
  359. }
  360. }()
  361. detail, e := cygx.GetAddActivityInfoById(activityId)
  362. if e != nil {
  363. err = errors.New("GetCygxReportSelectionInfoById, Err: " + e.Error())
  364. return
  365. }
  366. // 不是研选活动不生成图片
  367. if detail.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
  368. return
  369. }
  370. var configCode string
  371. if detail.IsResearchPoints == 1 {
  372. configCode = "activity_moments_img_points_html" // 扣点活动
  373. } else {
  374. configCode = "activity_moments_img_html" // 非扣点活动
  375. }
  376. detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode)
  377. if e != nil {
  378. err = errors.New("GetCygxConfigDetailByCode 获取生成活动分享到朋友圈的图片格式信息失败, Err: " + e.Error())
  379. return
  380. }
  381. configValue := detailConfig.ConfigValue
  382. configValue = strings.Replace(configValue, "{{Title}}", detail.ActivityName, -1)
  383. configValue = strings.Replace(configValue, "{{ActivityTypeName}}", detail.ActivityTypeName, -1)
  384. configValue = strings.Replace(configValue, "{{Label}}", detail.Label, -1)
  385. configValue = strings.Replace(configValue, "{{ActivityTimeText}}", detail.ActivityTimeText, -1)
  386. htm2ImgReq := make(map[string]interface{})
  387. htm2ImgReq["html_content"] = configValue
  388. htm2ImgReq["width"] = 2250
  389. htm2ImgReq["height"] = 3813
  390. res, err := postHtml2Img(htm2ImgReq)
  391. if err != nil || res == nil {
  392. err = errors.New("html转图片失败: ")
  393. return
  394. }
  395. if res.Code != 200 {
  396. err = errors.New("html转图片失败: " + res.Msg)
  397. return
  398. }
  399. imgUrl := res.Data
  400. // 记录海报信息
  401. err = cygx.UpdateCygxActivityMomentsImg(imgUrl, activityId)
  402. if err != nil {
  403. return
  404. }
  405. }
  406. // MakeMfyxActivitySigninImg 生成mfyx太阳码并上传OSS
  407. //func MakeMfyxActivitySigninImg(activityId int) (imgUrl string, err error) {
  408. // var msg string
  409. // defer func() {
  410. // if err != nil || msg != "" {
  411. // fmt.Println(err)
  412. // utils.FileLog.Info("MakeMfyxActivitySigninImg Err:", err.Error())
  413. // go alarm_msg.SendAlarmMsg("扫码签到日志记录,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
  414. // }
  415. // }()
  416. // activityInfo, e := cygx.GetAddActivityInfoById(activityId)
  417. // if e != nil {
  418. // err = errors.New("活动不存在, Err: " + e.Error())
  419. // return
  420. // }
  421. // if activityInfo == nil {
  422. // return
  423. // }
  424. // if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 6 && activityInfo.ActivityTypeId != 8 {
  425. // return
  426. // }
  427. // itemToken, err := models.GetWxToken(utils.WxMfyxAppId, utils.WxMfyxAppSecret)
  428. // if err != nil {
  429. // return
  430. // }
  431. // if itemToken.AccessToken == "" {
  432. // msg = "accessToken is empty"
  433. // return
  434. // }
  435. // var envVersion string
  436. // var resourceUrl string
  437. // if utils.RunMode == "release" {
  438. // envVersion = "release"
  439. // } else {
  440. // envVersion = "trial"
  441. // }
  442. // url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
  443. // method := "POST"
  444. // payload := strings.NewReader(`{
  445. // "page":"` + utils.WX_MSG_PATH_ACTIVITY_SIGNIN + `",
  446. // "scene":"` + strconv.Itoa(activityId) + `",
  447. // "env_version":"` + envVersion + `",
  448. // "check_path":false,
  449. // "auto_color":true
  450. // }`)
  451. // client := &http.Client{}
  452. // req, err := http.NewRequest(method, url, payload)
  453. // if err != nil {
  454. // msg = "获取微信二维码失败,Err:" + err.Error()
  455. // return
  456. // }
  457. // req.Header.Add("Content-Type", "application/json")
  458. // postBody, err := client.Do(req)
  459. // if err != nil {
  460. // msg = "获取微信二维码失败,Err:" + err.Error()
  461. // return
  462. // }
  463. // defer postBody.Body.Close()
  464. // uploadDir := "static/img/share/"
  465. // uuid := utils.GetRandStringNoSpecialChar(28)
  466. // if !utils.FileIsExist(uploadDir) {
  467. // err = os.MkdirAll(uploadDir, 0755)
  468. // if err != nil {
  469. // msg = "生成文件夹失败,Err:" + err.Error()
  470. // return
  471. // }
  472. // }
  473. // imagePath := uploadDir + uuid + ".jpg"
  474. // switch header := postBody.Header.Get("Content-Type"); {
  475. // case strings.HasPrefix(header, "application/json"):
  476. // tokenResp := ReturnBodyRule{}
  477. // decoder := json.NewDecoder(postBody.Body)
  478. // if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
  479. // msg = "获取微信二维码失败,Err:" + decodeErr.Error()
  480. // return
  481. // }
  482. // case strings.HasPrefix(header, "image"):
  483. // reply, e := ioutil.ReadAll(postBody.Body)
  484. // if e != nil {
  485. // err = e
  486. // msg = "获取微信二维码失败,Err:" + err.Error()
  487. // return
  488. // }
  489. // imageContent, e := os.Create(imagePath)
  490. // if e != nil {
  491. // err = e
  492. // msg = "获取微信二维码失败,Err:" + err.Error()
  493. // return
  494. // }
  495. // writeStringRes, e := io.WriteString(imageContent, string(reply))
  496. // if e != nil {
  497. // err = e
  498. // fmt.Println(writeStringRes)
  499. // return
  500. // }
  501. // closeErr := imageContent.Close()
  502. // if closeErr != nil {
  503. // err = closeErr
  504. // return
  505. // }
  506. // randStr := utils.GetRandStringNoSpecialChar(28)
  507. // fileName := randStr + ".jpg"
  508. // savePath := uploadDir + time.Now().Format("200601/20060102/")
  509. // savePath += fileName
  510. // //上传到阿里云
  511. // err = services.UploadFileToAliyun(fileName, imagePath, savePath)
  512. // if err != nil {
  513. // fmt.Println("文件上传失败,Err:" + err.Error())
  514. // return
  515. // }
  516. // fileHost := "https://hzstatic.hzinsights.com/"
  517. // resourceUrl = fileHost + savePath
  518. // defer func() {
  519. // os.Remove(imagePath)
  520. // }()
  521. // default:
  522. // msg = "生成二维码失败"
  523. // return
  524. // }
  525. //
  526. // detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
  527. // if e != nil {
  528. // err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
  529. // return
  530. // }
  531. // configValue := detailConfig.ConfigValue
  532. // configValue = strings.Replace(configValue, "{{TITLE}}", activityInfo.ActivityName, -1)
  533. // configValue = strings.Replace(configValue, "{{IMG}}", resourceUrl, -1)
  534. // configValue = strings.Replace(configValue, "{{PLEASE}}", "请扫码确认签到", -1)
  535. // configValue = strings.Replace(configValue, "{{SHOWTEXT}}", "将签到成功页面出示给接待人员", -1)
  536. // htm2ImgReq := make(map[string]interface{})
  537. // htm2ImgReq["html_content"] = configValue
  538. // htm2ImgReq["width"] = 1364
  539. // htm2ImgReq["height"] = 2060
  540. // res, err := postHtml2Img(htm2ImgReq)
  541. // if err != nil || res == nil {
  542. // msg = "html转图片请求失败"
  543. // return
  544. // }
  545. // if res.Code != 200 {
  546. // msg = "html转图片请求失败"
  547. // err = errors.New("html转图片失败: " + res.Msg)
  548. // return
  549. // }
  550. // imgUrl = res.Data
  551. // // 记录海报信息
  552. //
  553. // err = cygx.UpdateCygxActivitySigninImg(imgUrl, activityId)
  554. // if err != nil {
  555. // return
  556. // }
  557. // item := new(cygx.CygxActivityPoster)
  558. // item.ActivityId = activityId
  559. // item.ImgXcx = resourceUrl
  560. // item.ImgPoster = imgUrl
  561. // item.CreateTime = time.Now()
  562. // err = cygx.AddCygxActivityPoster(item)
  563. // return
  564. //}
  565. //func init() {
  566. // MakeActivityDetailImg2(2992)
  567. //}
  568. //func init() {
  569. // var condition string
  570. // var pars []interface{}
  571. //
  572. // condition = " AND active_state = 1 AND xcx_detail_img = '' "
  573. // list, errList := cygx.GetActivityListAll(condition, pars, 0, 999)
  574. // if errList != nil {
  575. // fmt.Println(errList)
  576. // return
  577. // }
  578. //
  579. // for _, v := range list {
  580. // MakeActivityDetailImg2(v.ActivityId)
  581. // }
  582. //}
  583. // MakeActivityDetailImg 生成活动详情二维码 生成太阳码并上传OSS 30天有效
  584. func MakeActivityDetailImg(activityId int) (imgUrl string, err error) {
  585. var msg string
  586. defer func() {
  587. if err != nil || msg != "" {
  588. fmt.Println(err)
  589. go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,MakeActivityDetailImg 活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
  590. }
  591. }()
  592. activityInfo, e := cygx.GetAddActivityInfoById(activityId)
  593. if e != nil {
  594. err = errors.New("活动不存在, Err: " + e.Error())
  595. return
  596. }
  597. if activityInfo == nil {
  598. return
  599. }
  600. itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
  601. if err != nil {
  602. return
  603. }
  604. if itemToken.AccessToken == "" {
  605. msg = "accessToken is empty"
  606. return
  607. }
  608. client := resty.New()
  609. resp, err := client.R().
  610. SetQueryParam("access_token", itemToken.AccessToken).
  611. SetBody(map[string]interface{}{
  612. "path": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId),
  613. "width": 430,
  614. }).
  615. Post("https://api.weixin.qq.com/wxa/getwxacode")
  616. if err != nil {
  617. return
  618. }
  619. if resp.StatusCode() != http.StatusOK {
  620. return
  621. }
  622. fmt.Println(resp.Status())
  623. var resourceUrl string
  624. uploadDir := "static/img/share/"
  625. uuid := utils.GetRandStringNoSpecialChar(28)
  626. if !utils.FileIsExist(uploadDir) {
  627. err = os.MkdirAll(uploadDir, 0755)
  628. if err != nil {
  629. msg = "生成文件夹失败,Err:" + err.Error()
  630. return
  631. }
  632. }
  633. imagePath := uploadDir + uuid + ".jpg"
  634. imageContent, e := os.Create(imagePath)
  635. if e != nil {
  636. err = e
  637. msg = "获取微信二维码失败,Err:" + err.Error()
  638. return
  639. }
  640. writeStringRes, e := io.WriteString(imageContent, string(resp.Body()))
  641. if e != nil {
  642. err = e
  643. fmt.Println("writeStringRes", writeStringRes)
  644. return
  645. }
  646. closeErr := imageContent.Close()
  647. if closeErr != nil {
  648. err = closeErr
  649. return
  650. }
  651. randStr := utils.GetRandStringNoSpecialChar(28)
  652. fileName := randStr + ".jpg"
  653. savePath := uploadDir + time.Now().Format("200601/20060102/")
  654. savePath += fileName
  655. //上传到阿里云
  656. err = services.UploadFileToAliyun(fileName, imagePath, savePath)
  657. if err != nil {
  658. fmt.Println("文件上传失败,Err:" + err.Error())
  659. return
  660. }
  661. fileHost := "https://hzstatic.hzinsights.com/"
  662. resourceUrl = fileHost + savePath
  663. defer func() {
  664. os.Remove(imagePath)
  665. }()
  666. fmt.Println(resourceUrl)
  667. return
  668. }
  669. // MakeActivityDetailImg2 生成活动详情二维码 生成太阳码并上传OSS 永久有效
  670. func MakeActivityDetailImg2(activityId int) (imgUrl string, err error) {
  671. var msg string
  672. defer func() {
  673. if err != nil || msg != "" {
  674. fmt.Println(err)
  675. go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
  676. }
  677. }()
  678. activityInfo, e := cygx.GetAddActivityInfoById(activityId)
  679. if e != nil {
  680. err = errors.New("活动不存在, Err: " + e.Error())
  681. return
  682. }
  683. if activityInfo == nil {
  684. return
  685. }
  686. itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
  687. if err != nil {
  688. return
  689. }
  690. if itemToken.AccessToken == "" {
  691. msg = "accessToken is empty"
  692. return
  693. }
  694. var envVersion string
  695. var resourceUrl string
  696. if utils.RunMode == "release" {
  697. envVersion = "release"
  698. } else {
  699. envVersion = "trial"
  700. }
  701. url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
  702. method := "POST"
  703. payload := strings.NewReader(`{
  704. "page":"activityPages/activityDetail/activityDetail",
  705. "scene":"` + strconv.Itoa(activityId) + `",
  706. "env_version":"` + envVersion + `",
  707. "check_path":false,
  708. "auto_color":true
  709. }`)
  710. client := &http.Client{}
  711. req, err := http.NewRequest(method, url, payload)
  712. if err != nil {
  713. msg = "获取微信二维码失败,Err:" + err.Error()
  714. return
  715. }
  716. req.Header.Add("Content-Type", "application/json")
  717. postBody, err := client.Do(req)
  718. if err != nil {
  719. msg = "获取微信二维码失败,Err:" + err.Error()
  720. return
  721. }
  722. defer postBody.Body.Close()
  723. uploadDir := "static/img/share/"
  724. uuid := utils.GetRandStringNoSpecialChar(28)
  725. if !utils.FileIsExist(uploadDir) {
  726. err = os.MkdirAll(uploadDir, 0755)
  727. if err != nil {
  728. msg = "生成文件夹失败,Err:" + err.Error()
  729. return
  730. }
  731. }
  732. imagePath := uploadDir + uuid + ".jpg"
  733. switch header := postBody.Header.Get("Content-Type"); {
  734. case strings.HasPrefix(header, "application/json"):
  735. tokenResp := ReturnBodyRule{}
  736. decoder := json.NewDecoder(postBody.Body)
  737. if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
  738. msg = "获取微信二维码失败,Err:" + decodeErr.Error()
  739. return
  740. }
  741. case strings.HasPrefix(header, "image"):
  742. reply, e := ioutil.ReadAll(postBody.Body)
  743. if e != nil {
  744. err = e
  745. msg = "获取微信二维码失败,Err:" + err.Error()
  746. return
  747. }
  748. imageContent, e := os.Create(imagePath)
  749. if e != nil {
  750. err = e
  751. msg = "获取微信二维码失败,Err:" + err.Error()
  752. return
  753. }
  754. writeStringRes, e := io.WriteString(imageContent, string(reply))
  755. if e != nil {
  756. err = e
  757. fmt.Println(writeStringRes)
  758. return
  759. }
  760. closeErr := imageContent.Close()
  761. if closeErr != nil {
  762. err = closeErr
  763. return
  764. }
  765. randStr := utils.GetRandStringNoSpecialChar(28)
  766. fileName := randStr + ".jpg"
  767. savePath := uploadDir + time.Now().Format("200601/20060102/")
  768. savePath += fileName
  769. //上传到阿里云
  770. err = services.UploadFileToAliyun(fileName, imagePath, savePath)
  771. if err != nil {
  772. fmt.Println("文件上传失败,Err:" + err.Error())
  773. return
  774. }
  775. fileHost := "https://hzstatic.hzinsights.com/"
  776. resourceUrl = fileHost + savePath
  777. defer func() {
  778. os.Remove(imagePath)
  779. }()
  780. default:
  781. msg = "生成二维码失败"
  782. return
  783. }
  784. err = cygx.UpdateCygxActivityXcxDetailImg(resourceUrl, activityId)
  785. fmt.Println("resourceUrl", resourceUrl)
  786. return
  787. }