Bläddra i källkod

更新 'resourceChannel/resourceChannel.go'

溯源规则修改,引入规则引擎
go_dev 1 år sedan
förälder
incheckning
b9f894348f
1 ändrade filer med 194 tillägg och 125 borttagningar
  1. 194 125
      resourceChannel/resourceChannel.go

+ 194 - 125
resourceChannel/resourceChannel.go

@@ -2,6 +2,9 @@ package resourceChannel
 
 import (
 	"encoding/json"
+	"github.com/bilibili/gengine/builder"
+	gengineContext "github.com/bilibili/gengine/context"
+	"github.com/bilibili/gengine/engine"
 	"github.com/go-redis/redis"
 	"golang.org/x/net/context"
 	"strconv"
@@ -11,9 +14,9 @@ import (
 
 func redisCli() *redis.Client {
 	client := redis.NewClient(&redis.Options{
-		Addr:     coo.RedisHost, // Redis地址
-		Password: "",            // Redis密码,默认为空
-		DB:       1,             // 使用哪个数据库,默认为0
+		Addr:     "192.168.204.180:3377", // Redis地址
+		Password: "",                     // Redis密码,默认为空
+		DB:       1,                      // 使用哪个数据库,默认为0
 	})
 	_, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
 	defer cancel()
@@ -48,142 +51,189 @@ type ChannelCategory struct {
 	Category int
 }
 
-// GetChatChannel 会话渠道归因处理
-func GetChatChannel(chat SemJsChatRecord) ChannelCategory {
-	channel := 7
-	category := 126
-	if strings.Contains(chat.ChatURL, "pages") && strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[0] == "miniapp" {
-		appType := strings.Split(strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[1], "_")[1]
+// AssessmentAnalysisRule 表单解析
+func (a ResourceAssessment) AssessmentAnalysisRule(assessment *ResourceAssessment) {
+	// 获取神策URL(不包含utm)
+	cc, _ := redisCli().Get("website:" + assessment.GrUserId).Result()
+	var websiteUrl SensorsData
+	json.Unmarshal([]byte(cc), &websiteUrl)
+	// 获取神策url(包含utm)
+	cc1, _ := redisCli().Get("sensors:" + assessment.GrUserId).Result()
+	var utmUrl SensorsData
+	json.Unmarshal([]byte(cc1), &utmUrl)
+	// 到梦解析
+	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")) {
+		println("解析到梦")
+		assessment.Channel = 38
+		assessment.Category = 201
+		return
+	}
+	// 网课解析
+	if assessment.DataType == 1 {
+		println("解析网课")
+		assessment.Channel = 26
+		assessment.Category = 121
+		return
+	}
+	// 小程序解析
+	if strings.Contains(assessment.ChatURL, "pages") && strings.Split(strings.Split(assessment.ChatURL, "?")[1], "=")[0] == "miniapp" {
+		println("解析小程序")
+		appType := strings.Split(strings.Split(strings.Split(assessment.ChatURL, "?")[1], "=")[1], "_")[1]
 		if appType == "baidu" {
-			channel = 1
-			category = 30
+			assessment.Channel = 1
+			assessment.Category = 30
 		} else if appType == "wechat" {
-			channel = 8
-			category = 32
-		}
-	} else if !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") && (strings.Contains(chat.ReferPage, "daomeng") || strings.Contains(chat.ChatURL, "daomeng")) {
-		channel = 38
-		category = 201
-	} else if chat.ChannleID == 5 || chat.ChannleID == 7 && !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") {
-		// redis获取渠道信息
-		key := "sensors:" + chat.GrUserID
-		cc, _ := redisCli().Get(key).Result()
-		var sensors SensorsData
-		json.Unmarshal([]byte(cc), &sensors)
-		if sensors.Channel > 0 {
-			channel = sensors.Channel
-			category = sensors.Category
-		} else if sensors.Url == "https://www.jjl.cn/" || sensors.Url == "https://m.jjl.cn/" {
-			channel = 7
-			category = 126
-		} else {
-			channel = 5
-			category = 11
-		}
-	} else {
-		if strings.Contains(strings.ToLower(chat.ChatURL), "link") {
-			println(chat.ChatURL)
-			channelIDString := strings.Split(strings.Split(chat.ChatURL, "link")[1], "_")[1]
-			categoryIDString := strings.Split(strings.Split(chat.ChatURL, "link")[1], "_")[2]
-			channel, _ = strconv.Atoi(channelIDString)
-			category, _ = strconv.Atoi(categoryIDString)
-		} else if strings.Contains(strings.ToLower(chat.ReferPage), "link") {
-			channelIDString := strings.Split(strings.Split(chat.ReferPage, "link")[1], "_")[1]
-			categoryIDString := strings.Split(strings.Split(chat.ReferPage, "link")[1], "_")[2]
-			channel, _ = strconv.Atoi(channelIDString)
-			category, _ = strconv.Atoi(categoryIDString)
-		} else if !strings.Contains(strings.ToLower(chat.ReferPage), "link") {
-			channel = 7
-			category = 126
+			assessment.Channel = 8
+			assessment.Category = 32
 		}
+		return
 	}
-	var channelCategory ChannelCategory
-	channelCategory.Channel = channel
-	channelCategory.Category = category
-	return channelCategory
-}
-
-// GetChannel 表单渠道归因处理
-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 {
+	// URL解析
+	if strings.Contains(assessment.URL, "link") || strings.Contains(assessment.ReferPageURL, "link") || strings.Contains(assessment.ChatURL, "link") {
+		println("解析URL")
 		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])
+			assessment.Channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1])
+			assessment.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])
+			assessment.Channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
+			assessment.Category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
 		} else {
-			channel = assessment.Channel
-			category = assessment.Category
+			assessment.Channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[1])
+			assessment.Category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[2])
 		}
