All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.zkdcloud.core.MaterialComponent Maven / Gradle / Ivy

The newest version!
package cn.zkdcloud.core;

import cn.zkdcloud.component.material.Material;
import cn.zkdcloud.component.material.MaterialArticle;
import cn.zkdcloud.component.material.MaterialType;
import cn.zkdcloud.util.AccessToken;
import cn.zkdcloud.util.HttpUtil;
import cn.zkdcloud.util.JsonUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import netscape.javascript.JSObject;
import org.apache.log4j.Logger;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 素材管理
 *
 * @author zk
 * @version 2017/8/31
 */
public class MaterialComponent implements Component {

    private static Logger logger = Logger.getLogger(MaterialComponent.class);

    public static MaterialComponent materialComponent;
    /**
     * 上传临时素材(POST,FROM)
     */
    public static String UPLOAD_TEMP_MATERIAL = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + AccessToken.getAccessToken() + "&type=";

    /**
     * 新增永久图文素材(POST)
     */
    public static String UPLOAD_PERSISTENT_NEWS = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=" + AccessToken.getAccessToken();

    /**
     * 上传永久图片获取其URL(POST,FROM)
     */
    public static String UPLOAD_IMG_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + AccessToken.getAccessToken();

    /**
     * 新增其他类型永久素材
     * 通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息
     * 请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。
     * 意思是说也能从这里上传永久图片素材,至于占不占素材库,就不知道了,可能占
     */
    public static String UPLOAD_PERSISTENT_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=" + AccessToken.getAccessToken() + "&type=";

    /**
     * 下载临时的素材(GET 图片,语音,缩略图,视频等)
     */
    public static String DOWNLOAD_TEMP_MATERIAL = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=" + AccessToken.getAccessToken() + "&media_id=";

    /**
     * 下载永久素材(POST 图片,语音,缩略图,视频,图文消息)
     */
    public static String DOWNLOAD_PERSISTENT_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=" + AccessToken.getAccessToken();

    /**
     * 获取各种永久素材个数(GET)
     */
    public static String COUNT_PERSISTENT_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=" + AccessToken.getAccessToken();

    /**
     * 获取永久素材列表(POST)
     */
    public static String LIST_PERSISTENT_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=" + AccessToken.getAccessToken();

    /**
     * 修改永久图文素材(POST)
     */
    public static String UPDATE_PERSISTENT_NEWS_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/update_news?access_token=" + AccessToken.getAccessToken();

    /**
     * 删除永久素材(POST)
     */
    public static String DELETE_PERSISTENT_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=" + AccessToken.getAccessToken();

    @Override
    public void init() {

    }

    private MaterialComponent() {

    }

    /**
     * 上传临时素材(image,video,thumb,voice保存3天)
     *
     * @param file file material
     * @param type 素材类型
     * @return media_id
     */
    public String uploadTempMaterial(File file, MaterialType type) {
        String ret = HttpUtil.doPost(UPLOAD_TEMP_MATERIAL + type.toString().toLowerCase(), file);
        if (null == ret) {
            logger.info("upload temp image fail");
            return null;
        }
        return JSONObject.parseObject(ret).getString("media_id");
    }

    /**
     * 上传永久图文素材
     *
     * @param articles articles
     * @return media_id
     */
    public String uploadPersistentMaterial(List articles) {
        return uploadPersistentMaterial("{\"articles\":" + JSONObject.toJSONString(articles) + "}");
    }

    /**
     * 上传永久图文素材
     *
     * @param articles articles 图文json
     * @return media_id
     */
    public String uploadPersistentMaterial(String articles) {
        String ret = HttpUtil.doPost(UPLOAD_PERSISTENT_NEWS, articles);
        if (JsonUtil.isError(ret)) {
            logger.info("UPLOAD persistent material fail");
            return null;
        }
        return JSONObject.parseObject(ret).getString("media_id");
    }

    /**
     * 上传图片获取URL(注意返回的是url不是media_id,所以其不占素材库5000个限制)
     *
     * @param file img(jpg/png)
     * @return image's url
     */
    public String uploadPersistentImage(File file) {
        String ret = HttpUtil.doPost(UPLOAD_IMG_URL, file);
        if (JsonUtil.isError(ret)) {
            logger.info("upload image fail");
            return null;
        }
        return JSONObject.parseObject(ret).getString("url");
    }

