resourceChannel.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package resourceChannel
  2. import (
  3. "encoding/json"
  4. "github.com/go-redis/redis"
  5. "golang.org/x/net/context"
  6. "log"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. func redisCli() *redis.Client {
  12. client := redis.NewClient(&redis.Options{
  13. Addr: coo.RedisHost, // Redis地址
  14. Password: "", // Redis密码,默认为空
  15. DB: 1, // 使用哪个数据库,默认为0
  16. })
  17. _, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
  18. defer cancel()
  19. return client
  20. }
  21. type ResourceAssessment struct {
  22. ID uint `gorm:"primaryKey" json:"id"` // 留学评估表
  23. DataType uint8 `json:"data_type"` // 1.网课 2.api资源 3.专题页 4.工作台录入 5.后台录入 6 小程序
  24. ChatID string `json:"chat_id"` // 会话id
  25. Channel int `json:"channel"` // 渠道id
  26. Category int `json:"category"` // 分类id
  27. CreatedAt time.Time `json:"created_at"` // 数据创建时间
  28. ReferPageURL string `json:"refer_page_url"` // 来源网址
  29. URL string `json:"url"` // 落地页地址
  30. ChatURL string `json:"chat_url"` // 对话发起页
  31. GrUserId string `json:"gr_user_id"` // 神策distinct_id
  32. }
  33. type SemJsChatRecord struct {
  34. ChatID int64 `gorm:"column:CHAT_ID"`
  35. CreateTime time.Time `gorm:"column:CREATE_TIME"`
  36. ReferPage string `gorm:"type:text;column:REFER_PAGE"`
  37. ChatURL string `gorm:"type:text;column:CHAT_URL"`
  38. ChannleID int `gorm:"column:CHANNLE_ID"`
  39. CategoryID int `gorm:"column:CATEGORY_ID"`
  40. GrUserID string `gorm:"column:gr_user_id"`
  41. }
  42. type ChannelCategory struct {
  43. Channel int
  44. Category int
  45. }
  46. // GetChannel 表单渠道归因处理
  47. func GetChannel(assessment ResourceAssessment) ChannelCategory {
  48. log.Printf("%v", assessment)
  49. // 获取神策URL(不包含utm)
  50. cc, _ := redisCli().Get("website:" + assessment.GrUserId).Result()
  51. var websiteUrl SensorsData
  52. json.Unmarshal([]byte(cc), &websiteUrl)
  53. // 到梦解析
  54. 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")) {
  55. log.Printf("解析到梦")
  56. assessment.Channel = 38
  57. assessment.Category = 201
  58. return ChannelCategory{assessment.Channel, assessment.Category}
  59. }
  60. // 网课解析
  61. if assessment.DataType == 1 {
  62. log.Printf("解析网课")
  63. assessment.Channel = 26
  64. assessment.Category = 121
  65. return ChannelCategory{assessment.Channel, assessment.Category}
  66. }
  67. // 小程序解析
  68. 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")) {
  69. log.Printf("解析小程序")
  70. appType := strings.Split(strings.Split(strings.Split(assessment.ChatURL, "?")[1], "=")[1], "_")[1]
  71. if appType == "baidu" {
  72. assessment.Channel = 1
  73. assessment.Category = 30
  74. } else if appType == "wechat" {
  75. assessment.Channel = 8
  76. assessment.Category = 32
  77. }
  78. return ChannelCategory{assessment.Channel, assessment.Category}
  79. }
  80. // URL解析
  81. if strings.Contains(assessment.URL, "link=") || strings.Contains(assessment.ReferPageURL, "link=") || strings.Contains(assessment.ChatURL, "link=") {
  82. log.Printf("解析URL")
  83. if strings.Contains(assessment.URL, "link=") {
  84. split := strings.Split(assessment.URL, "link")
  85. if strings.Contains(split[1], "form") || strings.Contains(split[1], "from") {
  86. assessment.Channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[1])
  87. assessment.Category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.URL, "link")[1], "form")[0], "_")[2])
  88. } else {
  89. assessment.Channel = 5
  90. assessment.Category = 11
  91. }
  92. } else if strings.Contains(assessment.ReferPageURL, "link=") {
  93. split := strings.Split(assessment.ReferPageURL, "link")
  94. if strings.Contains(split[1], "form") || strings.Contains(split[1], "from") {
  95. assessment.Channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[1])
  96. assessment.Category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ReferPageURL, "link")[1], "form")[0], "_")[2])
  97. } else {
  98. assessment.Channel = 5
  99. assessment.Category = 11
  100. }
  101. } else {
  102. split := strings.Split(assessment.ChatURL, "link")
  103. if strings.Contains(split[1], "form") || strings.Contains(split[1], "from") {
  104. assessment.Channel, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[1])
  105. assessment.Category, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(assessment.ChatURL, "link")[1], "form")[0], "_")[2])
  106. } else {
  107. assessment.Channel = 5
  108. assessment.Category = 11
  109. }
  110. }
  111. // 百度惠生活渠道合并
  112. if assessment.Category == 239 {
  113. assessment.Category = 292
  114. }
  115. return ChannelCategory{assessment.Channel, assessment.Category}
  116. }
  117. // 获取神策url(包含utm)
  118. cc1, _ := redisCli().Get("sensors:" + assessment.GrUserId).Result()
  119. var utmUrl SensorsData
  120. json.Unmarshal([]byte(cc1), &utmUrl)
  121. // 神策解析
  122. if utmUrl.Url != "" && !strings.Contains(assessment.URL, "link=") && !strings.Contains(assessment.ReferPageURL, "link=") && !strings.Contains(assessment.ChatURL, "link=") {
  123. log.Printf("解析神策")
  124. assessment.Channel = utmUrl.Channel
  125. assessment.Category = utmUrl.Category
  126. // 百度惠生活渠道合并
  127. if assessment.Category == 239 {
  128. assessment.Category = 292
  129. }
  130. return ChannelCategory{assessment.Channel, assessment.Category}
  131. }
  132. // 搜索引擎SEO,外链解析
  133. if assessment.ReferPageURL != "" && !strings.Contains(assessment.ReferPageURL, "https://www.jjl.cn/") && !strings.Contains(assessment.ReferPageURL, "https://m.jjl.cn/") {
  134. log.Printf("解析SEO")
  135. assessment.Channel = 5
  136. assessment.Category = 11
  137. return ChannelCategory{assessment.Channel, assessment.Category}
  138. }
  139. // 官网自然访问解析
  140. if strings.Contains(assessment.URL, "https://www.jjl.cn/") || strings.Contains(assessment.URL, "https://m.jjl.cn/") ||
  141. strings.Contains(assessment.ReferPageURL, "https://www.jjl.cn/") || strings.Contains(assessment.ReferPageURL, "https://m.jjl.cn/") ||
  142. strings.Contains(assessment.ChatURL, "https://www.jjl.cn/") || strings.Contains(assessment.ChatURL, "https://m.jjl.cn/") ||
  143. strings.Contains(utmUrl.Url, "https://www.jjl.cn/") || strings.Contains(utmUrl.Url, "https://m.jjl.cn/") {
  144. log.Printf("解析官网")
  145. assessment.Channel = 7
  146. assessment.Category = 126
  147. return ChannelCategory{assessment.Channel, assessment.Category}
  148. }
  149. log.Printf("默认解析为SEO")
  150. assessment.Channel = 5
  151. assessment.Category = 11
  152. return ChannelCategory{assessment.Channel, assessment.Category}
  153. }
  154. // GetChatChannel 会话渠道归因处理
  155. func GetChatChannel(chat SemJsChatRecord) ChannelCategory {
  156. log.Printf("%v", chat)
  157. // 获取神策URL(不包含utm)
  158. cc, _ := redisCli().Get("website:" + chat.GrUserID).Result()
  159. var websiteUrl SensorsData
  160. json.Unmarshal([]byte(cc), &websiteUrl)
  161. // 小程序解析
  162. 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")) {
  163. log.Printf("小程序解析")
  164. log.Printf(chat.ChatURL)
  165. appType := strings.Split(strings.Split(strings.Split(chat.ChatURL, "?")[1], "=")[1], "_")[1]
  166. if appType == "baidu" {
  167. chat.ChannleID = 1
  168. chat.CategoryID = 30
  169. } else if appType == "wechat" {
  170. chat.ChannleID = 8
  171. chat.CategoryID = 32
  172. }
  173. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  174. }
  175. // 到梦解析
  176. if !strings.Contains(chat.ReferPage, "utm") && !strings.Contains(chat.ChatURL, "utm") && (strings.Contains(chat.ReferPage, "daomeng") || strings.Contains(chat.ChatURL, "daomeng")) {
  177. log.Printf("到梦解析")
  178. chat.ChannleID = 38
  179. chat.CategoryID = 201
  180. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  181. }
  182. // URL解析
  183. if strings.Contains(chat.ChatURL, "link=") || strings.Contains(chat.ReferPage, "link=") {
  184. log.Printf("解析URL")
  185. if strings.Contains(chat.ChatURL, "link=") {
  186. split := strings.Split(chat.ChatURL, "link=")
  187. if strings.Contains(split[1], "form") || strings.Contains(split[1], "from") {
  188. chat.ChannleID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ChatURL, "link")[1], "form")[0], "_")[1])
  189. chat.CategoryID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ChatURL, "link")[1], "form")[0], "_")[2])
  190. } else {
  191. chat.ChannleID = 5
  192. chat.CategoryID = 11
  193. }
  194. } else {
  195. split := strings.Split(chat.ReferPage, "link=")
  196. if strings.Contains(split[1], "form") || strings.Contains(split[1], "from") {
  197. chat.ChannleID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ReferPage, "link")[1], "form")[0], "_")[1])
  198. chat.CategoryID, _ = strconv.Atoi(strings.Split(strings.Split(strings.Split(chat.ReferPage, "link")[1], "form")[0], "_")[2])
  199. } else {
  200. chat.ChannleID = 5
  201. chat.CategoryID = 11
  202. }
  203. }
  204. // 百度惠生活渠道合并
  205. if chat.CategoryID == 239 {
  206. chat.CategoryID = 292
  207. }
  208. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  209. }
  210. // 获取神策url(包含utm)
  211. cc1, _ := redisCli().Get("sensors:" + chat.GrUserID).Result()
  212. var utmUrl SensorsData
  213. json.Unmarshal([]byte(cc1), &utmUrl)
  214. // 神策解析
  215. if utmUrl.Url != "" && utmUrl.Channel > 0 && !strings.Contains(chat.ReferPage, "link=") && !strings.Contains(chat.ChatURL, "link=") {
  216. log.Printf("解析神策")
  217. chat.ChannleID = utmUrl.Channel
  218. chat.CategoryID = utmUrl.Category
  219. // 百度惠生活渠道合并
  220. if chat.CategoryID == 239 {
  221. chat.CategoryID = 292
  222. }
  223. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  224. }
  225. // 搜索引擎SEO,外链解析
  226. if chat.ReferPage != "" && !strings.Contains(chat.ReferPage, "https://www.jjl.cn/") && !strings.Contains(chat.ReferPage, "https://m.jjl.cn/") {
  227. log.Printf("解析SEO")
  228. chat.ChannleID = 5
  229. chat.CategoryID = 11
  230. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  231. }
  232. // 官网自然访问解析
  233. if strings.Contains(chat.ReferPage, "https://www.jjl.cn/") || strings.Contains(chat.ReferPage, "https://m.jjl.cn/") ||
  234. strings.Contains(chat.ChatURL, "https://www.jjl.cn/") || strings.Contains(chat.ChatURL, "https://m.jjl.cn/") ||
  235. strings.Contains(utmUrl.Url, "https://www.jjl.cn/") || strings.Contains(utmUrl.Url, "https://m.jjl.cn/") {
  236. log.Printf("解析官网")
  237. chat.ChannleID = 7
  238. chat.CategoryID = 126
  239. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  240. }
  241. log.Printf("默认解析为SEO")
  242. chat.ChannleID = 5
  243. chat.CategoryID = 11
  244. return ChannelCategory{chat.ChannleID, chat.CategoryID}
  245. }
  246. type SensorsData struct {
  247. DistinctId string `json:"distinctID"`
  248. Channel int `json:"channel"`
  249. Category int `json:"category"`
  250. Url string `json:"url"`
  251. }
  252. //func main() {
  253. // var assessment []ResourceAssessment
  254. // lib.GetDbInstance().Where("DATE(created_at) >= '2023-01-01'").Find(&assessment)
  255. // for _, value := range assessment {
  256. // cc := GetChannel(value)
  257. // println(cc.Channel)
  258. // println(cc.Category)
  259. // println("END")
  260. // }
  261. //
  262. // var chat []SemJsChatRecord
  263. // lib.GetDbInstance().Where("DATE(CREATE_TIME) >= '2023-01-01'").Find(&chat)
  264. // for _, value := range chat {
  265. // println(value.ChatID)
  266. // cc := GetChatChannel(value)
  267. // println(cc.Channel, cc.Category)
  268. // }
  269. //}