T3eC 2024-04-16 17:19 采纳率: 0%
浏览 60

Java获取微信公众号发布文章

你好 我看了你的java获取微信公众号发布文章列表的内容 我目前是需要根据微信公众号的id这种,去获取该微信公众号最新的文章,有点没有头绪 请教一下 有没有什么方法可以

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 17:19
    关注

    引自免费微信小程序:皆我百晓生

    要获取微信公众号发布的最新文章,你需要使用微信提供的公众平台API。首先,你需要在微信公众平台上注册并创建一个公众号,然后在开发者中心获取AppID和AppSecret。

    接下来,按照以下步骤操作:

    1. 申请access_token: 首先,你需要通过AppID和AppSecret获取access_token。这个token用于后续的接口调用。访问以下URL(将APP_IDAPP_SECRET替换为你的实际值):

      https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APP_ID&secret=APP_SECRET
      

      这将返回一个JSON响应,包含access_token。例如:

      {
        "access_token": "ACCESS_TOKEN",
        "expires_in": 7200
      }
      

      ACCESS_TOKEN保存起来,因为我们需要在后续的请求中使用它。

    2. 获取文章列表: 使用上一步得到的access_token,可以调用微信的get_articles接口来获取文章列表。以下是相应的API地址:

      https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=ACCESS_TOKEN
      

      调用这个接口后,你会得到一个包含总文章数量的响应。然后,你可以通过分页获取具体的文章信息。调用get_article_list接口,传入需要获取的文章列表的类型(图文消息:news)、offset、limit等参数。例如:

      https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN&type=news&offset=0&count=20
      

      上述请求会返回20篇最新的文章信息。

    3. 解析JSON数据: 获取到的响应是一个JSON格式的数据,你需要解析这些数据以提取所需的信息,比如文章标题、摘要、内容等。你可以使用Java中的Jackson库或者其他JSON解析库来完成这一步。

    4. 编写示例代码: 下面是一个简单的Java代码示例,展示了如何使用OkHttp库获取access_token和文章列表:

      import okhttp3.OkHttpClient;
      import okhttp3.Request;
      import okhttp3.Response;
      import org.json.JSONArray;
      import org.json.JSONObject;
      
      public class WeChatArticleFetcher {
      
          private static final String API_BASE_URL = "https://api.weixin.qq.com/cgi-bin/";
          private static final String TOKEN_PATH = "token";
          private static final String MATERIAL_COUNT_PATH = "material/get_materialcount";
          private static final String ARTICLE_LIST_PATH = "material/batchget_material";
      
          private final OkHttpClient client;
          private final String appId;
          private final String appSecret;
      
          public WeChatArticleFetcher(String appId, String appSecret) {
              this.client = new OkHttpClient();
              this.appId = appId;
              this.appSecret = appSecret;
          }
      
          public JSONArray fetchArticles(int limit) throws Exception {
              // 获取access_token
              JSONObject tokenResponse = getToken();
              String accessToken = tokenResponse.getString("access_token");
      
              // 获取文章总数
              int totalCount = getTotalCount(accessToken);
              int offset = 0;
              JSONArray articles = new JSONArray();
      
              while (offset < totalCount) {
                  // 获取文章列表
                  JSONArray articleListResponse = getArticleList(accessToken, offset, limit);
      
                  if (!articleListResponse.isEmpty()) {
                      articles.put(articleListResponse);
                      offset += articleListResponse.length();
                  } else {
                      break;
                  }
              }
      
              return articles;
          }
      
          private JSONObject getToken() throws Exception {
              Request request = new Request.Builder()
                      .url(API_BASE_URL + TOKEN_PATH + "?grant_type=client_credential" +
                              "&appid=" + appId + "&secret=" + appSecret)
                      .build();
      
              try (Response response = client.newCall(request).execute()) {
                  if (!response.isSuccessful()) throw new RuntimeException("Unexpected code " + response);
      
                  return new JSONObject(response.body().string());
              }
          }
      
          private int getTotalCount(String accessToken) throws Exception {
              Request request = new Request.Builder()
                      .url(API_BASE_URL + MATERIAL_COUNT_PATH + "?access_token=" + accessToken)
                      .build();
      
              try (Response response = client.newCall(request).execute()) {
                  if (!response.isSuccessful()) throw new RuntimeException("Unexpected code " + response);
      
                  JSONObject json = new JSONObject(response.body().string());
                  return json.getInt("total");
              }
          }
      
          private JSONArray getArticleList(String accessToken, int offset, int count) throws Exception {
              Request request = new Request.Builder()
                      .url(API_BASE_URL + ARTICLE_LIST_PATH + "?access_token=" + accessToken +
                              "&type=news&offset=" + offset + "&count=" + count)
                      .build();
      
              try (Response response = client.newCall(request).execute()) {
                  if (!response.isSuccessful()) throw new RuntimeException("Unexpected code " + response);
      
                  return new JSONObject(response.body().string()).getJSONArray("item");
              }
          }
      
          public static void main(String[] args) throws Exception {
              WeChatArticleFetcher fetcher = new WeChatArticleFetcher("YOUR_APP_ID", "YOUR_APP_SECRET");
              JSONArray articles = fetcher.fetchArticles(20);
      
              for (int i = 0; i < articles.length(); i++) {
                  JSONObject article = articles.getJSONObject(i);
                  System.out.println("Title: " + article.getJSONObject("media_id").getString("title"));
                  // 解析其他字段,如author、content等
              }
          }
      }
      

      请确保替换上述代码中的YOUR_APP_IDYOUR_APP_SECRET为你从微信公众平台上获取的实际值。

    5. 运行代码: 将这段代码复制到一个新的Java项目中,并添加OkHttp依赖。然后执行main函数,你将看到最近20篇文章的标题。你可以根据需要进一步解析JSON数据,获取更多文章信息。

    注意:这个例子仅用于演示目的,实际应用中应处理异常情况,例如网络错误、无效的access_token等。同时,为了保持API调用次数在免费额度内,建议缓存access_token并在过期前重新获取。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月16日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请