Files
wechat_ipad_pro/api/controller/otherController.go

159 lines
4.1 KiB
Go
Raw Normal View History

2026-02-17 13:06:23 +08:00
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 为指令 idValue 为指令状态 0|1ValueStr 为字符串值
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)
}