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

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

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

开发流程:

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

2、翻了半天,找个 发布能力/获取成功发布列表。

刚开始获取不到发表的文章列表,查了查,得知, 发布/发表 是俩个文章

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

发表:勾选推送,群发给粉丝

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

实现:

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

Go 复制代码
package wechatFreePublish

import (
	"bytes"
	"fmt"
	"github.com/goccy/go-json"
	"net/http"
)

func GetList(token string, offset, count, noContent int32) []*NewsItem {
	pageSize := 20
	totalMaterialCount := 0
	allMaterialItems := []*NewsItem{}

	// 第一次请求以获取总数
	firstUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=%s", token)
	//firstUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=%s", token)

	// 构建请求参数
	requestData := []byte(fmt.Sprintf(`{"offset": %d, "count": %d, "no_content": %d}`, offset, count, noContent))

	firstResp, err := http.Post(firstUrl, "application/json", bytes.NewReader(requestData))
	if err != nil {
		fmt.Println("Error:", err)
		return nil
	}
	defer firstResp.Body.Close()

	var firstResponse NewsMediaResponse
	if err := json.NewDecoder(firstResp.Body).Decode(&firstResponse); err != nil {
		fmt.Println("Error decoding JSON:", err.Error())
		return nil
	}

	// 获取总数
	totalMaterialCount = firstResponse.TotalCount
	println(totalMaterialCount)

	// 开始轮询请求素材列表
	for offset := 0; offset < totalMaterialCount; offset += pageSize {
		secondUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=%s", token)
		// 构建请求参数
		requestData := []byte(fmt.Sprintf(`{"offset": %d, "count": %d, "no_content": %d}`, offset, count, noContent))
		secondResp, err := http.Post(secondUrl, "application/json", bytes.NewReader(requestData))
		if err != nil {
			fmt.Println("Error:", err)
			return nil
		}
		defer secondResp.Body.Close()

		// 解析JSON响应
		var response NewsMediaResponse
		if err := json.NewDecoder(secondResp.Body).Decode(&response); err != nil {
			fmt.Println("Error decoding JSON:", err)
			return nil
		}

		// 打印解析结果
		fmt.Printf("Total Count: %d\n", response.TotalCount)
		fmt.Printf("Item Count: %d\n", response.ItemCount)

		for _, item := range response.Items {
			//fmt.Printf("News Media Item %d:\n", i+1)
			//fmt.Printf("Article ID: %s\n", item.ArticleID)
			//fmt.Printf("Update Time: %d\n", item.UpdateTime)

			for _, newsItem := range item.Content.NewsItem {
				allMaterialItems = append(allMaterialItems, &newsItem)
				//fmt.Printf("  News Item %d:\n", j+1)
				//fmt.Printf("    Title: %s\n", newsItem.Title)
				//fmt.Printf("    Author: %s\n", newsItem.Author)
				//fmt.Printf("    Digest: %s\n", newsItem.Digest)
				//fmt.Printf("    Content: %s\n", newsItem.Content)
				//fmt.Printf("    Content Source URL: %s\n", newsItem.ContentSourceURL)
				//fmt.Printf("    Thumb Media ID: %s\n", newsItem.ThumbMediaID)
				//fmt.Printf("    Show Cover Pic: %d\n", newsItem.ShowCoverPic)
				//fmt.Printf("    Need Open Comment: %d\n", newsItem.NeedOpenComment)
				//fmt.Printf("    Only Fans Can Comment: %d\n", newsItem.OnlyFansCanComment)
				//fmt.Printf("    URL: %s\n", newsItem.URL)
				//fmt.Printf("    Is Deleted: %v\n", newsItem.IsDeleted)
			}
		}
	}

	return allMaterialItems
}

type NewsItem struct {
	Title              string `json:"title"`
	Author             string `json:"author"`
	Digest             string `json:"digest"`
	Content            string `json:"content"`
	ContentSourceURL   string `json:"content_source_url"`
	ThumbMediaID       string `json:"thumb_media_id"`
	ShowCoverPic       int    `json:"show_cover_pic"`
	NeedOpenComment    int    `json:"need_open_comment"`
	OnlyFansCanComment int    `json:"only_fans_can_comment"`
	URL                string `json:"url"`
	IsDeleted          bool   `json:"is_deleted"`
}

type NewsMediaItem struct {
	ArticleID string `json:"article_id"`
	Content   struct {
		NewsItem []NewsItem `json:"news_item"`
	} `json:"content"`
	UpdateTime int `json:"update_time"`
}

type NewsMediaResponse struct {
	TotalCount int             `json:"total_count"`
	ItemCount  int             `json:"item_count"`
	Items      []NewsMediaItem `json:"item"`
}

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

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

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

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

相关推荐
幽络源小助理22 分钟前
美食推荐系统微信小程序
微信小程序·小程序·美食
帅次39 分钟前
Flutter Container 组件详解
android·flutter·ios·小程序·kotlin·iphone·xcode
深空数字孪生2 小时前
小程序 UI 设计,怎样在方寸间实现高效交互
ui·小程序·交互
幽络源小助理3 小时前
超市售货管理平台小程序
小程序
帅次5 小时前
Flutter setState() 状态管理详细使用指南
android·flutter·ios·小程序·kotlin·android studio·iphone
浩宇软件开发6 小时前
基于微信小程序的天气预报app
微信小程序·小程序·天气app
用户6120414922136 小时前
小程序做的超市商品管理系统
微信小程序·敏捷开发·小程序·云开发
说私域8 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的项目投资保障研究
人工智能·小程序·开源·零售
程序员小刘8 小时前
基于鸿蒙 HarmonyOS 5 打车小程序案例
华为·小程序·harmonyos
顽强d石头8 小时前
【uniapp】小程序中input输入框的placeholder-class不生效
前端·小程序·uni-app