123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- package youngee_talent_service
- import (
- "context"
- "fmt"
- "github.com/chromedp/chromedp"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/net/ghttp"
- "github.com/gogf/gf/os/gtime"
- "github.com/lin-jim-leon/kuaishou/open/merchant"
- "github.com/lin-jim-leon/kuaishou/open/user"
- "log"
- "time"
- "youngmini_server/app/model/youngee_talent_model"
- "youngmini_server/app/utils"
- )
- const (
- ClientKey = "ks651333097154138217"
- ClientSecret = "dBt0rVRhTpUqcrOYGGpv0A"
- SignSecret = "bf6393dce0a2b669ee348bebb837b0da"
- )
- func GetQrcode(r *ghttp.Request) *TalentHttpResult {
- //达人id获取
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
- }
- println("here")
- // 记录开始时间
- startTime := time.Now()
- // 创建一个新的上下文
- ctx, cancel := chromedp.NewContext(context.Background())
- // 构建包含 tid 的 urlstr
- 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)
- // 执行任务
- //var buf []byte
- var text string
- var ok bool
- //浏览器启动!
- err = chromedp.Run(ctx,
- //打开授权网址
- chromedp.Navigate(urlstr),
- //等待元素可见
- //chromedp.WaitVisible(`#semiTabPanelqr > div > div > div.qr-container > img`, chromedp.ByQuery),
- // 获取元素的src属性值
- //chromedp.AttributeValue(`#semiTabPanelqr > div > div > div.qr-container > img`, "src", &text, &ok), //抖音
- chromedp.AttributeValue(`body > div > div > div > div.qr-code-main > img:nth-child(1)`, "src", &text, &ok), //快手
- //chromedp.AttributeValue(`#app > div > section > header > div > div.head-menu > ul > li:nth-child(1) > img`, "src", &text, &ok),
- )
- if err != nil {
- log.Fatal(err)
- }
- println("text----->", text)
- println("ok----->", ok)
- println("url----->", urlstr)
- fmt.Println("代码运行时间:", time.Since(startTime))
- //r.Response.WriteJson(text)
- // 在300秒后取消上下文
- time.AfterFunc(300*time.Second, func() {
- cancel()
- })
- return &TalentHttpResult{Code: 0, Msg: "success", Data: text}
- }
- // 检查数据库表中是否有达人对应的数据 且 token未过期
- func CheckAccount(r *ghttp.Request) *TalentHttpResult {
- fmt.Println("into check")
- //达人id获取
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
- }
- userInfo := &youngee_talent_model.KuaishouUserInfo{}
- err = g.DB().Model(userInfo).Where("talent_id", tid).Scan(&userInfo)
- fmt.Println("userInfo*********", userInfo)
- if err != nil {
- // 查询失败(未找到结果),返回失败结果
- return &TalentHttpResult{Code: -1, Msg: "Query failed", Data: nil}
- }
- //有查询结果,看是否accessToken是否有效
- key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
- if err1 != nil {
- return &TalentHttpResult{Code: -1, Msg: "query database fail"}
- }
- AccessToken := key.String()
- _, err2 := user.GetUserinfo(ClientKey, AccessToken)
- if err2 != nil {
- //前端接收code=-2表示token过期
- return &TalentHttpResult{Code: -2, Msg: "accessToken过期", Data: nil}
- }
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "success", Data: userInfo}
- }
- // 检查数据库表中是否有达人对应的数据,有就删掉,/kuaishouath中会插入。
- func CheckNewAccount(r *ghttp.Request) *TalentHttpResult {
- //check到了更新时间在两秒内的插入的数据。则说明已绑定。弹窗消失。
- //达人id获取
- fmt.Println("***********into checknewaccount")
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
- }
- // 获取当前时间
- currentTime := gtime.Now()
- // 查询数据库中是否有符合条件的数据
- userInfo := &youngee_talent_model.KuaishouUserInfo{}
- err = g.DB().Model("platform_kuaishou_user_info").
- Where("talent_id = ?", tid).
- Scan(&userInfo)
- if err != nil {
- return &TalentHttpResult{Code: -2, Msg: "platform_kuaishou_user_info query failed"}
- }
- //找到数据,判断时间差
- if userInfo != nil {
- // 计算创建时间与当前时间的差值
- timeDiff := currentTime.Sub(userInfo.CreateTime)
- fmt.Println("***********kifasfa", timeDiff)
- if timeDiff <= 3*time.Second {
- return &TalentHttpResult{Code: 0, Msg: "success", Data: nil}
- }
- }
- // 如果没有符合条件的数据,返回失败
- return &TalentHttpResult{Code: -20, Msg: "No valid data found", Data: nil}
- }
- func CheckTokenExp(r *ghttp.Request) *TalentHttpResult {
- //达人id获取
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
- }
- key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
- if err1 != nil {
- return &TalentHttpResult{Code: -1, Msg: "query database fail"}
- }
- AccessToken := key.String()
- res_info, err2 := user.GetUserinfo(ClientKey, AccessToken)
- if err2 != nil {
- //前端接收code=-2表示token过期
- return &TalentHttpResult{Code: -2, Msg: "accessToken过期", Data: nil}
- }
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "success", Data: res_info}
- }
- func AddWindow(r *ghttp.Request) *TalentHttpResult {
- pId := r.GetString("product_id")
- //通过pId获取kuaishou_product_id
- pIdSlice := []string{pId}
- //达人id获取
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
- }
- key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
- if err1 != nil {
- return &TalentHttpResult{Code: -2, Msg: "query database fail"}
- }
- AccessToken := key.String()
- res_info, err2 := merchant.AddItemsToShelf(ClientKey, SignSecret, AccessToken, pIdSlice)
- if err2 != nil {
- //前端接收code=-3表示添加失敗,沒有開通
- return &TalentHttpResult{Code: -3, Msg: "未開通、商品不存在或已下线", Data: nil}
- }
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "加入橱窗成功", Data: res_info}
- }
- func GetKuaishouFansNum(r *ghttp.Request) *TalentHttpResult {
- //达人id获取
- tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- fmt.Println("********&&&&&&&&&&,tid", tid)
- if err != nil {
- return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
- }
- key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
- if err1 != nil {
- return &TalentHttpResult{Code: -2, Msg: "query database fail"}
- }
- AccessToken := key.String()
- res_user, err2 := user.GetUserinfo(ClientKey, AccessToken)
- if err2 != nil {
- //前端接收code=-3表示添加失敗,沒有開通
- return &TalentHttpResult{Code: -3, Msg: "获取快手用户信息出错", Data: nil}
- }
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "获取快手用户信息成功", Data: res_user.Data}
- }
- func QuerySalesFor30Days(r *ghttp.Request) *TalentHttpResult {
- fmt.Println("into querySalesFor30Days")
- ClientKey := "ks651333097154138217"
- //ClientSecret := "dBt0rVRhTpUqcrOYGGpv0A"
- SignSecret := "bf6393dce0a2b669ee348bebb837b0da"
- tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- // 创建一个 KuaishouUserInfo 结构体的实例
- userInfo := &youngee_talent_model.KuaishouUserInfo{}
- // 查询数据库中的 access_token 字段
- // 使用 g.DB() 获取数据库连接,并执行查询
- key, err := g.DB().Model(userInfo).Fields("access_token").Where("talent_id = ?", tid).Value()
- AccessToken := key.String()
- if err != nil {
- // 处理错误
- fmt.Println("Error querying access_token:", err)
- }
- // 输出查询到的 access_token 值
- fmt.Println("Access Token:", AccessToken)
- // 获取当前时间的时间戳(毫秒)
- currentTime := time.Now().UnixNano() / int64(time.Millisecond)
- // 30天前的时间戳(毫秒)
- beginTime30DaysAgo := currentTime - 30*24*60*60*1000
- // 定义每段查询的天数
- intervalDays := 7
- intervalMillis := int64(intervalDays * 24 * 60 * 60 * 1000)
- // 初始化 beginTime 和 endTime
- beginTime := beginTime30DaysAgo
- endTime := beginTime + intervalMillis
- saleNum := 0 //30天总销量
- // 循环查询,先处理四个7天的时间段
- for i := 0; i < 4; i++ {
- // 调整 endTime,确保不会超过当前时间
- if endTime > currentTime {
- endTime = currentTime
- }
- saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
- // 更新时间段
- beginTime = endTime
- endTime = beginTime + intervalMillis
- }
- // 最后处理剩余的2天时间段
- endTime = currentTime
- saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
- }
- func QueryOkSaleNum(r *ghttp.Request) *TalentHttpResult {
- tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- // 创建一个 KuaishouUserInfo 结构体的实例
- userInfo := &youngee_talent_model.KuaishouUserInfo{}
- // 查询数据库中的 access_token 字段
- // 使用 g.DB() 获取数据库连接,并执行查询
- key, err := g.DB().Model(userInfo).Fields("access_token").Where("talent_id = ?", tid).Value()
- AccessToken := key.String()
- if err != nil {
- // 处理错误
- fmt.Println("Error querying access_token:", err)
- }
- if key == nil {
- // 处理错误
- fmt.Println("can not find talentId's bindinfo :", err)
- }
- //循环使用接口
- //
- // 获取当前时间的时间戳(毫秒)
- currentTime := time.Now().UnixNano() / int64(time.Millisecond)
- // 90天前的时间戳(毫秒)
- beginTime90DaysAgo := currentTime - 90*24*60*60*1000
- // 定义每段查询的天数
- intervalDays := 7
- intervalMillis := int64(intervalDays * 24 * 60 * 60 * 1000)
- // 初始化 beginTime 和 endTime
- beginTime := beginTime90DaysAgo
- endTime := beginTime + intervalMillis
- saleNum := 0 //90天总销量
- // 循环查询,先处理四个7天的时间段
- for i := 0; i < 12; i++ {
- // 调整 endTime,确保不会超过当前时间
- if endTime > currentTime {
- endTime = currentTime
- }
- saleNum += GetSaleNumByDayInterval_Ok(ClientKey, SignSecret, AccessToken, beginTime, endTime)
- // 更新时间段
- beginTime = endTime
- endTime = beginTime + intervalMillis
- }
- // 最后处理剩余的6天时间段
- endTime = currentTime
- saleNum += GetSaleNumByDayInterval_Ok(ClientKey, SignSecret, AccessToken, beginTime, endTime)
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
- }
- func QuerySalesFor90Days(r *ghttp.Request) *TalentHttpResult {
- tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
- // 创建一个 KuaishouUserInfo 结构体的实例
- userInfo := &youngee_talent_model.KuaishouUserInfo{}
- // 查询数据库中的 access_token 字段
- // 使用 g.DB() 获取数据库连接,并执行查询
- key, err := g.DB().Model(userInfo).Fields("access_token").Where("talent_id = ?", tid).Value()
- AccessToken := key.String()
- if err != nil {
- // 处理错误
- fmt.Println("Error querying access_token:", err)
- }
- if key == nil {
- // 处理错误
- fmt.Println("can not find talentId's bindinfo :", err)
- }
- //循环使用接口
- //
- // 获取当前时间的时间戳(毫秒)
- currentTime := time.Now().UnixNano() / int64(time.Millisecond)
- // 30天前的时间戳(毫秒)
- beginTime90DaysAgo := currentTime - 90*24*60*60*1000
- // 定义每段查询的天数
- intervalDays := 7
- intervalMillis := int64(intervalDays * 24 * 60 * 60 * 1000)
- // 初始化 beginTime 和 endTime
- beginTime := beginTime90DaysAgo
- endTime := beginTime + intervalMillis
- saleNum := 0 //90天总销量
- // 循环查询,先处理四个7天的时间段
- for i := 0; i < 12; i++ {
- // 调整 endTime,确保不会超过当前时间
- if endTime > currentTime {
- endTime = currentTime
- }
- saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
- // 更新时间段
- beginTime = endTime
- endTime = beginTime + intervalMillis
- }
- // 最后处理剩余的6天时间段
- endTime = currentTime
- saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
- // 查询成功,返回成功结果和数据
- return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
- }
- func GetSaleNumByDayInterval(ClientKey string, SignSecret string, AccessToken string, beginTime int64, endTime int64) int {
- pageSize := 100
- totalSaleNum := 0
- // 定义要查询的订单状态
- // [30:已付款] [50:已收货] [60:已结算] [80:已失效]
- statuses := []int{30, 50, 60}
- // 遍历所有订单状态并调用 Corderlist 函数
- for _, status := range statuses {
- // 初始化 pcursor
- pcursor := ""
- for {
- // 调用 Corderlist 函数获取订单列表
- response, err := merchant.Corderlist(ClientKey, SignSecret, AccessToken, status, pageSize, beginTime, endTime, pcursor)
- fmt.Println("response********", response)
- if err != nil {
- fmt.Printf("Error calling Corderlist: %v\n", err)
- break
- }
- // 检查响应代码
- if response.Code != "1" {
- fmt.Printf("Corderlist response error: %s\n", response.Msg)
- break
- }
- // 累加订单中商品的数量
- for _, order := range response.Data.OrderViews {
- for _, product := range order.CPSOrderProductViews {
- totalSaleNum += product.Num
- }
- }
- // 检查分页指针 pcursor
- //100个订单以内的情况
- if response.Data.Cursor == "nomore" {
- break
- }
- //大于等于100个订单
- // 更新 pcursor 以获取下一页数据
- pcursor = response.Data.Cursor
- // 处理分页后的数据
- // 如果 pcursor 不是 "nomore",我们需要累加最后一条订单的数量
- if len(response.Data.OrderViews) > 0 {
- lastOrder := response.Data.OrderViews[len(response.Data.OrderViews)-1]
- if len(lastOrder.CPSOrderProductViews) > 0 {
- lastProduct := lastOrder.CPSOrderProductViews[len(lastOrder.CPSOrderProductViews)-1]
- totalSaleNum += lastProduct.Num
- }
- }
- }
- }
- return totalSaleNum
- }
- func GetSaleNumByDayInterval_Ok(ClientKey string, SignSecret string, AccessToken string, beginTime int64, endTime int64) int {
- pageSize := 100
- totalSaleNum := 0
- // 定义要查询的订单状态
- // [30:已付款] [50:已收货] [60:已结算] [80:已失效]
- statuses := []int{60}
- // 遍历所有订单状态并调用 Corderlist 函数
- for _, status := range statuses {
- // 初始化 pcursor
- pcursor := ""
- for {
- // 调用 Corderlist 函数获取订单列表
- response, err := merchant.Corderlist(ClientKey, SignSecret, AccessToken, status, pageSize, beginTime, endTime, pcursor)
- fmt.Println("response********", response)
- if err != nil {
- fmt.Printf("Error calling Corderlist: %v\n", err)
- break
- }
- // 检查响应代码
- if response.Code != "1" {
- fmt.Printf("Corderlist response error: %s\n", response.Msg)
- break
- }
- // 累加订单中商品的数量
- for _, order := range response.Data.OrderViews {
- for _, product := range order.CPSOrderProductViews {
- totalSaleNum += product.Num
- }
- }
- // 检查分页指针 pcursor
- //100个订单以内的情况
- if response.Data.Cursor == "nomore" {
- break
- }
- //大于等于100个订单
- // 更新 pcursor 以获取下一页数据
- pcursor = response.Data.Cursor
- // 处理分页后的数据
- // 如果 pcursor 不是 "nomore",我们需要累加最后一条订单的数量
- if len(response.Data.OrderViews) > 0 {
- lastOrder := response.Data.OrderViews[len(response.Data.OrderViews)-1]
- if len(lastOrder.CPSOrderProductViews) > 0 {
- lastProduct := lastOrder.CPSOrderProductViews[len(lastOrder.CPSOrderProductViews)-1]
- totalSaleNum += lastProduct.Num
- }
- }
- }
- }
- return totalSaleNum
- }
|