Files
wechat_ipad_pro/srv/websrv/tasktool.go
2026-02-17 13:06:23 +08:00

127 lines
3.5 KiB
Go

package websrv
import (
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"reflect"
"strconv"
"time"
"xiawan/wx/clientsdk/baseutils"
"xiawan/wx/srv/srvconfig"
)
func createParamData(paramMap map[string]string) []byte {
retString := ""
for key, value := range paramMap {
retString = retString + key + "=" + value + "&"
}
retBytes := []byte(retString)
count := len(retBytes)
retBytes = retBytes[0 : count-1]
return retBytes
}
func getBaseParamMap(taskInfo *TaskInfo) map[string]string {
retMap := make(map[string]string)
curTime := strconv.Itoa(int(time.Now().UnixNano() / 1000000000))
head := curTime + taskInfo.SignKey
hsWebTime := curTime + baseutils.RandomBigHexString(20)
apiKey := baseutils.Md5Value(head)
retMap["name"] = taskInfo.Name
retMap["app_number"] = taskInfo.AppNumber
retMap["apikey"] = apiKey
retMap["hswebtime"] = hsWebTime
retMap["time"] = curTime
return retMap
}
// UploadTaskStatus 上传任务状态
func UploadTaskStatus(webTask *WebTask) error {
baseParamMap := getBaseParamMap(webTask.TaskInfo)
baseParamMap["name"] = webTask.UserInfo.NickName
baseParamMap["task_id"] = webTask.TaskInfo.TaskID
baseParamMap["account"] = webTask.UserInfo.WxId
baseParamMap["headimg"] = webTask.UserInfo.HeadURL
baseParamMap["status"] = webTask.Status
if webTask.Status == TaskStateLoginSuccess {
tmpToken := base64.StdEncoding.EncodeToString(webTask.UserInfo.AutoAuthKey)
baseParamMap["token"] = tmpToken
baseParamMap["data"] = ""
baseParamMap["autoauth"] = "data=" + "token=" + tmpToken
}
paramBytes := createParamData(baseParamMap)
respData, err := TaskPost("http://"+srvconfig.GlobalSetting.WebDomain+"/statistic/Wechat/upd.html", paramBytes)
if err != nil {
baseutils.PrintLog(err.Error())
return err
}
resp := &UploadTaskStatusResp{}
err = json.Unmarshal(respData, resp)
if err != nil {
return err
}
// 如果显示44
if resp.Code == 44 {
return nil
}
return nil
}
// ReportWechatStatus 上报状态
func ReportWechatStatus(webTask *WebTask, tmpType string) error {
baseParamMap := getBaseParamMap(webTask.TaskInfo)
baseParamMap["name"] = webTask.UserInfo.NickName
baseParamMap["uuid"] = webTask.UserInfo.UUID
baseParamMap["task_id"] = webTask.TaskInfo.TaskID
baseParamMap["account"] = webTask.UserInfo.WxId
baseParamMap["task_type"] = "2"
baseParamMap["service"] = srvconfig.GlobalSetting.WebDomainNum
baseParamMap["type"] = tmpType
connectInfo := map[string]interface{}{}
connectInfo["info"] = baseParamMap
// 复制所有能够被序列化的字段
for key, value := range webTask.ConnectInfo {
switch v := value.(type) {
case func(): // 这里检查并排除不支持的字段
fmt.Println("Skipping function:", key)
default:
// 判断是否是基本类型
if reflect.TypeOf(v).Kind() == reflect.String || reflect.TypeOf(v).Kind() == reflect.Int || reflect.TypeOf(v).Kind() == reflect.Bool {
connectInfo[key] = v
}
}
}
// 将参数转换为 JSON 格式
paramBytes, err := json.Marshal(connectInfo)
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return err
}
if srvconfig.GlobalSetting.WebDomain == "" {
return nil
}
respData, err := TaskPostJson("http://"+srvconfig.GlobalSetting.WebDomain+"/statistic/Wechat/reportStatus", paramBytes)
if err != nil {
baseutils.PrintLog(err.Error())
return err
}
resp := &UploadTaskStatusResp{}
err = json.Unmarshal(respData, resp)
if err != nil {
return err
}
// 上报错误
if resp.Code == 44 {
return errors.New("上报错误")
}
return nil
}