• 微信小程序获取公众号的文章


    背景:我有一个《砂舞指南》的小程序,主要是分享砂舞最新动态等

    最近做了一个小程序,想要一些固定的文章展示在小程序里面,比如《什么是砂舞》《玩砂舞注意点》等普及砂舞知识的文章

    开发流程:

    1、刚开始测试了 素材管理/获取永久素材,但是结果不甚满意。发表了20篇文章,只获取到15个。不知道是平台规则的修改还是什么的,无法满足需求

    2、翻了半天,找个 发布能力/获取成功发布列表。
    刚开始获取不到发表的文章列表,查了查,得知, 发布/发表 是俩个文章

    发布:就是在发表按钮点击后,不群发文章。在微信公众号首页能看到文章,但是不给粉丝推送
    发表:勾选推送,群发给粉丝

    所以,发布能力/获取成功发布列表,这个接口刚好满足我的需求

    实现:

    我的服务器是用golang来处理的

    1. package wechatFreePublish
    2. import (
    3. "bytes"
    4. "fmt"
    5. "github.com/goccy/go-json"
    6. "net/http"
    7. )
    8. func GetList(token string, offset, count, noContent int32) []*NewsItem {
    9. pageSize := 20
    10. totalMaterialCount := 0
    11. allMaterialItems := []*NewsItem{}
    12. // 第一次请求以获取总数
    13. firstUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=%s", token)
    14. //firstUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=%s", token)
    15. // 构建请求参数
    16. requestData := []byte(fmt.Sprintf(`{"offset": %d, "count": %d, "no_content": %d}`, offset, count, noContent))
    17. firstResp, err := http.Post(firstUrl, "application/json", bytes.NewReader(requestData))
    18. if err != nil {
    19. fmt.Println("Error:", err)
    20. return nil
    21. }
    22. defer firstResp.Body.Close()
    23. var firstResponse NewsMediaResponse
    24. if err := json.NewDecoder(firstResp.Body).Decode(&firstResponse); err != nil {
    25. fmt.Println("Error decoding JSON:", err.Error())
    26. return nil
    27. }
    28. // 获取总数
    29. totalMaterialCount = firstResponse.TotalCount
    30. println(totalMaterialCount)
    31. // 开始轮询请求素材列表
    32. for offset := 0; offset < totalMaterialCount; offset += pageSize {
    33. secondUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=%s", token)
    34. // 构建请求参数
    35. requestData := []byte(fmt.Sprintf(`{"offset": %d, "count": %d, "no_content": %d}`, offset, count, noContent))
    36. secondResp, err := http.Post(secondUrl, "application/json", bytes.NewReader(requestData))
    37. if err != nil {
    38. fmt.Println("Error:", err)
    39. return nil
    40. }
    41. defer secondResp.Body.Close()
    42. // 解析JSON响应
    43. var response NewsMediaResponse
    44. if err := json.NewDecoder(secondResp.Body).Decode(&response); err != nil {
    45. fmt.Println("Error decoding JSON:", err)
    46. return nil
    47. }
    48. // 打印解析结果
    49. fmt.Printf("Total Count: %d\n", response.TotalCount)
    50. fmt.Printf("Item Count: %d\n", response.ItemCount)
    51. for _, item := range response.Items {
    52. //fmt.Printf("News Media Item %d:\n", i+1)
    53. //fmt.Printf("Article ID: %s\n", item.ArticleID)
    54. //fmt.Printf("Update Time: %d\n", item.UpdateTime)
    55. for _, newsItem := range item.Content.NewsItem {
    56. allMaterialItems = append(allMaterialItems, &newsItem)
    57. //fmt.Printf(" News Item %d:\n", j+1)
    58. //fmt.Printf(" Title: %s\n", newsItem.Title)
    59. //fmt.Printf(" Author: %s\n", newsItem.Author)
    60. //fmt.Printf(" Digest: %s\n", newsItem.Digest)
    61. //fmt.Printf(" Content: %s\n", newsItem.Content)
    62. //fmt.Printf(" Content Source URL: %s\n", newsItem.ContentSourceURL)
    63. //fmt.Printf(" Thumb Media ID: %s\n", newsItem.ThumbMediaID)
    64. //fmt.Printf(" Show Cover Pic: %d\n", newsItem.ShowCoverPic)
    65. //fmt.Printf(" Need Open Comment: %d\n", newsItem.NeedOpenComment)
    66. //fmt.Printf(" Only Fans Can Comment: %d\n", newsItem.OnlyFansCanComment)
    67. //fmt.Printf(" URL: %s\n", newsItem.URL)
    68. //fmt.Printf(" Is Deleted: %v\n", newsItem.IsDeleted)
    69. }
    70. }
    71. }
    72. return allMaterialItems
    73. }
    74. type NewsItem struct {
    75. Title string `json:"title"`
    76. Author string `json:"author"`
    77. Digest string `json:"digest"`
    78. Content string `json:"content"`
    79. ContentSourceURL string `json:"content_source_url"`
    80. ThumbMediaID string `json:"thumb_media_id"`
    81. ShowCoverPic int `json:"show_cover_pic"`
    82. NeedOpenComment int `json:"need_open_comment"`
    83. OnlyFansCanComment int `json:"only_fans_can_comment"`
    84. URL string `json:"url"`
    85. IsDeleted bool `json:"is_deleted"`
    86. }
    87. type NewsMediaItem struct {
    88. ArticleID string `json:"article_id"`
    89. Content struct {
    90. NewsItem []NewsItem `json:"news_item"`
    91. } `json:"content"`
    92. UpdateTime int `json:"update_time"`
    93. }
    94. type NewsMediaResponse struct {
    95. TotalCount int `json:"total_count"`
    96. ItemCount int `json:"item_count"`
    97. Items []NewsMediaItem `json:"item"`
    98. }

    获取成功发布列表后,又衍生出个问题,我想要获取文章是缩略图。但是数据只提供了个缩略图id,并没有直接的URL地址

    因微信公众号的接口每天有次数限制,那么我只能调用 素材管理/获取永久素材/image,将素材库的所有图片存储到我的服务器,然后在获取文章的时候,在缓存中用图片ID获取图片URL,返回给客户端了。

    这样,微信小程序就有了  文章标题+缩略图URL,就可以展示自己需要的文章了

    后续,只要在公众号发布文章,即可同步到小程序。

  • 相关阅读:
    Quartus Ⅱ调用FIFO IP核方法实现求和(Mega Wizard)
    如何在Vue中进行路由管理?如何使用Vue Router?
    Python环境搭建之OpenCV
    【Linux】改变缓存路径、清理缓存
    算法金 | 一个强大的算法模型,多项式回归!!
    SiO2二氧化硅固载1-(三乙氧基硅基丙基)-3-正丁基咪唑双三氟甲烷磺酰亚胺盐(SiO2-[CPIM]TFSI)离子液体
    4. 继承
    css3中有哪些伪类?
    A. Prefix Sum Primes
    猿创征文|Java-日期时间API(详解)
  • 原文地址:https://blog.csdn.net/qq_27668853/article/details/133843648