package resourceChannel import ( "encoding/json" "github.com/go-redis/redis" "golang.org/x/net/context" "log" "strconv" "strings" "time" ) func redisCli() *redis.Client { client := redis.NewClient(&redis.Options{ Addr: coo.RedisHost, // Redis地址 Password: "", // Redis密码,默认为空 DB: 1, // 使用哪个数据库,默认为0 }) _, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) defer cancel() return client } 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 SemJsChatRecord struct { ChatID int64 `gorm:"column:CHAT_ID"` CreateTime time.Time `gorm:"column:CREATE_TIME"` ReferPage string `gorm:"type:text;column:REFER_PAGE"` ChatURL string `gorm:"type:text;column:CHAT_URL"` ChannleID int `gorm:"column:CHANNLE_ID"` CategoryID int `gorm:"column:CATEGORY_ID"` GrUserID string `gorm:"column:gr_user_id"` } type ChannelCategory struct { Channel int Category int } // GetChannel 表单渠道归因处理 func GetChannel(assessment ResourceAssessment) ChannelCategory { log.Printf("%v", assessment) // 获取神策URL(不包含utm) cc, _ := redisCli().Get("website:" + assessment.GrUserId).Result() var websiteUrl SensorsData json.Unmarshal([]byte(cc), &websiteUrl) // 到梦解析 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")) { log.Printf("解析到梦") assessment.Channel = 38 assessment.Category = 201 return ChannelCategory{assessment.Channel, assessment.Category} } // 网课解析 if assessment.DataType == 1 { log.Printf("解析网课") assessment.Channel = 26 assessment.Category = 121 return ChannelCategory{assessment.Channel, assessment.Category} } // 小程序解析 if strings.Contains(assessment.ChatURL, "pages") && strings.Split(strings.Split(assessment.ChatURL, "?")[1], "=")[0] == "miniapp" && (strings.Contains(assessment.ChatURL, "baidu") || strings.Contains(assessment.ChatURL, "wechat")) { log.Printf("解析小程序") appType := strings.Split(strings.Split(strings.Split(assessment.ChatURL, "?")[1], "=")[1], "_")[1] if appType == "baidu" { assessment.Channel = 1 assessment.Category = 30 } else if appType == "wechat" { assessment.Channel = 8 assessment.Category = 32 } return ChannelCategory{assessment.Channel, assessment.Category} } // URL解析 if strings.Contains(assessment.URL, "link=") || strings.Contains(assessment.ReferPageURL, "link=") || strings.Contains(assessment.ChatURL, "link=") { log.Printf("解析URL") if strings.Contains(assessment.URL, "link=") { 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=") { 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 { 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]) } return ChannelCategory{assessment.Channel, assessment.Category} } // 获取神策url(包含utm) cc1, _ := redisCli().Get("sensors:" + assessment.GrUserId).Result() var utmUrl SensorsData json.Unmarshal([]byte(cc1), &utmUrl) // 神策解析 if utmUrl.Url != "" && !strings.Contains(assessment.URL, "link=") && !strings.Contains(assessment.ReferPageURL, "link=") && !strings.Contains(assessment.ChatURL, "link=") { log.Printf("解析神策") assessment.Channel = utmUrl.Channel assessment.Category = utmUrl.Category return ChannelCategory{assessment.Channel, assessment.Category} } // 搜索引擎SEO,外链解析 if assessment.ReferPageURL != "" && !strings.Contains(assessment.ReferPageURL, "https://www.jjl.cn/") && !strings.Contains(assessment.ReferPageURL, "https://m.jjl.cn/") { log.Printf("解析SEO") assessment.Channel = 5 assessment.Category = 11 return ChannelCategory{assessment.Channel, assessment.Category} } // 官网自然访问解析 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/") { log.Printf("解析官网") assessment.Channel = 7 assessment.Category = 126 return ChannelCategory{assessment.Channel, assessment.Category} } log.Printf("默认解析为SEO") assessment.Channel = 5 assessment.Category = 11 return ChannelCategory{assessment.Channel, assessment.Category} } // GetChatChannel 会话渠道归因处理 func GetChatChannel(chat SemJsChatRecord) ChannelCategory { log.Printf("%v", chat) // 获取神策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" && (strings.Contains(chat.ChatURL, "baidu") || strings.Contains(chat.ChatURL, "wechat")) { log.Printf("小程序解析") log.Printf(chat.ChatURL) 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 } return ChannelCategory{chat.ChannleID, chat.CategoryID} } // 到梦解析 if !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") && (strings.Contains(chat.ReferPage, "daomeng") || strings.Contains(chat.ChatURL, "daomeng")) { log.Printf("到梦解析") chat.ChannleID = 38 chat.CategoryID = 201 return ChannelCategory{chat.ChannleID, chat.CategoryID} } // URL解析 if strings.Contains(chat.ChatURL, "link=") || strings.Contains(chat.ReferPage, "link=") { log.Printf("解析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 { 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 ChannelCategory{chat.ChannleID, chat.CategoryID} } // 神策解析 if utmUrl.Url != "" && !strings.Contains(chat.ReferPage, "link=") && !strings.Contains(chat.ChatURL, "link=") { log.Printf("解析神策") chat.ChannleID = utmUrl.Channel chat.CategoryID = utmUrl.Category return ChannelCategory{chat.ChannleID, chat.CategoryID} } // 搜索引擎SEO,外链解析 if chat.ReferPage != "" && !strings.Contains(chat.ReferPage, "https://www.jjl.cn/") && !strings.Contains(chat.ReferPage, "https://m.jjl.cn/") { log.Printf("解析SEO") chat.ChannleID = 5 chat.CategoryID = 11 return ChannelCategory{chat.ChannleID, chat.CategoryID} } // 官网自然访问解析 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/") { log.Printf("解析官网") chat.ChannleID = 7 chat.CategoryID = 126 return ChannelCategory{chat.ChannleID, chat.CategoryID} } log.Printf("默认解析为SEO") chat.ChannleID = 5 chat.CategoryID = 11 return ChannelCategory{chat.ChannleID, chat.CategoryID} } type SensorsData struct { DistinctId string `json:"distinctID"` Channel int `json:"channel"` Category int `json:"category"` Url string `json:"url"` } //func main() { // var assessment []ResourceAssessment // lib.GetDbInstance().Where("DATE(created_at) >= '2023-01-01'").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) // } //}