sunlibo 2 年之前
當前提交
d118925f6f
共有 1 個文件被更改,包括 143 次插入0 次删除
  1. 143 0
      resource_channel/resource_channel.go

+ 143 - 0
resource_channel/resource_channel.go

@@ -0,0 +1,143 @@
+package resource_channel
+
+import (
+	"bytes"
+	"encoding/json"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ResourceAssessment struct {
+	ID           uint      `gorm:"primaryKey" json:"id"` // 留学评估表
+	DataType     uint8     `json:"data_type"`            // 1.网课 2.api资源 3.专题页 4.工作台录入 5.后台录入 6 小程序
+	ChatID       string    `json:"chat_id"`              // 会话id
+	Channel      int       `json:"channel"`              // 渠道id
+	Category     int       `json:"category"`             // 分类id
+	CreatedAt    time.Time `json:"created_at"`           // 数据创建时间
+	ReferPageURL string    `json:"refer_page_url"`       // 来源网址
+	URL          string    `json:"url"`                  // 落地页地址
+	ChatURL      string    `json:"chat_url"`             // 对话发起页
+	GrUserId     string    `json:"gr_user_id"`           // 神策distinct_id
+}
+
+type ChannelCategory struct {
+	Channel  int
+	Category int
+}
+
+// 渠道归因处理
+func GetChannel(assessment ResourceAssessment) ChannelCategory {
+	var channel int
+	var category int
+
+	if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") && (strings.Contains(assessment.ReferPageURL, "daomeng") || strings.Contains(assessment.ChatURL, "daomeng")) {
+		channel = 38
+		category = 201
+	} else if assessment.DataType == 1 {
+		channel = 26
+		category = 121
+	} else if assessment.DataType == 5 || assessment.DataType == 7 {
+		channel = assessment.Channel
+		category = assessment.Category
+	} else if assessment.DataType == 2 {
+		if strings.Contains(assessment.URL, "link") {
+			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1])
+			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2])
+		} else if strings.Contains(assessment.ReferPageURL, "link") {
+			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
+			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
+		} else {
+			channel = assessment.Channel
+			category = assessment.Category
+		}
+	} else if assessment.DataType == 3 || ((assessment.Channel == 5 || assessment.Channel == 7) && assessment.ChatID != "") {
+		if !strings.Contains(assessment.URL, "utm") && !strings.Contains(assessment.ChatURL, "utm") && !strings.Contains(assessment.ReferPageURL, "utm") {
+			layout := "2006-01-02 15:04:05"
+			startTime := assessment.CreatedAt.Add(-1 * time.Hour)
+			start := startTime.Format(layout)
+			end := assessment.CreatedAt.Format(layout)
+			sql := "select $url from events where distinct_id = '" + assessment.GrUserId + "'and event = '$pageview' and time between '" + start + "' and '" + end + "' order by time limit 1"
+			url := getSensorsData(sql)
+			if url == "https://www.jjl.cn/" || url == "https://m.jjl.cn/" {
+				channel = 7
+				category = 126
+			} else {
+				channel = 5
+				category = 11
+			}
+		} else {
+			var PrefixUrl string
+			var PrefixReferPageUrl string
+			if !strings.Contains(assessment.URL, "https") {
+				PrefixUrl = "https://wx.com" + assessment.URL
+			}
+			if !strings.Contains(assessment.ReferPageURL, "https") {
+				PrefixReferPageUrl = "https://wx.com" + assessment.ReferPageURL
+			}
+			if strings.Contains(PrefixUrl, "link") {
+				channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixUrl, "link")[1], "form")[0], "_")[1])
+				category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixUrl, "link")[1], "form")[0], "_")[2])
+			} else if strings.Contains(PrefixReferPageUrl, "link") {
+				channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixReferPageUrl, "link")[1], "form")[0], "_")[1])
+				category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(PrefixReferPageUrl, "link")[1], "form")[0], "_")[2])
+			} else {
+				channel = 7
+				category = 126
+			}
+		}
+	} else if assessment.DataType == 4 {
+		if strings.Contains(assessment.ChatURL, "link") {
+			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[1])
+			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[2])
+		} else if strings.Contains(assessment.ReferPageURL, "link") {
+			channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
+			category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
+		} else {
+			channel = 7
+			category = 126
+		}
+	}
+	if channel == 0 {
+		channel = 5
+	}
+	if category == 0 {
+		channel = 11
+	}
+	var channelCategory ChannelCategory
+	channelCategory.Channel = channel
+	channelCategory.Category = category
+	return channelCategory
+}
+
+// Sensors 神策数据结构体
+type Sensors struct {
+	Url string `json:"$url"`
+}
+
+// 访问神策API
+func getSensorsData(sql string) string {
+	sensorsUrl := "https://sensorsview.jjl.cn/api/sql/query?token=128d837f466684101710cfb308e7556de975b717c6c2465ba5fc2836d57a64c8&project=production&type=impala&q=" + url.QueryEscape(sql) + "&format=json"
+	data := []byte("")
+	req, err := http.NewRequest("POST", sensorsUrl, bytes.NewBuffer(data))
+	if err != nil {
+		return err.Error()
+	}
+	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return err.Error()
+	}
+	defer resp.Body.Close()
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return err.Error()
+	}
+	var sensors Sensors
+	json.Unmarshal([]byte(string(respBody)), &sensors)
+	return sensors.Url
+}