talent_ks_auth.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package youngee_talent_service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/chromedp/chromedp"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/net/ghttp"
  8. "github.com/lin-jim-leon/kuaishou/open/merchant"
  9. "log"
  10. "time"
  11. "youngmini_server/app/model/youngee_talent_model"
  12. "youngmini_server/app/utils"
  13. )
  14. func GetQrcode(r *ghttp.Request) *TalentHttpResult {
  15. //达人id获取
  16. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  17. if err != nil {
  18. return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
  19. }
  20. println("here")
  21. // 记录开始时间
  22. startTime := time.Now()
  23. // 创建一个新的上下文
  24. ctx, cancel := chromedp.NewContext(context.Background())
  25. // 构建包含 tid 的 urlstr
  26. urlstr := fmt.Sprintf("https://open.kuaishou.com/oauth2/connect?state=%s&app_id=ks651333097154138217&redirect_uri=https://younggee.com/kuaishouauth&scope=merchant_distribution,merchant_refund,merchant_item,merchant_order,user_info,merchant_servicemarket,merchant_user,merchant_logistics&response_type=code", tid)
  27. // 执行任务
  28. //var buf []byte
  29. var text string
  30. var ok bool
  31. //浏览器启动!
  32. err = chromedp.Run(ctx,
  33. //打开授权网址
  34. chromedp.Navigate(urlstr),
  35. //等待元素可见
  36. //chromedp.WaitVisible(`#semiTabPanelqr > div > div > div.qr-container > img`, chromedp.ByQuery),
  37. // 获取元素的src属性值
  38. //chromedp.AttributeValue(`#semiTabPanelqr > div > div > div.qr-container > img`, "src", &text, &ok), //抖音
  39. chromedp.AttributeValue(`body > div > div > div > div.qr-code-main > img:nth-child(1)`, "src", &text, &ok), //快手
  40. //chromedp.AttributeValue(`#app > div > section > header > div > div.head-menu > ul > li:nth-child(1) > img`, "src", &text, &ok),
  41. )
  42. if err != nil {
  43. log.Fatal(err)
  44. }
  45. println("text----->", text)
  46. println("ok----->", ok)
  47. println("url----->", urlstr)
  48. fmt.Println("代码运行时间:", time.Since(startTime))
  49. //r.Response.WriteJson(text)
  50. // 在300秒后取消上下文
  51. time.AfterFunc(300*time.Second, func() {
  52. cancel()
  53. })
  54. return &TalentHttpResult{Code: 0, Msg: "success", Data: text}
  55. }
  56. func CheckAccount(r *ghttp.Request) *TalentHttpResult {
  57. fmt.Println("into check")
  58. //达人id获取
  59. tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  60. if err != nil {
  61. return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
  62. }
  63. userInfo := &youngee_talent_model.KuaishouUserInfo{}
  64. err = g.DB().Model(userInfo).Where("talent_id", tid).Scan(&userInfo)
  65. fmt.Println("userInfo*********", userInfo)
  66. if err != nil {
  67. // 查询失败(未找到结果),返回失败结果
  68. return &TalentHttpResult{Code: -1, Msg: "Query failed", Data: nil}
  69. }
  70. // 查询成功,返回成功结果和数据
  71. return &TalentHttpResult{Code: 0, Msg: "success", Data: userInfo}
  72. }
  73. func QuerySalesFor30Days(r *ghttp.Request) *TalentHttpResult {
  74. fmt.Println("into querySalesFor30Days")
  75. ClientKey := "ks651333097154138217"
  76. //ClientSecret := "dBt0rVRhTpUqcrOYGGpv0A"
  77. SignSecret := "bf6393dce0a2b669ee348bebb837b0da"
  78. tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  79. // 创建一个 KuaishouUserInfo 结构体的实例
  80. userInfo := &youngee_talent_model.KuaishouUserInfo{}
  81. // 查询数据库中的 access_token 字段
  82. // 使用 g.DB() 获取数据库连接,并执行查询
  83. key, err := g.DB().Model(userInfo).Fields("access_token").Where("talent_id = ?", tid).Value()
  84. AccessToken := key.String()
  85. if err != nil {
  86. // 处理错误
  87. fmt.Println("Error querying access_token:", err)
  88. }
  89. // 输出查询到的 access_token 值
  90. fmt.Println("Access Token:", AccessToken)
  91. //循环使用接口
  92. //
  93. // 获取当前时间的时间戳(毫秒)
  94. currentTime := time.Now().UnixNano() / int64(time.Millisecond)
  95. // 30天前的时间戳(毫秒)
  96. beginTime30DaysAgo := currentTime - 30*24*60*60*1000
  97. // 定义每段查询的天数
  98. intervalDays := 7
  99. intervalMillis := int64(intervalDays * 24 * 60 * 60 * 1000)
  100. // 初始化 beginTime 和 endTime
  101. beginTime := beginTime30DaysAgo
  102. endTime := beginTime + intervalMillis
  103. saleNum := 0 //30天总销量
  104. // 循环查询,先处理四个7天的时间段
  105. for i := 0; i < 4; i++ {
  106. // 调整 endTime,确保不会超过当前时间
  107. if endTime > currentTime {
  108. endTime = currentTime
  109. }
  110. saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
  111. // 更新时间段
  112. beginTime = endTime
  113. endTime = beginTime + intervalMillis
  114. }
  115. // 最后处理剩余的2天时间段
  116. endTime = currentTime
  117. saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
  118. // 查询成功,返回成功结果和数据
  119. return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
  120. }
  121. func GetSaleNumByDayInterval(ClientKey string, SignSecret string, AccessToken string, beginTime int64, endTime int64) int {
  122. pageSize := 100
  123. totalSaleNum := 0
  124. // 定义要查询的订单状态
  125. statuses := []int{30, 50, 60}
  126. // 遍历所有订单状态并调用 Corderlist 函数
  127. for _, status := range statuses {
  128. // 初始化 pcursor
  129. pcursor := ""
  130. for {
  131. // 调用 Corderlist 函数获取订单列表
  132. response, err := merchant.Corderlist(ClientKey, SignSecret, AccessToken, status, pageSize, beginTime, endTime, pcursor)
  133. fmt.Println("response********", response)
  134. if err != nil {
  135. fmt.Printf("Error calling Corderlist: %v\n", err)
  136. break
  137. }
  138. // 检查响应代码
  139. if response.Code != "1" {
  140. fmt.Printf("Corderlist response error: %s\n", response.Msg)
  141. break
  142. }
  143. // 累加订单中商品的数量
  144. for _, order := range response.Data.OrderViews {
  145. for _, product := range order.CPSOrderProductViews {
  146. totalSaleNum += product.Num
  147. }
  148. }
  149. // 检查分页指针 pcursor
  150. //100个订单以内的情况
  151. if response.Data.Cursor == "nomore" {
  152. break
  153. }
  154. //大于等于100个订单
  155. // 更新 pcursor 以获取下一页数据
  156. pcursor = response.Data.Cursor
  157. // 处理分页后的数据
  158. // 如果 pcursor 不是 "nomore",我们需要累加最后一条订单的数量
  159. if len(response.Data.OrderViews) > 0 {
  160. lastOrder := response.Data.OrderViews[len(response.Data.OrderViews)-1]
  161. if len(lastOrder.CPSOrderProductViews) > 0 {
  162. lastProduct := lastOrder.CPSOrderProductViews[len(lastOrder.CPSOrderProductViews)-1]
  163. totalSaleNum += lastProduct.Num
  164. }
  165. }
  166. }
  167. }
  168. return totalSaleNum
  169. }