    /**
     * 上传其他永久素材
     *
     * @param file file material
     * @return media_id and url
     * {
     * "media_id":MEDIA_ID,
     * "url":URL
     * }
     */
    public String uploadPersistentMaterial(File file, MaterialType type, String title, String introduction) {
        JSONObject attach = new JSONObject();
        attach.put("title", title);
        attach.put("introduction", introduction);

        String ret = HttpUtil.doPost(UPLOAD_PERSISTENT_MATERIAL + type.toString().toLowerCase(), file, attach.toJSONString());
        if (JsonUtil.isError(ret)) {
            logger.info("upload persistent material fail");
            return null;
        }
        return ret;
    }

    /**
     * 下载临时素材视频url
     *
     * @param media_id media_id
     * @return video url
     */
    public String downloadVideo(String media_id) {
        String ret = HttpUtil.doGet(DOWNLOAD_TEMP_MATERIAL.replace("https", "http") + media_id);
        if (JsonUtil.isError(ret)) {
            logger.info("get video resources fail");
            return null;
        }
        return JSONObject.parseObject(ret).getString("video_url");
    }


    /**
     * 下载临时素材(不包括视频)
     *
     * @param media_id media_id
     * @param filePath filePath(带文件名+文件格式)
     * @return file
     */
    public File downloadTempMaterial(String media_id, String filePath) {
        return HttpUtil.doGet(DOWNLOAD_TEMP_MATERIAL + media_id, filePath);
    }

    /**
     * 下载临时素材(不包括视频)
     *
     * @param media_id    media_id
     * @param fileDirPath 下载文件夹路i纪念馆
     * @param suffix      后缀名
     * @return
     */
    public File downloadTempMaterial(String media_id, String fileDirPath, String suffix) {
        fileDirPath = fileDirPath.replace("\\", "/");
        if (!fileDirPath.endsWith("/")) {
            fileDirPath += "/";
        }
        if (suffix.startsWith(".")) {
            suffix = suffix.substring(1);
        }

        String filePath = fileDirPath + System.currentTimeMillis() + "." + suffix;
        return HttpUtil.doGet(DOWNLOAD_TEMP_MATERIAL + media_id, filePath);
    }

    /**
     * 下载永久图文素材
     *
     * @param media_id media_id
     * @return List
     */
    public List downloadPersistentNews(String media_id) {
        JSONObject data = new JSONObject();
        data.put("media_id", media_id);
        String ret = HttpUtil.doPost(DOWNLOAD_PERSISTENT_MATERIAL, data.toJSONString());
        if (JsonUtil.isError(ret)) {
            logger.info("get persistent news fail");
            return null;
        }
        List articles = JSONObject.parseObject(ret).getJSONArray("news_item").toJavaList(MaterialArticle.class);
        return articles;
    }

    /**
     * 获取永久视频素材的url
     *
     * @param media_id media_id
     * @return video download url
     */
    public String downloadPersistentVideo(String media_id) {
        String ret = HttpUtil.doPost(DOWNLOAD_PERSISTENT_MATERIAL, "{\"media_id\":" + media_id + "}");
        if (JsonUtil.isError(ret)) {
            logger.info("get persistent video fail");
            return null;
        }
        return JSONObject.parseObject(ret).getString("down_url");
    }

    /**
     * 下载永久素材(不包括视频,图文)
     *
     * @param media_id media_id
     * @param filePath filePath(带文件名+文件格式)
     * @return file
     */
    public File downloadPersistentMaterial(String media_id, String filePath) {
        return HttpUtil.doGet(DOWNLOAD_PERSISTENT_MATERIAL + media_id, filePath);
    }

