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" Cygx_mp3_yx_html = "cygx_mp3_yx_html" Cygx_mp4_yx_html = "cygx_mp4_yx_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, chartPermissionId int) (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) } }() var configCode string if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN { configCode = Cygx_mp3_yx_html } else { configCode = Cygx_mp3_html } detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode) 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, chartPermissionId int) (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) } }() var configCode string if chartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN { configCode = Cygx_mp4_yx_html } else { configCode = Cygx_mp4_html } detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode) 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 init() { // //MakeActivityMomentsImg(2850) // var condition string // var pars []interface{} // condition = " AND chart_permission_id = 31 AND publish_status = 1 AND active_state = 1 ORDER BY activity_id DESC " // list, errList := cygx.GetActivityListAll(condition, pars, 0, 9999) // if errList != nil { // fmt.Println(errList) // return // } // fmt.Println("list", len(list)) // // //return // for _, v := range list { // MakeActivityMomentsImg(v.ActivityId) // } // //} // 生成活动分享到朋友圈的图片 func MakeActivityMomentsImg(activityId int) { var err error //time.Sleep(3*time.Second) // 有时候同时添加多个活动,延迟三秒 defer func() { if err != nil { fmt.Println("err:", err) go alarm_msg.SendAlarmMsg("生成活动分享到朋友圈的图片失败,MakeActivityMomentsImg Err:"+err.Error()+"活动ID"+strconv.Itoa(activityId), 3) } }() detail, e := cygx.GetAddActivityInfoById(activityId) if e != nil { err = errors.New("GetCygxReportSelectionInfoById, Err: " + e.Error()) return } // 不是研选活动不生成图片 if detail.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN { return } var configCode string if detail.IsResearchPoints == 1 { configCode = "activity_moments_img_points_html" // 扣点活动 } else { configCode = "activity_moments_img_html" // 非扣点活动 } detailConfig, e := cygx.GetCygxConfigDetailByCode(configCode) if e != nil { err = errors.New("GetCygxConfigDetailByCode 获取生成活动分享到朋友圈的图片格式信息失败, Err: " + e.Error()) return } configValue := detailConfig.ConfigValue configValue = strings.Replace(configValue, "{{Title}}", detail.ActivityName, -1) configValue = strings.Replace(configValue, "{{ActivityTypeName}}", detail.ActivityTypeName, -1) configValue = strings.Replace(configValue, "{{Label}}", detail.Label, -1) configValue = strings.Replace(configValue, "{{ActivityTimeText}}", detail.ActivityTimeText, -1) htm2ImgReq := make(map[string]interface{}) htm2ImgReq["html_content"] = configValue htm2ImgReq["width"] = 2250 htm2ImgReq["height"] = 3813 res, err := postHtml2Img(htm2ImgReq) if err != nil || res == nil { err = errors.New("html转图片失败: ") return } if res.Code != 200 { err = errors.New("html转图片失败: " + res.Msg) return } imgUrl := res.Data // 记录海报信息 err = cygx.UpdateCygxActivityMomentsImg(imgUrl, activityId) if err != nil { return } } // MakeMfyxActivitySigninImg 生成mfyx太阳码并上传OSS //func MakeMfyxActivitySigninImg(activityId int) (imgUrl string, err error) { // var msg string // defer func() { // if err != nil || msg != "" { // fmt.Println(err) // utils.FileLog.Info("MakeMfyxActivitySigninImg 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.WxMfyxAppId, utils.WxMfyxAppSecret) // 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 //}