talent_platform_link_statistic.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  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. "time"
  12. )
  13. // RedBookNoteResponse 小红书接收结构体
  14. type RedBookNoteResponse struct {
  15. Code int `json:"code"`
  16. Data struct {
  17. ResponseBody struct {
  18. Data struct {
  19. Items []struct {
  20. NoteCard struct {
  21. InteractInfo struct {
  22. LikedCount string `json:"liked_count"` // 点赞数
  23. CommentCount string `json:"comment_count"` // 评论数
  24. CollectedCount string `json:"collected_count"` // 收藏数
  25. ShareCount string `json:"share_count"` // 分享数
  26. } `json:"interact_info"`
  27. } `json:"note_card"`
  28. } `json:"items"`
  29. } `json:"data"`
  30. } `json:"response_body"`
  31. } `json:"data"`
  32. }
  33. // WeiboPostResponse 微博接收结构体
  34. type WeiboPostResponse struct {
  35. Code int `json:"code"`
  36. Msg string `json:"msg"`
  37. Data struct {
  38. AttitudesCount int `json:"attitudes_count"` // 点赞数
  39. CommentsCount int `json:"comments_count"` // 评论数
  40. RepostsCount int `json:"reposts_count"` // 转发数
  41. ReadsCount int `json:"reads_count"` // 浏览数
  42. } `json:"data"`
  43. }
  44. // parseNoteStats 小红书接收方法
  45. func parseNoteStats(jsonData []byte) (likes, comments, collects, shares string, err error) {
  46. var resp RedBookNoteResponse
  47. if err := json.Unmarshal(jsonData, &resp); err != nil {
  48. return "", "", "", "", fmt.Errorf("JSON解析失败: %v", err)
  49. }
  50. // 检查数据是否存在
  51. if len(resp.Data.ResponseBody.Data.Items) == 0 {
  52. return "", "", "", "", errors.New("未找到笔记数据")
  53. }
  54. stats := resp.Data.ResponseBody.Data.Items[0].NoteCard.InteractInfo
  55. return stats.LikedCount, stats.CommentCount, stats.CollectedCount, stats.ShareCount, nil
  56. }
  57. // parseWeiboStats 微博接收方法
  58. func parseWeiboStats(jsonData []byte) (likes, comments, reposts, reads string, err error) {
  59. var resp WeiboPostResponse
  60. // 解析JSON
  61. if err := json.Unmarshal(jsonData, &resp); err != nil {
  62. return "", "", "", "", fmt.Errorf("JSON解析失败: %v", err)
  63. }
  64. // 检查状态码(微博通常用 code=200 表示成功)
  65. if resp.Code != 200 {
  66. return "", "", "", "", fmt.Errorf("API返回错误: %s", resp.Msg)
  67. }
  68. // 返回数值(转为字符串,保持与原函数一致)
  69. return strconv.Itoa(resp.Data.AttitudesCount),
  70. strconv.Itoa(resp.Data.CommentsCount),
  71. strconv.Itoa(resp.Data.RepostsCount),
  72. strconv.Itoa(resp.Data.ReadsCount),
  73. nil
  74. }
  75. // GetRedBookLinkDetail 获取小红书链接数据详情
  76. func GetRedBookLinkDetail(ctx context.Context, shareText string) (int, int, int, int, error) {
  77. url := "http://120.46.92.62:6888/api/xhs/note_detail"
  78. method := "POST"
  79. // 构造请求体结构
  80. requestBody := struct {
  81. ShareText string `json:"share_text"`
  82. Proxy string `json:"proxy"`
  83. }{
  84. ShareText: shareText,
  85. Proxy: "",
  86. }
  87. jsonData, err := json.Marshal(requestBody)
  88. if err != nil {
  89. fmt.Println("JSON编码失败:", err)
  90. return 0, 0, 0, 0, err
  91. }
  92. payload := strings.NewReader(string(jsonData))
  93. client := &http.Client{}
  94. req, err := http.NewRequest(method, url, payload)
  95. if err != nil {
  96. // fmt.Println(err)
  97. return 0, 0, 0, 0, err
  98. }
  99. 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}")
  100. req.Header.Add("Content-Type", "application/json")
  101. res, err := client.Do(req)
  102. if err != nil {
  103. // fmt.Println(err)
  104. return 0, 0, 0, 0, err
  105. }
  106. defer res.Body.Close()
  107. body, err := ioutil.ReadAll(res.Body)
  108. if err != nil {
  109. // fmt.Println(err)
  110. return 0, 0, 0, 0, err
  111. }
  112. fmt.Println(string(body))
  113. // 提取互动数据
  114. likes, comments, collects, shares, err := parseNoteStats(body)
  115. if err != nil {
  116. //fmt.Println("解析互动数据失败:", err)
  117. return 0, 0, 0, 0, err
  118. }
  119. like, likeErr := strconv.Atoi(likes)
  120. if likeErr != nil {
  121. }
  122. comment, commentErr := strconv.Atoi(comments)
  123. if commentErr != nil {
  124. }
  125. collect, collectErr := strconv.Atoi(collects)
  126. if collectErr != nil {
  127. }
  128. share, shareErr := strconv.Atoi(shares)
  129. if shareErr != nil {
  130. }
  131. return like, comment, collect, share, nil
  132. }
  133. // GetWeiBoLinkDetail 获取微博链接数据详情
  134. func GetWeiBoLinkDetail(ctx context.Context, shareText string) (int, int, int, int, error) {
  135. url := "http://120.46.92.62:6888/api/weibo/post_detail"
  136. method := "POST"
  137. fmt.Println(shareText)
  138. requestBody := struct {
  139. Id string `json:"id"`
  140. ShareText string `json:"share_text"`
  141. Proxy string `json:"proxy"`
  142. }{
  143. Id: "",
  144. ShareText: shareText,
  145. Proxy: "",
  146. }
  147. jsonData, err := json.Marshal(requestBody)
  148. if err != nil {
  149. fmt.Println("JSON编码失败:", err)
  150. return 0, 0, 0, 0, err
  151. }
  152. payload := strings.NewReader(string(jsonData))
  153. client := &http.Client{}
  154. req, err := http.NewRequest(method, url, payload)
  155. fmt.Println(req)
  156. if err != nil {
  157. //fmt.Println(err)
  158. return 0, 0, 0, 0, err
  159. }
  160. req.Header.Add("Content-Type", "application/json")
  161. res, err := client.Do(req)
  162. if err != nil {
  163. fmt.Println(err)
  164. return 0, 0, 0, 0, err
  165. }
  166. defer res.Body.Close()
  167. body, err := ioutil.ReadAll(res.Body)
  168. if err != nil {
  169. fmt.Println(err)
  170. return 0, 0, 0, 0, err
  171. }
  172. // fmt.Println(string(body))
  173. likes, comments, collects, shares, err := parseWeiboStats(body)
  174. if err != nil {
  175. //fmt.Println("解析互动数据失败:", err)
  176. return 0, 0, 0, 0, err
  177. }
  178. like, likeErr := strconv.Atoi(likes)
  179. if likeErr != nil {
  180. }
  181. comment, commentErr := strconv.Atoi(comments)
  182. if commentErr != nil {
  183. }
  184. collect, collectErr := strconv.Atoi(collects)
  185. if collectErr != nil {
  186. }
  187. share, shareErr := strconv.Atoi(shares)
  188. if shareErr != nil {
  189. }
  190. return like, comment, collect, share, nil
  191. }
  192. // WeiboPostsResponse 微博多条数据接收结构体
  193. type WeiboPostsResponse struct {
  194. Code int `json:"code"`
  195. Msg string `json:"msg"`
  196. Data struct {
  197. Data struct {
  198. Cards []struct {
  199. Mblog struct {
  200. Id string `json:"id"`
  201. Text string `json:"text"`
  202. CreatedAt string `json:"created_at"`
  203. AttitudesCount int `json:"attitudes_count"` // 点赞数
  204. CommentsCount int `json:"comments_count"` // 评论数
  205. RepostsCount int `json:"reposts_count"` // 转发数
  206. RetweetedStatus struct {
  207. Id string `json:"id"`
  208. Text string `json:"text"`
  209. CreatedAt string `json:"created_at"`
  210. AttitudesCount int `json:"attitudes_count"` // 点赞数
  211. CommentsCount int `json:"comments_count"` // 评论数
  212. RepostsCount int `json:"reposts_count"` // 转发数
  213. } `json:"retweeted_status"`
  214. } `json:"mblog"`
  215. } `json:"cards"`
  216. } `json:"data"`
  217. } `json:"data"`
  218. }
  219. // WeiboPostStats 单条微博的互动数据
  220. type WeiboPostStats struct {
  221. Id string `json:"id"`
  222. CreatedAt string `json:"created_at"`
  223. Text string `json:"text"` // 名称
  224. Likes int `json:"likes"` // 点赞数
  225. Comments int `json:"comments"` // 评论数
  226. Reposts int `json:"reposts"` // 转发数
  227. CoverImageUrl string `json:"cover_image_url"` // 封面图URL(视频/文章)
  228. VideoUrl string `json:"video_url"` // 视频地址
  229. }
  230. // parseWeiboPosts 解析微博多条数据
  231. func parseWeiboPosts(body []byte) ([]WeiboPostStats, int, error) {
  232. var resp WeiboPostsResponse
  233. if err := json.Unmarshal(body, &resp); err != nil {
  234. return nil, 0, fmt.Errorf("JSON解析失败: %v", err)
  235. }
  236. if resp.Code != 200 {
  237. return nil, 0, fmt.Errorf("API返回错误: %s", resp.Msg)
  238. }
  239. var posts []WeiboPostStats
  240. var count int
  241. count = 0
  242. for _, card := range resp.Data.Data.Cards {
  243. if count >= 5 { // 最多取5条
  244. break
  245. }
  246. mblog := card.Mblog
  247. // 如果是转发微博,使用转发的内容
  248. if mblog.RetweetedStatus.Id != "" {
  249. continue
  250. }
  251. posts = append(posts, WeiboPostStats{
  252. Id: mblog.Id,
  253. Text: mblog.Text,
  254. CreatedAt: mblog.CreatedAt,
  255. Likes: mblog.AttitudesCount,
  256. Comments: mblog.CommentsCount,
  257. Reposts: mblog.RepostsCount,
  258. })
  259. count++
  260. }
  261. return posts, count, nil
  262. }
  263. // GetWeiBoHistoryList 微博历史作品数据
  264. func GetWeiBoHistoryList(ctx context.Context, homePageUrl string) ([]WeiboPostStats, error) {
  265. url := "http://120.46.92.62:6888/api/weibo/user_post" // 替换为实际API地址
  266. method := "POST"
  267. requestBody := struct {
  268. Uid string `json:"uid"`
  269. ShareText string `json:"share_text"`
  270. SinceId string `json:"since_id"`
  271. Proxy string `json:"proxy"`
  272. }{
  273. ShareText: homePageUrl,
  274. Proxy: "",
  275. }
  276. client := &http.Client{}
  277. jsonData, err := json.Marshal(requestBody)
  278. if err != nil {
  279. fmt.Println("JSON编码失败:", err)
  280. return nil, err
  281. }
  282. payload := strings.NewReader(string(jsonData))
  283. req, err := http.NewRequest(method, url, payload)
  284. if err != nil {
  285. fmt.Println(err)
  286. return nil, err
  287. }
  288. req.Header.Add("Content-Type", "application/json")
  289. res, err := client.Do(req)
  290. if err != nil {
  291. fmt.Println(err)
  292. return nil, err
  293. }
  294. defer res.Body.Close()
  295. body, err := ioutil.ReadAll(res.Body)
  296. if err != nil {
  297. fmt.Println(err)
  298. return nil, err
  299. }
  300. historyData, historyCount, historyErr := parseWeiboPosts(body)
  301. if historyErr != nil {
  302. fmt.Println(historyErr)
  303. }
  304. fmt.Println(historyCount)
  305. return historyData, nil
  306. }
  307. // RedBookPostsResponse 小红书多条数据接收结构体
  308. type RedBookPostsResponse struct {
  309. Code int `json:"code"`
  310. Msg string `json:"msg"`
  311. Data struct {
  312. ResponseBody struct {
  313. Data struct {
  314. Note []struct {
  315. NoteId string `json:"note_id"`
  316. XsecToken string `json:"xsec_token"`
  317. } `json:"notes"`
  318. } `json:"data"`
  319. } `json:"response_body"`
  320. } `json:"data"`
  321. }
  322. func parseRedBookPosts(body []byte) ([]string, []string, error) {
  323. var resp RedBookPostsResponse
  324. if err := json.Unmarshal(body, &resp); err != nil {
  325. return nil, nil, fmt.Errorf("JSON解析失败: %v", err)
  326. }
  327. if resp.Code != 200 {
  328. return nil, nil, fmt.Errorf("API返回错误: %s", resp.Msg)
  329. }
  330. var linkList []string
  331. var secTokenList []string
  332. for i, card := range resp.Data.ResponseBody.Data.Note {
  333. if i >= 5 { // 只取前5条
  334. break
  335. }
  336. linkList = append(linkList, card.NoteId)
  337. secTokenList = append(secTokenList, card.XsecToken)
  338. }
  339. return linkList, secTokenList, nil
  340. }
  341. // RedBookNoteResponseByNoteId 小红书链接接收结构体
  342. type RedBookNoteResponseByNoteId struct {
  343. Code int `json:"code"`
  344. Data struct {
  345. ResponseBody struct {
  346. Data struct {
  347. Items []struct {
  348. NoteCard struct {
  349. Title string `json:"title"` // 名称
  350. Time int64 `json:"time"` // 时间戳
  351. InteractInfo struct {
  352. LikedCount string `json:"liked_count"` // 点赞数
  353. CommentCount string `json:"comment_count"` // 评论数
  354. CollectedCount string `json:"collected_count"` // 收藏数
  355. ShareCount string `json:"share_count"` // 分享数
  356. } `json:"interact_info"`
  357. ImageList []struct {
  358. UrlDefault string `json:"url_default"` // 主图
  359. } `json:"image_list"`
  360. } `json:"note_card"`
  361. } `json:"items"`
  362. } `json:"data"`
  363. } `json:"response_body"`
  364. } `json:"data"`
  365. }
  366. // parseNoteStats 小红书接收方法
  367. func parseNoteStatsByNoteId(jsonData []byte) (respData *RedBookNoteResponseByNoteId, err error) {
  368. var resp *RedBookNoteResponseByNoteId
  369. resp = &RedBookNoteResponseByNoteId{}
  370. if err := json.Unmarshal(jsonData, &resp); err != nil {
  371. return nil, fmt.Errorf("JSON解析失败: %v", err)
  372. }
  373. // 检查数据是否存在
  374. if len(resp.Data.ResponseBody.Data.Items) == 0 {
  375. return nil, errors.New("未找到笔记数据")
  376. }
  377. return resp, nil
  378. }
  379. // GetRedBookLinkDetailByNoteId 根据noteID获取小红书链接数据详情
  380. func GetRedBookLinkDetailByNoteId(ctx context.Context, noteId string, xSecToken string) (*RedBookNoteResponseByNoteId, error) {
  381. url := "http://120.46.92.62:6888/api/xhs/note_detail"
  382. method := "POST"
  383. // 构造请求体结构
  384. requestBody := struct {
  385. NoteId string `json:"note_id"`
  386. XSecToken string `json:"xsec_token"`
  387. ShareText string `json:"share_text"`
  388. Proxy string `json:"proxy"`
  389. }{
  390. NoteId: noteId,
  391. XSecToken: xSecToken,
  392. Proxy: "",
  393. }
  394. jsonData, err := json.Marshal(requestBody)
  395. if err != nil {
  396. fmt.Println("JSON编码失败:", err)
  397. return nil, err
  398. }
  399. payload := strings.NewReader(string(jsonData))
  400. client := &http.Client{}
  401. req, err := http.NewRequest(method, url, payload)
  402. if err != nil {
  403. return nil, err
  404. }
  405. 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}")
  406. req.Header.Add("Content-Type", "application/json")
  407. res, err := client.Do(req)
  408. if err != nil {
  409. return nil, err
  410. }
  411. defer res.Body.Close()
  412. body, err := ioutil.ReadAll(res.Body)
  413. if err != nil {
  414. return nil, err
  415. }
  416. // fmt.Println(string(body))
  417. // 提取互动数据
  418. redBookNoteStatus, redBookNoteStatusErr := parseNoteStatsByNoteId(body)
  419. if redBookNoteStatusErr != nil {
  420. //fmt.Println("解析互动数据失败:", err)
  421. return nil, err
  422. }
  423. fmt.Println(redBookNoteStatus, redBookNoteStatusErr)
  424. //like, likeErr := strconv.Atoi(redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCardInteractInfo.LikedCount)
  425. //if likeErr != nil {
  426. //}
  427. //comment, commentErr := strconv.Atoi(comments)
  428. //if commentErr != nil {
  429. //}
  430. //collect, collectErr := strconv.Atoi(collects)
  431. //if collectErr != nil {
  432. //}
  433. //share, shareErr := strconv.Atoi(shares)
  434. //if shareErr != nil {
  435. //}
  436. return redBookNoteStatus, nil
  437. }
  438. type RedBookPostStats struct {
  439. Id string `json:"id"`
  440. CreatedAt string `json:"created_at"`
  441. Text string `json:"text"` // 名称
  442. Likes string `json:"likes"` // 点赞数
  443. Comments string `json:"comments"` // 评论数
  444. Collects string `json:"collects"` // 收藏数
  445. CoverImageUrl string `json:"cover_image_url"` // 封面图URL(视频/文章)
  446. VideoUrl string `json:"video_url"` // 视频地址
  447. }
  448. // GetRedBookHistoryList 小红书历史作品列表
  449. func GetRedBookHistoryList(ctx context.Context, homePageUrl string) ([]*RedBookPostStats, error) {
  450. var redBookPostStats []*RedBookPostStats
  451. url := "http://120.46.92.62:6888/api/xhs/user_post"
  452. method := "POST"
  453. requestBody := struct {
  454. UserId string `json:"user_id"`
  455. Cursor string `json:"cursor"`
  456. Proxy string `json:"proxy"`
  457. }{
  458. UserId: homePageUrl,
  459. Proxy: "",
  460. }
  461. client := &http.Client{}
  462. jsonData, err := json.Marshal(requestBody)
  463. if err != nil {
  464. fmt.Println("JSON编码失败:", err)
  465. return nil, err
  466. }
  467. payload := strings.NewReader(string(jsonData))
  468. req, err := http.NewRequest(method, url, payload)
  469. if err != nil {
  470. fmt.Println(err)
  471. return nil, err
  472. }
  473. req.Header.Add("Cookie", "abRequestId=023e90e1-a95a-58db-830a-d66c0cc67f60; a1=19566f0f66eglh42hy8peqvpak3xqglp49289p8xb50000109075; webId=d189df044ca380c74b5b97bc300db5a1; gid=yj2KKiyyyY4Yyj2KKi8iKjUYKdk1x4JxvYUdJCDAhU0TqY28CAk1Uj888y8j8W288q4Jif4i; acw_tc=0a4a949617517192833111453ec142bc6ab7f9b09590524b2d59d413f0ffb7; websectiga=a9bdcaed0af874f3a1431e94fbea410e8f738542fbb02df1e8e30c29ef3d91ac; sec_poison_id=9bc0c279-b964-4448-87df-d08559819919; web_session=0400698c340cec15e62be2555c3a4b29a1365a; xsecappid=xhs-pc-web; webBuild=4.71.0; loadts=1751719579486; unread={%22ub%22:%22685be6260000000015023bc6%22%2C%22ue%22:%2268617298000000001c0337aa%22%2C%22uc%22:23}")
  474. req.Header.Add("Content-Type", "application/json")
  475. res, err := client.Do(req)
  476. if err != nil {
  477. fmt.Println(err)
  478. return nil, err
  479. }
  480. defer res.Body.Close()
  481. body, err := ioutil.ReadAll(res.Body)
  482. if err != nil {
  483. fmt.Println(err)
  484. return nil, err
  485. }
  486. linkList, tokenList, linkErr := parseRedBookPosts(body)
  487. if linkErr != nil {
  488. return nil, linkErr
  489. }
  490. if linkList != nil {
  491. for i, _ := range linkList {
  492. redBookNoteStatus, redBookNoteStatusErr := GetRedBookLinkDetailByNoteId(ctx, linkList[i], tokenList[i])
  493. if redBookNoteStatusErr != nil {
  494. return nil, redBookNoteStatusErr
  495. }
  496. if redBookNoteStatus != nil {
  497. var xhsStatus *RedBookPostStats
  498. xhsStatus = &RedBookPostStats{}
  499. xhsStatus.Likes = redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.InteractInfo.LikedCount
  500. xhsStatus.Comments = redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.InteractInfo.CommentCount
  501. xhsStatus.Collects = redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.InteractInfo.CollectedCount
  502. if len(redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.ImageList) > 0 {
  503. xhsStatus.CoverImageUrl = redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.ImageList[0].UrlDefault
  504. }
  505. seconds := redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.Time / 1000
  506. nanos := (redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.Time % 1000) * 1e6
  507. // 转换为北京时间
  508. utcTime := time.Unix(seconds, nanos).UTC()
  509. beijingTime := utcTime.In(time.FixedZone("CST", 8*3600))
  510. xhsStatus.CreatedAt = beijingTime.Format("2006-01-02 15:04:05")
  511. xhsStatus.Text = redBookNoteStatus.Data.ResponseBody.Data.Items[0].NoteCard.Title
  512. redBookPostStats = append(redBookPostStats, xhsStatus)
  513. }
  514. }
  515. }
  516. return redBookPostStats, nil
  517. }