MediaApi.java
14.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
package com.jfinal.weixin.sdk.api;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.IOUtils;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.JsonUtils;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 素材管理
* @author l.cm
* 文档:http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html
*/
public class MediaApi {
/**
* 上传的临时多媒体文件有格式
* 分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
*/
public static enum MediaType {
IMAGE, VOICE, VIDEO, THUMB;
// 转化成小写形式
public String get() {
return this.name().toLowerCase();
}
}
// 新增临时素材
private static String upload_url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=";
/**
* 上传临时素材
* @param mediaType 上传的临时多媒体文件有格式
* @param file 需要上传的文件
* @return ApiResult
*/
public static ApiResult uploadMedia(MediaType mediaType, File file) {
String url = upload_url + AccessTokenApi.getAccessTokenStr() + "&type=" + mediaType.get();
String jsonStr = HttpUtils.upload(url, file, null);
return new ApiResult(jsonStr);
}
// 文档中是需要用https,实际采用https会报错
private static String uploadVideoUrl = "http://file.api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token=";
/**
* 视频群发的消息素材上传
* @param mediaId 用于群发的消息的media_id
* @param title 消息的标题
* @param description 消息的描述
* @return {ApiResult}
*/
public static ApiResult uploadVideo(String mediaId, String title, String description) {
String url = uploadVideoUrl + AccessTokenApi.getAccessTokenStr();
Map<String, String> mapData = new HashMap<String, String>();
mapData.put("media_id", mediaId);
mapData.put("title", title);
mapData.put("description", description);
String jsonResult = HttpUtils.post(url, JsonUtils.toJson(mapData));
return new ApiResult(jsonResult);
}
private static String uploadNews = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=";
/**
* 上传图文消息素材【订阅号与服务号认证后均可用】
* @param mediaArticles 素材实体
* @return {ApiResult}
*/
public static ApiResult uploadNews(List<MediaArticles> mediaArticles) {
String url = uploadNews + AccessTokenApi.getAccessTokenStr();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("articles", mediaArticles);
String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap));
return new ApiResult(jsonResult);
}
private static String get_url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=";
/**
* 获取临时素材
* @param media_id 素材Id
* @return MediaFile
*/
public static MediaFile getMedia(String media_id) {
String url = get_url + AccessTokenApi.getAccessTokenStr() + "&media_id=" + media_id;
return HttpUtils.download(url);
}
private static String get_jssdk_media = "https://api.weixin.qq.com/cgi-bin/media/get/jssdk?access_token=";
/**
* 高清语音素材获取接口
*
* 公众号可以使用本接口获取从JSSDK的uploadVoice接口上传的临时语音素材,格式为speex,16K采样率。
* 该音频比上文的临时素材获取接口(格式为amr,8K采样率)更加清晰,适合用作语音识别等对音质要求较高的业务。
*
* @param media_id 素材Id
* @return MediaFile
*/
public static MediaFile getJssdkMedia(String media_id) {
String url = get_jssdk_media + AccessTokenApi.getAccessTokenStr() + "&media_id=" + media_id;
return HttpUtils.download(url);
}
private static String add_news_url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=";
/**
* 新增永久图文素材
* @param mediaArticles 图文列表
* @return ApiResult
*/
public static ApiResult addNews(List<MediaArticles> mediaArticles) {
String url = add_news_url + AccessTokenApi.getAccessTokenStr();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("articles", mediaArticles);
String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap));
return new ApiResult(jsonResult);
}
private static String uploadImgUrl = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=";
/**
* 上传图文消息内的图片获取URL
* 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。
* 图片仅支持jpg/png格式,大小必须在1MB以下。
* @param imgFile 图片文件
* @return ApiResult
*/
public static ApiResult uploadImg(File imgFile) {
String url = uploadImgUrl + AccessTokenApi.getAccessTokenStr();
String jsonResult = HttpUtils.upload(url, imgFile, null);
return new ApiResult(jsonResult);
}
private static String addMaterialUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=";
/**
* 新增其他类型永久素材
* @param file 文件
* @param mediaType 素材类型
* @return ApiResult
*/
public static ApiResult addMaterial(File file, MediaType mediaType) {
String url = addMaterialUrl + AccessTokenApi.getAccessTokenStr() + "&type=" + mediaType.get();
String jsonResult = HttpUtils.upload(url, file, null);
return new ApiResult(jsonResult);
}
/**
* 新增视频永久素材
* 素材的格式大小等要求与公众平台官网一致。
* 具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
* @param file 文件
* @param title 文件标题
* @param introduction 介绍
* @return ApiResult
*/
public static ApiResult addMaterial(File file, String title, String introduction) {
String url = addMaterialUrl + AccessTokenApi.getAccessTokenStr();
Map<String, String> dataMap = new HashMap<String, String>();
dataMap.put("title", title);
dataMap.put("introduction", introduction);
String jsonResult = HttpUtils.upload(url, file, JsonUtils.toJson(dataMap));
return new ApiResult(jsonResult);
}
// 获取永久素材
private static String get_material_url = "https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=";
/**
* 获取永久素材
* @param media_id 要获取的素材的media_id
* @return InputStream 流,考虑到这里可能返回json或file请自行使用IOUtils转换
*/
public static InputStream getMaterial(String media_id) {
String url = get_material_url + AccessTokenApi.getAccessTokenStr();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("media_id", media_id);
return HttpUtils.download(url, JsonUtils.toJson(dataMap));
}
// 删除永久素材
private static String del_material_url = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=";
/**
* 删除永久素材
* @param media_id 要获取的素材的media_id
* @return ApiResult 返回信息
*/
public static ApiResult delMaterial(String media_id) {
String url = del_material_url + AccessTokenApi.getAccessTokenStr();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("media_id", media_id);
String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap));
return new ApiResult(jsonResult);
}
private static String update_news_url = "https://api.weixin.qq.com/cgi-bin/material/update_news?access_token=";
/**
* 修改永久图文素材
* @param media_id 要修改的图文消息的id
* @param index 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
* @param mediaArticles 图文素材
* @return ApiResult 返回信息
*/
public static ApiResult updateNews(String media_id, int index, MediaArticles mediaArticles) {
String url = update_news_url + AccessTokenApi.getAccessTokenStr();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("media_id", media_id);
dataMap.put("index", index);
dataMap.put("articles", mediaArticles);
String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap));
return new ApiResult(jsonResult);
}
// 获取素材总数
private static String get_materialcount_url = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=";
/**
* 获取素材总数
* @return ApiResult 返回信息
*/
public static ApiResult getMaterialCount() {
String url = get_materialcount_url + AccessTokenApi.getAccessTokenStr();
String jsonResult = HttpUtils.get(url);
return new ApiResult(jsonResult);
}
// 获取素材列表
private static String batchget_material_url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=";
/**
* 获取素材列表
* @param mediaType 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
* @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
* @param count 返回素材的数量,取值在1到20之间
* @return ApiResult 返回信息
*/
public static ApiResult batchGetMaterial(MediaType mediaType, int offset, int count) {
String url = batchget_material_url + AccessTokenApi.getAccessTokenStr();
if(offset < 0) offset = 0;
if(count > 20) count = 20;
if(count < 1) count = 1;
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("type", mediaType.get());
dataMap.put("offset", offset);
dataMap.put("count", count);
String jsonResult = HttpUtils.post(url, JsonUtils.toJson(dataMap));
return new ApiResult(jsonResult);
}
public static void main(String[] args) {
PropKit.use("a_little_config.txt");
ApiConfig apiConfig = new ApiConfig();
apiConfig.setAppId(PropKit.get("appId"));
apiConfig.setAppSecret(PropKit.get("appSecret"));
ApiConfigKit.putApiConfig(apiConfig);
//1.传图片为永久素材
System.out.println(PathKit.getWebRootPath());
File file = new File(PathKit.getWebRootPath()+"/src/main/webapp/img/640.jpg");
ApiResult imgResult = MediaApi.addMaterial(file,MediaType.IMAGE);
System.out.println("上传图片="+imgResult);
//http://mmbiz.qpic.cn/mmbiz_jpg/GvjIxopRiaeqNudlENIB4d8fX2MTcp3uTIdZQ152jf1cZcM1HicKI4G1H8ibEndgECvvsTZMSnibVQNpr1wEvxBYjQ/0?wx_fmt=jpeg
JSONObject json = JSONObject.parseObject(imgResult.getJson());
//上传图文消息
List<MediaArticles> mediaArticlesList = new ArrayList<MediaArticles>();
MediaArticles mediaArticles = new MediaArticles();
mediaArticles.setTitle("公司简介");
mediaArticles.setThumb_media_id(json.getString("media_id"));
mediaArticles.setDigest("中兴智能交通股份有限公司");
mediaArticles.setShow_cover_pic(false);
mediaArticles.setContent("中兴智能交通股份有限公司成立于2000年4月,是中兴通讯股份有限公司投资的致力于交通运输领域智能交通 业务的专业公司,是中国第一批从事智能交通(ITS)产业的高新技术企业。"+
"公司的主营业务面向城市交通(公安交通、公共交通、智慧停车),"
+ "城际交通(高速公路和铁路)和综合交通信 息服务领域,为城市公安交通、"
+ "公共交通、智慧停车、高速公路和轨道交通五大综合交通运输领域提供交通规划、方 案设计、"
+ "系统建设、运营和服务,构建以智能交通核心产品技术的产品研发、生产、"
+ "系统建设和维护为一体的动静态 交通业务生态服务体系。"
+ "为客户提供个性化的智能交通解决方案和技术服务,"
+ "同时公司在以智慧停车产品的研发、生产、 销售和服务为基础的静态交通服务的基础上,"
+ "为用户出行提供“互联网+智慧停车”的“020”的运营服务。公司最终整合 "
+ "动态交通和静态交通的信息数据资源,通过物联网、云计算及大数据技术,"
+ "为客户提供全方位的交通管理与综合交通 信息服务。"
+ "公司秉承“构建绿色交通,享受安全便利出行”的使命,致力于实现客户价值最大化,矢志成为“智慧交通领域的领跑者”。<br/>"
+ "<img alt=\"\" data-src=\"\" src=\"http://mmbiz.qpic.cn/mmbiz_jpg/GvjIxopRiaeod7SedB3Pl4wicvdIyE3xfRXv0ReyHr20MUmBia8Q0w8UPYGGJJyqFm71k8ZBXrtibU8uNPD7gK0iaCg/0\"/>");
mediaArticlesList.add(mediaArticles);
ApiResult result= MediaApi.addNews(mediaArticlesList);
System.out.println(result);//{"media_id":"O_g1TE11gGxFk1ZxRG0hjSQXX-hN541uJeYm0ZcJBKU"}
InputStream inputStream = MediaApi.getMaterial(JSONObject.parseObject(result.getJson()).getString("media_id"));
System.out.println(AccessTokenApi.getAccessTokenStr());
//curl "https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=-i7zksrYfHCa0cngOYQ7rDY-WnC8wE9Z-t9mrizm52j_xivT7S_f1wRRfJwxOU38zl1iUl2x6sf_manseP0mUI2eEA70gSOvQNHwYmN3QGTW74yBM4-TsUD8fxia29IVHKBdAFAWZQ" -d '{"media_id":"uoyEvtwgPnjvtY6EA6jgIDstDlIABN-EW7s9nQmPLtE"}' > /Users/wangfs/Desktop/a.html
}
}