index.go 3.28 KB
package thinkingdata

import (
	"crypto/tls"
	"encoding/json"
	"errors"
	"fmt"
	"gitee.com/lxgow/lxconv"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/httplib"
	lconv "github.com/lixu-any/go-tools/conv"
	"time"
)

// index
// 创建时间:2023/10/23 10:06
// 创建人:lixu

// index 数数科技
// 创建时间:2023/7/18 16:03
// 创建人:lixu

// GetNowDateTime 当前日期时间
func GetNowDateTime() string {
	tim := time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05")
	return fmt.Sprintf("%s", tim)
}

type MThinkDataConfig struct {
	Url   string `json:"url"`
	Debug int    `json:"debug"`
}

type MRespData struct {
	Msg  string `json:"Msg"`
	Code int    `json:"code"`
}

var THINKINGDATACONFIG MThinkDataConfig

// InitThinkData 初始化数数
func InitThinkData() (err error) {
	thinkingdata, _ := beego.AppConfig.GetSection("thinkingdata")
	THINKINGDATACONFIG.Url = thinkingdata["url"]
	THINKINGDATACONFIG.Debug = lxconv.ParseInt(thinkingdata["debug"])
	return
}

// AddOneData 数据上报
func AddOneData(appid, account_id, distinct_id string, event string, data map[string]interface{}, typ string) (resp MRespData, err error) {

	_data := map[string]interface{}{
		"#type": typ,
		//"#event_name":  event,
		"#time":        GetNowDateTime(),
		"#account_id":  account_id,
		"#distinct_id": distinct_id,
		"properties":   data,
	}

	if typ == "track" && event != "" {
		_data["#event_name"] = event
	}

	postdata := map[string]interface{}{
		"appid": appid,
		"debug": THINKINGDATACONFIG.Debug,
		"data":  _data,
	}

	req := httplib.Post(THINKINGDATACONFIG.Url + "/sync_json")

	req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})

	_, err = req.JSONBody(&postdata)
	if err != nil {
		err = errors.New("thinkingdata-AddOneData  req.JSONBody() error::" + err.Error() + "::" + lconv.JsonEncode(postdata))
		return
	}

	var (
		bytes []byte
	)

	bytes, err = req.Bytes()
	if err != nil {
		err = errors.New("thinkingdata-AddOneData  req.Bytes() error::" + err.Error() + "::" + lconv.JsonEncode(postdata) + "::" + string(bytes))
		return
	}

	_ = json.Unmarshal(bytes, &resp)

	if resp.Code != 0 {
		err = errors.New("thinkingdata-AddOneData  resp.Code error:: " + lconv.JsonEncode(postdata) + "::" + string(bytes))
		return
	}

	return
}

// TrackOne 向事件表传入一个事件
func TrackOne(appid, account_id string, event string, data map[string]interface{}) (resp MRespData, err error) {
	return AddOneData(appid, account_id, "", event, data, "track")
}

// UserSet 对用户表进行操作,覆盖一个或多个用户属性,如果该属性已有值存在,覆盖先前值
func UserSet(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {
	return AddOneData(appid, account_id, "", "", data, "user_set")
}

// UserSetOnce 对用户表进行操作,初始化一个或多个用户属性,如果该属性已有值存在,则忽略本次操作
func UserSetOnce(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {
	return AddOneData(appid, account_id, "", "", data, "user_setOnce")
}

// UserAdd 对用户表进行操作,为一个或多个数值型用户属性做累加计算
func UserAdd(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {
	return AddOneData(appid, account_id, "", "", data, "user_add")
}