    /**
     * 下载永久素材(不包括视频,图文)
     *
     * @param media_id    media_id
     * @param fileDirPath 下载文件夹路径
     * @param suffix      后缀名
     * @return
     */
    public File downloadPersistentMaterial(String media_id, String fileDirPath, String suffix) {
        fileDirPath = fileDirPath.replace("\\", "/");
        if (!fileDirPath.endsWith("/")) {
            fileDirPath += "/";
        }
        if (suffix.startsWith(".")) {
            suffix = suffix.substring(1);
        }

        String filePath = fileDirPath + System.currentTimeMillis() + "." + suffix;
        return HttpUtil.doGet(DOWNLOAD_PERSISTENT_MATERIAL + media_id, filePath);
    }

    /**
     * 统计永久素材总数
     *
     * @return countJson
     * {
     * "voice_count":COUNT, 语音
     * "video_count":COUNT, 视频
     * "image_count":COUNT, 照片
     * "news_count":COUNT   图文
     * }
     */
    public String countPersistentMaterial() {
        String ret = HttpUtil.doGet(COUNT_PERSISTENT_MATERIAL);
        if (JsonUtil.isError(ret)) {
            logger.info("count persistent material fail : " + ret);
            return null;
        }
        return ret;
    }

    /**
     * 获取图文素材列表
     *
     * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
     * @param count  返回素材的数量,取值在1到20之间
     * @return 
     */
    public Map> getListNewsPersistentMaterial(Integer offset, Integer count) {
        JSONObject data = new JSONObject();
        data.put("type", "news");
        data.put("offset", offset);
        data.put("count", count);
        String ret = HttpUtil.doPost(LIST_PERSISTENT_MATERIAL, data.toJSONString());
        if (JsonUtil.isError(ret)) {
            logger.info("get list persistent material fail" + ret);
            return null;
        }
        Map> retMap = new HashMap<>();
        JSONArray articlesJsonArray = JSONObject.parseObject(ret).getJSONArray("item");
        for (int i = 0; i < articlesJsonArray.size(); i++) {
            JSONObject item = articlesJsonArray.getJSONObject(i);
            retMap.put(item.getString("media_id"), item.getJSONObject("content").getJSONArray("news_item").toJavaList(MaterialArticle.class));
        }
        return retMap;
    }

    /**
     * 获取其它素材列表
     *
     * @param type   type
     * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
     * @param count  返回素材的数量,取值在1到20之间
     * @return list
     */
    public List getListPersistentMaterial(MaterialType type, Integer offset, Integer count) {
        JSONObject data = new JSONObject();
        data.put("type", type.toString().toLowerCase());
        data.put("offset", offset);
        data.put("count", count);
        String ret = HttpUtil.doPost(LIST_PERSISTENT_MATERIAL, data.toJSONString());
        if (JsonUtil.isError(ret)) {
            logger.info("get list persistent material fail" + ret);
            return null;
        }

        return JSONObject.parseObject(ret).getJSONArray("item").toJavaList(Material.class);
    }

    /**
     * 更新某个图文永久素材
     *
     * @param media_id meida_id
     * @param index    要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
     * @param article  新图文素材内容
     * @return is or not success
     */
    public boolean updateNewsPersistentMaterial(String media_id, Integer index, MaterialArticle article) {
        JSONObject data = new JSONObject();
        data.put("media_id", media_id);
        data.put("index", index);
        data.put("articles", JSONObject.toJSONString(article));

        String ret = HttpUtil.doPost(UPDATE_PERSISTENT_NEWS_MATERIAL, data.toJSONString());
        if (JsonUtil.isError(ret)) {
            logger.info("update news persistent material fail :" + ret);
            return false;
        }
        return true;
    }

    /**
     * 删除指定永久素材
     *
     * @param media_id media_id
     * @return is or not success
     */
    public boolean deletePersistentMaterial(String media_id) {
        JSONObject data = new JSONObject();
        data.put("media_id", data);
        String ret = HttpUtil.doPost(DELETE_PERSISTENT_MATERIAL, data.toJSONString());
        if (JsonUtil.isError(ret)) {
            logger.info("delete persistent material fail:" + ret);
            return false;
        }
        return true;
    }

    /**
     * 获取material实例
     *
     * @return materialComponentBean
     */
    public static MaterialComponent getInstance() {
        if (null == materialComponent) {
            materialComponent = new MaterialComponent();
        }
        return materialComponent;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy