前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java公众号开发系列(二):新增和获取临时素材

Java公众号开发系列(二):新增和获取临时素材

原创
作者头像
IT技术分享社区
发布2024-01-28 08:43:18
2670
发布2024-01-28 08:43:18
举报
文章被收录于专栏:公众号开发

上一篇给大家介绍了如何获取token,今天给大家介绍新增和获取素材相关的实战。

Java公众号开发系列(一):如何获取access_token

公众号临时素材主要是解决使用接口发送消息时使用。下面介绍下如何通过java实现相应的操作。

一、公众号临时素材特点

1、临时素材media_id是可复用的。

2、媒体文件在微信后台保存时间为3天,即3天后media_id失效

3、文件格式大小限制如下表格

类型

格式

大小限制

长度限制

图片

PNG, JPEG, JPG, GIF

2MB

语音

AMR, MP3

2MB

60秒

视频

MP4

10MB

缩略图

JPG

64KB

二、请求说明

新增临时素材接口

请求

https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

http请求方式:POST/FORM

参数

是否必须

说明

access_token

调用接口凭证

type

媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)

media

form-data中媒体文件标识,有filename、filelength、content-type等信息

返回

代码语言:javascript
复制
{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}

{"errcode":40004,"errmsg":"invalid media type"}

获取临时素材接口

请求

https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID

参数

是否必须

说明

access_token

调用接口凭证

media_id

媒体文件ID

响应

取临时素材(即下载临时的多媒体文件),浏览器访问直接下载文件,也可以后台调用接口获得byte字节数组,然后后台根据实际业务保存或者发送消息。

注意:如果是视频素材返回的是下载url

代码语言:javascript
复制
{
 "video_url":DOWN_URL
}

错误返回

代码语言:javascript
复制
{
  "errcode":40007,
  "errmsg":"invalid media_id"
}

三、代码案例

引入依赖包okhttp

代码语言:javascript
复制
<!-- 上传临时素材方式使用okhttp框架-->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.1</version>
</dependency>

案例代码

代码语言:javascript
复制
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import java.io.*;
import java.net.URL;
import java.util.Objects;
import okhttp3.*;
/**
 * 临时素材上传、下载
 */
public class Demo2_AddTemporaryMedia {
    public static void main(String[] args) throws IOException {
        String imgurl = "https://developer.qcloudimg.com/user/attachment/4392601/20231019-977f3b10.png";
        // 获取公众号token
        String token = "";
        //上传图片素材
        String mediaId= uploadTemporaryMedia(imgurl, token);
        // 下载图片素材到本地
        GetTemporaryMediaByMediaId(mediaId,token);
    }
    /**
     * 上传临时素材获取 media_id
     *
     * @param imageUrl
     * @param accessToken
     * @return
     * @throws IOException
     */
    private static String uploadTemporaryMedia(String imageUrl, String accessToken) throws IOException {
        URL url = new URL(imageUrl);
        InputStream inputStream = url.openStream();
        OkHttpClient client = new OkHttpClient();
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("media", "image.png",
                        RequestBody.create(MediaType.parse("image/png"), Objects.requireNonNull(inputStreamToBytes(inputStream))))
                .build();
        Request request = new Request.Builder()
                .url("https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + accessToken + "&type=image")
                .post(requestBody)
                .build();
        Response response = client.newCall(request).execute();
        String responseBody = "";
        if (response.isSuccessful()) {
            responseBody = Objects.requireNonNull(response.body()).string();
            System.out.println(responseBody);
        } else {
            System.out.println("Request failed: " + response.code() + " - " + response.message());
        }
        response.close();
        // 解析返回结果,获取上传后的媒体 ID
        JSONObject result = JSONUtil.parseObj(responseBody);
        System.out.println(result.get("media_id").toString());
        return result.get("media_id").toString();
    }

    /**
     * 下载微信素材到本地
     * @param mediaId 媒体id
     * @param accessToken 公众号token
     * @throws FileNotFoundException
     */
    private static void GetTemporaryMediaByMediaId(String mediaId, String accessToken) throws FileNotFoundException {
        String url = StrUtil.format("https://api.weixin.qq.com/cgi-bin/media/get?access_token={}&media_id={}", accessToken, mediaId);
        HttpUtil.downloadFile(url,"D:\\test.png");
    }
    /**
     * 转为为byte数组
     *
     * @param inputStream
     * @return
     * @throws IOException
     */
    private static byte[] inputStreamToBytes(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, bytesRead);
        }
        byteArrayOutputStream.close();
        return byteArrayOutputStream.toByteArray();
    }
}

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、公众号临时素材特点
  • 二、请求说明
    • 新增临时素材接口
      • 获取临时素材接口
      • 三、代码案例
        • 引入依赖包okhttp
          • 案例代码
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档