package controller import ( "encoding/xml" "log" "net/http" "net/url" "os" "path/filepath" "strings" "xiawan/wx/api/req" "xiawan/wx/api/service" "xiawan/wx/api/vo" "github.com/gin-gonic/gin" ) // GetMyQrCode 获取我的二维码 func GetMyQrCode(ctx *gin.Context) { reqModel := new(req.GetQrCodeModel) queryKey, isExist := ctx.GetQuery("key") if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" { //确保每次都有Key ctx.JSON(http.StatusOK, vo.NewFailUUId("")) return } if !validateData(ctx, &reqModel) { return } result := service.GetMyQrCodeService(queryKey, *reqModel) ctx.JSON(http.StatusOK, result) } // GetPeopleNearbyApi 查看附近的人 func GetPeopleNearbyApi(ctx *gin.Context) { reqModel := new(req.PeopleNearbyModel) queryKey, isExist := ctx.GetQuery("key") if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" { //确保每次都有Key ctx.JSON(http.StatusOK, vo.NewFailUUId("")) return } if !validateData(ctx, &reqModel) { return } result := service.GetPeopleNearbyService(queryKey, *reqModel) ctx.JSON(http.StatusOK, result) } // UpdateCmdStatusApi 更新指令状态, key 为指令 id,Value 为指令状态 0|1,ValueStr 为字符串值 func UpdateCmdStatusApi(ctx *gin.Context) { reqModel := new(req.ModifyCmdStatusModelNew) queryKey, isExist := ctx.GetQuery("key") if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" { //确保每次都有Key ctx.JSON(http.StatusOK, vo.NewFailUUId("")) return } if !validateData(ctx, &reqModel) { return } result := service.UpdateCmdStatusService(queryKey, *reqModel) ctx.JSON(http.StatusOK, result) } // GetProjectFullPathApi 获取项目完整路径 func GetProjectFullPathApi(ctx *gin.Context) { execPath, err := os.Executable() // 获取可执行文件的路径 if err != nil { log.Fatalf("Failed to get executable path: %v", err) ctx.JSON(http.StatusNotFound, "") return } execPath, err = filepath.EvalSymlinks(execPath) // 解析符号链接,获取真实路径 if err != nil { log.Fatalf("Failed to evaluate symlinks: %v", err) ctx.JSON(http.StatusNotFound, "") return } // 获取可执行文件所在目录 dir := filepath.Dir(execPath) ctx.JSON(http.StatusOK, dir) } // 企微图片下载 func QWImageDownloadApi(ctx *gin.Context) { reqModel := new(req.DownloadQWImageModel) queryKey, isExist := ctx.GetQuery("key") if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" { ctx.JSON(http.StatusOK, vo.NewFailUUId("")) return } if !validateData(ctx, &reqModel) { return } // 解析XML,提取 AesKey / FileURL / FileType type imageXML struct { XMLName xml.Name `xml:"msg"` Img struct { AESKey string `xml:"aeskey,attr"` CdnMidImgURL string `xml:"cdnmidimgurl,attr"` CdnThumbURL string `xml:"cdnthumburl,attr"` TpURL string `xml:"tpurl,attr"` TpThumbAESKey string `xml:"tpthumbaeskey,attr"` } `xml:"img"` } var parsed imageXML if err := xml.Unmarshal([]byte(reqModel.Xml), &parsed); err != nil { ctx.JSON(http.StatusOK, vo.NewFail("XML解析失败:"+err.Error())) return } aesKey := strings.TrimSpace(parsed.Img.AESKey) if aesKey == "" { aesKey = strings.TrimSpace(parsed.Img.TpThumbAESKey) } fileURL := "" tpurl := strings.TrimSpace(parsed.Img.TpURL) if tpurl != "" { if u, err := url.Parse(tpurl); err == nil { f := u.Query().Get("f") if f != "" { fileURL = f } else { // 回退为完整tpurl(如果缺少f参数) fileURL = tpurl } } else { fileURL = tpurl } } else { fileURL = strings.TrimSpace(parsed.Img.CdnMidImgURL) if fileURL == "" { fileURL = strings.TrimSpace(parsed.Img.CdnThumbURL) } } if aesKey == "" || fileURL == "" { ctx.JSON(http.StatusOK, vo.NewFail("参数错误:无法从XML提取必要字段(AesKey或FileURL)")) return } model := req.DownMediaModel{ AesKey: aesKey, FileURL: fileURL, FileType: 1, // 默认 1 } result := service.SendCdnDownloadService(queryKey, model) ctx.JSON(http.StatusOK, result) }