talent_platform_link_statistic.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "strconv"
  10. "strings"
  11. )
  12. // RedBookNoteResponse 小红书接收结构体
  13. type RedBookNoteResponse struct {
  14. Code int `json:"code"`
  15. Data struct {
  16. ResponseBody struct {
  17. Data struct {
  18. Items []struct {
  19. NoteCard struct {
  20. InteractInfo struct {
  21. LikedCount string `json:"liked_count"` // 点赞数
  22. CommentCount string `json:"comment_count"` // 评论数
  23. CollectedCount string `json:"collected_count"` // 收藏数
  24. ShareCount string `json:"share_count"` // 分享数
  25. } `json:"interact_info"`
  26. } `json:"note_card"`
  27. } `json:"items"`
  28. } `json:"data"`
  29. } `json:"response_body"`
  30. } `json:"data"`
  31. }
  32. // WeiboPostResponse 微博接收结构体
  33. type WeiboPostResponse struct {
  34. Code int `json:"code"`
  35. Msg string `json:"msg"`
  36. Data struct {
  37. AttitudesCount int `json:"attitudes_count"` // 点赞数
  38. CommentsCount int `json:"comments_count"` // 评论数
  39. RepostsCount int `json:"reposts_count"` // 转发数
  40. ReadsCount int `json:"reads_count"` // 浏览数
  41. } `json:"data"`
  42. }
  43. // parseNoteStats 小红书接收方法
  44. func parseNoteStats(jsonData []byte) (likes, comments, collects, shares string, err error) {
  45. var resp RedBookNoteResponse
  46. if err := json.Unmarshal(jsonData, &resp); err != nil {
  47. return "", "", "", "", fmt.Errorf("JSON解析失败: %v", err)
  48. }
  49. // 检查数据是否存在
  50. if len(resp.Data.ResponseBody.Data.Items) == 0 {
  51. return "", "", "", "", errors.New("未找到笔记数据")
  52. }
  53. stats := resp.Data.ResponseBody.Data.Items[0].NoteCard.InteractInfo
  54. return stats.LikedCount, stats.CommentCount, stats.CollectedCount, stats.ShareCount, nil
  55. }
  56. // parseWeiboStats 微博接收方法
  57. func parseWeiboStats(jsonData []byte) (likes, comments, reposts, reads string, err error) {
  58. var resp WeiboPostResponse
  59. // 解析JSON
  60. if err := json.Unmarshal(jsonData, &resp); err != nil {
  61. return "", "", "", "", fmt.Errorf("JSON解析失败: %v", err)
  62. }
  63. // 检查状态码(微博通常用 code=200 表示成功)
  64. if resp.Code != 200 {
  65. return "", "", "", "", fmt.Errorf("API返回错误: %s", resp.Msg)
  66. }
  67. // 返回数值(转为字符串,保持与原函数一致)
  68. return strconv.Itoa(resp.Data.AttitudesCount),
  69. strconv.Itoa(resp.Data.CommentsCount),
  70. strconv.Itoa(resp.Data.RepostsCount),
  71. strconv.Itoa(resp.Data.ReadsCount),
  72. nil
  73. }
  74. func GetRedBookLinkDetail(ctx context.Context, shareText string) (int, int, int, int, error) {
  75. url := "http://120.46.92.62:6888/api/xhs/note_detail"
  76. method := "POST"
  77. // 构造请求体结构
  78. requestBody := struct {
  79. ShareText string `json:"share_text"`
  80. Proxy string `json:"proxy"`
  81. }{
  82. ShareText: shareText,
  83. Proxy: "",
  84. }
  85. jsonData, err := json.Marshal(requestBody)
  86. if err != nil {
  87. fmt.Println("JSON编码失败:", err)
  88. return 0, 0, 0, 0, err
  89. }
  90. payload := strings.NewReader(string(jsonData))
  91. client := &http.Client{}
  92. req, err := http.NewRequest(method, url, payload)
  93. if err != nil {
  94. // fmt.Println(err)
  95. return 0, 0, 0, 0, err
  96. }
  97. req.Header.Add("Cookie", "abRequestId=87d8ec6f-314f-5914-af1d-21296bf34c5f; a1=197a0b8a06djmry91j6taqhe0kcutwojdcu15nypd50000386246; webId=ae01b40eef7780a778b6624a3b295f4f; gid=yjW08S8Y2yffyjW08DY08SIvKfV6FvjyVK907UfAxd8TSy2879ElV2888qYKJ4K82qfKy82D; webBuild=4.68.0; acw_tc=0a4a2d6e17510033969926232e7b39d55058a43fb37e1ddc19745e6642f746; websectiga=7750c37de43b7be9de8ed9ff8ea0e576519e8cd2157322eb972ecb429a7735d4; sec_poison_id=b4fae566-5d78-4269-85c6-28fc28ec20d3; xsecappid=xhs-pc-web; web_session=040069b22467fb3084e74f796b3a4b11424ee0; loadts=1751003476156; unread={%22ub%22:%22685b56850000000020019eef%22%2C%22ue%22:%22685df405000000002201fd00%22%2C%22uc%22:14}")
  98. req.Header.Add("Content-Type", "application/json")
  99. res, err := client.Do(req)
  100. if err != nil {
  101. // fmt.Println(err)
  102. return 0, 0, 0, 0, err
  103. }
  104. defer res.Body.Close()
  105. body, err := ioutil.ReadAll(res.Body)
  106. if err != nil {
  107. // fmt.Println(err)
  108. return 0, 0, 0, 0, err
  109. }
  110. fmt.Println(string(body))
  111. // 提取互动数据
  112. likes, comments, collects, shares, err := parseNoteStats(body)
  113. if err != nil {
  114. //fmt.Println("解析互动数据失败:", err)
  115. return 0, 0, 0, 0, err
  116. }
  117. like, likeErr := strconv.Atoi(likes)
  118. if likeErr != nil {
  119. }
  120. comment, commentErr := strconv.Atoi(comments)
  121. if commentErr != nil {
  122. }
  123. collect, collectErr := strconv.Atoi(collects)
  124. if collectErr != nil {
  125. }
  126. share, shareErr := strconv.Atoi(shares)
  127. if shareErr != nil {
  128. }
  129. return like, comment, collect, share, nil
  130. }
  131. func GetWeiBoLinkDetail(ctx context.Context, shareText string) (int, int, int, int, error) {
  132. url := "http://api.moreapi.cn/api/weibo/post_detail"
  133. method := "POST"
  134. payload := strings.NewReader(`{
  135. "id":"",
  136. "share_text":"",
  137. "proxy":""
  138. }`)
  139. client := &http.Client{}
  140. req, err := http.NewRequest(method, url, payload)
  141. if err != nil {
  142. //fmt.Println(err)
  143. return 0, 0, 0, 0, err
  144. }
  145. req.Header.Add("Content-Type", "application/json")
  146. res, err := client.Do(req)
  147. if err != nil {
  148. //fmt.Println(err)
  149. return 0, 0, 0, 0, err
  150. }
  151. defer res.Body.Close()
  152. body, err := ioutil.ReadAll(res.Body)
  153. if err != nil {
  154. //fmt.Println(err)
  155. return 0, 0, 0, 0, err
  156. }
  157. // fmt.Println(string(body))
  158. likes, comments, collects, shares, err := parseWeiboStats(body)
  159. if err != nil {
  160. //fmt.Println("解析互动数据失败:", err)
  161. return 0, 0, 0, 0, err
  162. }
  163. like, likeErr := strconv.Atoi(likes)
  164. if likeErr != nil {
  165. }
  166. comment, commentErr := strconv.Atoi(comments)
  167. if commentErr != nil {
  168. }
  169. collect, collectErr := strconv.Atoi(collects)
  170. if collectErr != nil {
  171. }
  172. share, shareErr := strconv.Atoi(shares)
  173. if shareErr != nil {
  174. }
  175. return like, comment, collect, share, nil
  176. }