-	} 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") {
-			key := "sensors:" + assessment.GrUserId
-			cc, _ := redisCli().Get(key).Result()
-			var sensors SensorsData
-			json.Unmarshal([]byte(cc), &sensors)
-			if sensors.Channel > 0 {
-				channel = sensors.Channel
-				category = sensors.Category
-			} else if sensors.Url == "https://www.jjl.cn/" || sensors.Url == "https://m.jjl.cn/" {
-				channel = 7
-				category = 126
-			} else {
-				channel = 5
-				category = 11
-			}
-		} else {
-			if !strings.Contains(assessment.URL, "https") {
-				assessment.URL = "https://wx.com" + assessment.URL
-			}
-			if !strings.Contains(assessment.ReferPageURL, "https") {
-				assessment.ReferPageURL = "https://wx.com" + assessment.ReferPageURL
-			}
-			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 = 7
-				category = 126
-			}
+		return
+	}
+	// 神策解析
+	if utmUrl.Url != "" && !strings.Contains(assessment.URL, "link") && !strings.Contains(assessment.ReferPageURL, "link") && !strings.Contains(assessment.ChatURL, "link") {
+		println("解析神策")
+		assessment.Channel = utmUrl.Channel
+		assessment.Category = utmUrl.Category
+		return
+	}
+	// 搜索引擎SEO,外链解析
+	if assessment.ReferPageURL != "" && !strings.Contains(assessment.ReferPageURL, "https://www.jjl.cn/") && !strings.Contains(assessment.ReferPageURL, "https://m.jjl.cn/") {
+		println("解析SEO")
+		assessment.Channel = 5
+		assessment.Category = 11
+		return
+	}
+	// 官网自然访问解析
+	if strings.Contains(assessment.URL, "https://www.jjl.cn/") || strings.Contains(assessment.URL, "https://m.jjl.cn/") ||
+		strings.Contains(assessment.ReferPageURL, "https://www.jjl.cn/") || strings.Contains(assessment.ReferPageURL, "https://m.jjl.cn/") ||
+		strings.Contains(assessment.ChatURL, "https://www.jjl.cn/") || strings.Contains(assessment.ChatURL, "https://m.jjl.cn/") ||
+		strings.Contains(utmUrl.Url, "https://www.jjl.cn/") || strings.Contains(utmUrl.Url, "https://m.jjl.cn/") {
+		println("解析官网")
+		assessment.Channel = 7
+		assessment.Category = 126
+		return
+	}
+	println("默认解析为SEO")
+	assessment.Channel = 5
+	assessment.Category = 11
+}
+
+// ChatAnalysisRule 表单解析规则
+func (c SemJsChatRecord) ChatAnalysisRule(chat *SemJsChatRecord) {
+	// 获取神策URL(不包含utm)
+	cc, _ := redisCli().Get("website:" + chat.GrUserID).Result()
+	var websiteUrl SensorsData
+	json.Unmarshal([]byte(cc), &websiteUrl)
+	// 获取神策url(包含utm)
+	cc1, _ := redisCli().Get("sensors:" + chat.GrUserID).Result()
+	var utmUrl SensorsData
+	json.Unmarshal([]byte(cc1), &utmUrl)
+	// 小程序解析
+	if strings.Contains(chat.ChatURL, "pages") && strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[0] == "miniapp" {
+		println("小程序解析")
+		appType := strings.Split(strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[1], "_")[1]
+		if appType == "baidu" {
+			chat.ChannleID = 1
+			chat.CategoryID = 30
+		} else if appType == "wechat" {
+			chat.ChannleID = 8
+			chat.CategoryID = 32
 		}
-	} 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])
+		return
+	}
+	// 到梦解析
+	if !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") && (strings.Contains(chat.ReferPage, "daomeng") || strings.Contains(chat.ChatURL, "daomeng")) {
+		println("到梦解析")
+		chat.ChannleID = 38
+		chat.CategoryID = 201
+		return
+	}
+	// URL解析
+	if strings.Contains(chat.ChatURL, "link") || strings.Contains(chat.ReferPage, "link") {
+		println("解析URL")
+		if strings.Contains(chat.ChatURL, "link") {
+			chat.ChannleID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ChatURL, "link")[1], "form")[0], "_")[1])
+			chat.CategoryID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ChatURL, "link")[1], "form")[0], "_")[2])
 		} else {
-			channel = 7
-			category = 126
+			chat.ChannleID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ReferPage, "link")[1], "form")[0], "_")[1])
+			chat.ChannleID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ReferPage, "link")[1], "form")[0], "_")[2])
 		}
