package cygx import ( "encoding/json" "errors" "fmt" "hongze/hz_crm_api/models" "hongze/hz_crm_api/models/cygx" "hongze/hz_crm_api/services" "hongze/hz_crm_api/services/alarm_msg" "hongze/hz_crm_api/utils" "io" "io/ioutil" "net/http" "os" "strconv" "strings" "time" ) var ( ServerUrl = "http://127.0.0.1:5008/" Cygx_activity_sigin_html = "cygx_activity_sigin_html" Cygx_mp3_html = "cygx_mp3_html" Cygx_mp4_html = "cygx_mp4_html" ) type Html2ImgResp struct { Code int `json:"code"` Msg string `json:"msg"` Data string `json:"data"` } // postHtml2Img 请求htm2img接口 func postHtml2Img(param map[string]interface{}) (resp *Html2ImgResp, err error) { // 目前仅此处调用该接口,暂不加授权、校验等 postUrl := ServerUrl + "htm2img" postData, err := json.Marshal(param) if err != nil { return } result, err := Html2ImgHttpPost(postUrl, string(postData), "application/json") if err != nil { return } if err = json.Unmarshal(result, &resp); err != nil { return } return resp, nil } // Html2ImgHttpPost post请求 func Html2ImgHttpPost(url, postData string, params ...string) ([]byte, error) { body := ioutil.NopCloser(strings.NewReader(postData)) client := &http.Client{} req, err := http.NewRequest("POST", url, body) if err != nil { return nil, err } contentType := "application/x-www-form-urlencoded;charset=utf-8" if len(params) > 0 && params[0] != "" { contentType = params[0] } req.Header.Set("Content-Type", contentType) resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) fmt.Println("HttpPost:" + string(b)) return b, err } //func init() { // MakeActivitySigninImg(2161) //} // MakeActivitySigninImg 生成太阳码并上传OSS func MakeActivitySigninImg(activityId int) (imgUrl string, err error) { var msg string defer func() { if err != nil || msg != "" { fmt.Println(err) utils.FileLog.Info("MakeActivitySigninImg Err:", err.Error()) go alarm_msg.SendAlarmMsg("扫码签到日志记录,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3) } }() activityInfo, e := cygx.GetAddActivityInfoById(activityId) if e != nil { err = errors.New("活动不存在, Err: " + e.Error()) return } if activityInfo == nil { return } if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 6 && activityInfo.ActivityTypeId != 8 { return } itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret) if err != nil { return } if itemToken.AccessToken == "" { msg = "accessToken is empty" return } var envVersion string var resourceUrl string if utils.RunMode == "release" { envVersion = "release" } else { envVersion = "trial" } url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken method := "POST" payload := strings.NewReader(`{ "page":"` + utils.WX_MSG_PATH_ACTIVITY_SIGNIN + `", "scene":"` + strconv.Itoa(activityId) + `", "env_version":"` + envVersion + `", "check_path":false, "auto_color":true }`) client := &http.Client{} req, err := http.NewRequest(method, url, payload) if err != nil { msg = "获取微信二维码失败,Err:" + err.Error() return } req.Header.Add("Content-Type", "application/json") postBody, err := client.Do(req) if err != nil { msg = "获取微信二维码失败,Err:" + err.Error() return } defer postBody.Body.Close() uploadDir := "static/img/share/" uuid := utils.GetRandStringNoSpecialChar(28) if !utils.FileIsExist(uploadDir) { err = os.MkdirAll(uploadDir, 0755) if err != nil { msg = "生成文件夹失败,Err:" + err.Error() return } } imagePath := uploadDir + uuid + ".jpg" switch header := postBody.Header.Get("Content-Type"); { case strings.HasPrefix(header, "application/json"): tokenResp := ReturnBodyRule{} decoder := json.NewDecoder(postBody.Body) if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil { msg = "获取微信二维码失败,Err:" + decodeErr.Error() return } case strings.HasPrefix(header, "image"): reply, e := ioutil.ReadAll(postBody.Body) if e != nil { err = e msg = "获取微信二维码失败,Err:" + err.Error() return } imageContent, e := os.Create(imagePath) if e != nil { err = e msg = "获取微信二维码失败,Err:" + err.Error() return } writeStringRes, e := io.WriteString(imageContent, string(reply)) if e != nil { err = e fmt.Println(writeStringRes) return } closeErr := imageContent.Close() if closeErr != nil { err = closeErr return } randStr := utils.GetRandStringNoSpecialChar(28) fileName := randStr + ".jpg" savePath := uploadDir + time.Now().Format("200601/20060102/") savePath += fileName //上传到阿里云 err = services.UploadFileToAliyun(fileName, imagePath, savePath) if err != nil { fmt.Println("文件上传失败,Err:" + err.Error()) return } fileHost := "https://hzstatic.hzinsights.com/" resourceUrl = fileHost + savePath defer func() { os.Remove(imagePath) }() default: msg = "生成二维码失败" return } detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html) if e != nil { err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error()) return } configValue := detailConfig.ConfigValue configValue = strings.Replace(configValue, "{{TITLE}}", activityInfo.ActivityName, -1) configValue = strings.Replace(configValue, "{{IMG}}", resourceUrl, -1) configValue = strings.Replace(configValue, "{{PLEASE}}", "请扫码确认签到", -1) configValue = strings.Replace(configValue, "{{SHOWTEXT}}", "将签到成功页面出示给接待人员", -1) htm2ImgReq := make(map[string]interface{}) htm2ImgReq["html_content"] = configValue htm2ImgReq["width"] = 1364 htm2ImgReq["height"] = 2060 res, err := postHtml2Img(htm2ImgReq) if err != nil || res == nil { msg = "html转图片请求失败" return } if res.Code != 200 { msg = "html转图片请求失败" err = errors.New("html转图片失败: " + res.Msg) return } imgUrl = res.Data // 记录海报信息 err = cygx.UpdateCygxActivitySigninImg(imgUrl, activityId) if err != nil { return } item := new(cygx.CygxActivityPoster) item.ActivityId = activityId item.ImgXcx = resourceUrl item.ImgPoster = imgUrl item.CreateTime = time.Now() err = cygx.AddCygxActivityPoster(item) return } // 生成音视频分享封面图 func MakeCygxMp3HtmlImg(videoDuration string) (imgUrl string, err error) { var msg string defer func() { if err != nil || msg != "" { fmt.Println(err) go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp3HtmlImg:"+err.Error()+";msg:"+msg, 3) } }() detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_mp3_html) if e != nil { err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error()) return } // 处理时长带有小数点的字符串 slice := strings.Split(videoDuration, ".") for k, v := range slice { if k != 0 { continue } videoDuration = v } //先转换时长展示样式再替换 secondNum, _ := strconv.Atoi(videoDuration) videoDuration = utils.HideSecondsToMs(secondNum) configValue := detailConfig.ConfigValue configValue = strings.Replace(configValue, "{{TIME}}", videoDuration, -1) htm2ImgReq := make(map[string]interface{}) htm2ImgReq["html_content"] = configValue htm2ImgReq["width"] = 1364 htm2ImgReq["height"] = 2060 res, err := postHtml2Img(htm2ImgReq) if err != nil || res == nil { msg = "html转图片请求失败" return } if res.Code != 200 { msg = "html转图片请求失败" err = errors.New("html转图片失败: " + res.Msg) return } imgUrl = res.Data return } // 生成音视频分享封面图 func MakeCygxMp4HtmlImg(videoDuration string) (imgUrl string, err error) { var msg string defer func() { if err != nil || msg != "" { fmt.Println(err) go alarm_msg.SendAlarmMsg("生成音视频分享封面图,失败 MakeCygxMp4HtmlImg:"+err.Error()+";msg:"+msg, 3) } }() detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_mp4_html) if e != nil { err = errors.New("GetCygxConfigDetailByCode 获取配置生成音视频分享封面图格式信息失败, Err: " + e.Error()) return } // 处理时长带有小数点的字符串 slice := strings.Split(videoDuration, ".") for k, v := range slice { if k != 0 { continue } videoDuration = v } //先转换时长展示样式再替换 secondNum, _ := strconv.Atoi(videoDuration) videoDuration = utils.HideSecondsToMs(secondNum) configValue := detailConfig.ConfigValue configValue = strings.Replace(configValue, "{{TIME}}", videoDuration, -1) htm2ImgReq := make(map[string]interface{}) htm2ImgReq["html_content"] = configValue htm2ImgReq["width"] = 1364 htm2ImgReq["height"] = 2060 res, err := postHtml2Img(htm2ImgReq) if err != nil || res == nil { msg = "html转图片请求失败" return } if res.Code != 200 { msg = "html转图片请求失败" err = errors.New("html转图片失败: " + res.Msg) return } imgUrl = res.Data return }