+		return
 	}
-	if channel == 0 {
-		channel = 5
+	// 神策解析
+	if utmUrl.Url != "" && !strings.Contains(chat.ReferPage, "link") && !strings.Contains(chat.ChatURL, "link") {
+		println("解析神策")
+		chat.ChannleID = utmUrl.Channel
+		chat.CategoryID = utmUrl.Category
+		return
 	}
-	if category == 0 {
-		category = 11
+	// 搜索引擎SEO,外链解析
+	if chat.ReferPage != "" && !strings.Contains(chat.ReferPage, "https://www.jjl.cn/") && !strings.Contains(chat.ReferPage, "https://m.jjl.cn/") {
+		println("解析SEO")
+		chat.ChannleID = 5
+		chat.CategoryID = 11
+		return
 	}
-	var channelCategory ChannelCategory
-	channelCategory.Channel = channel
-	channelCategory.Category = category
-	return channelCategory
+	// 官网自然访问解析
+	if strings.Contains(chat.ReferPage, "https://www.jjl.cn/") || strings.Contains(chat.ReferPage, "https://m.jjl.cn/") ||
+		strings.Contains(chat.ChatURL, "https://www.jjl.cn/") || strings.Contains(chat.ChatURL, "https://m.jjl.cn/") ||
+		strings.Contains(utmUrl.Url, "https://www.jjl.cn/") || strings.Contains(utmUrl.Url, "https://m.jjl.cn/") {
+		println("解析官网")
+		chat.ChannleID = 7
+		chat.CategoryID = 126
+		return
+	}
+	println("默认解析为SEO")
+	chat.ChannleID = 5
+	chat.CategoryID = 11
+}
+
+const AssessmentAnalysisRule = `
+rule "AssessmentAnalysisRule" "表单解析" salience  1
+begin
+	assessment.AssessmentAnalysisRule(assessment)
+end`
+
+const ChatAnalysisRule = `
+rule "ChatAnalysisRule" "会话解析" salience  1
+begin
+	chat.ChatAnalysisRule(chat)
+end`
+
+// GetChannel 表单渠道归因处理
+func GetChannel(assessment ResourceAssessment) ChannelCategory {
+	dataContext := gengineContext.NewDataContext()
+	dataContext.Add("assessment", &assessment)
+	ruleBuilder := builder.NewRuleBuilder(dataContext)
+	ruleBuilder.BuildRuleFromString(AssessmentAnalysisRule)
+	engine := engine.NewGengine()
+	engine.Execute(ruleBuilder, true)
+	return ChannelCategory{assessment.Channel, assessment.Category}
+}
+
+// GetChatChannel 会话渠道归因处理
+func GetChatChannel(chat SemJsChatRecord) ChannelCategory {
+	dataContext := gengineContext.NewDataContext()
+	dataContext.Add("chat", &chat)
+	ruleBuilder := builder.NewRuleBuilder(dataContext)
+	ruleBuilder.BuildRuleFromString(ChatAnalysisRule)
+	engine := engine.NewGengine()
+	engine.Execute(ruleBuilder, true)
+	return ChannelCategory{chat.ChannleID, chat.CategoryID}
 }
 
 type SensorsData struct {
@@ -192,3 +242,22 @@ type SensorsData struct {
 	Category   int    `json:"category"`
 	Url        string `json:"url"`
 }
+
+//func main() {
+//	//var assessment []ResourceAssessment
+//	//lib.GetDbInstance().Where("DATE(created_at) >= '2023-05-23' and id = 382346").Find(&assessment)
+//	//for _, value := range assessment {
+//	//	cc := GetChannel(value)
+//	//	println(cc.Channel)
+//	//	println(cc.Category)
+//	//	println("END")
+//	//}
+//
+//	var chat []SemJsChatRecord
+//	lib.GetDbInstance().Where("DATE(CREATE_TIME) >= '2023-01-01'").Find(&chat)
+//	for _, value := range chat {
+//		println(value.ChatID)
+//		cc := GetChatChannel(value)
+//		println(cc.Channel, cc.Category)
+//	}
+//}