1. 程式人生 > 實用技巧 >阿里雲視訊點播獲取視訊點播的video資訊

阿里雲視訊點播獲取視訊點播的video資訊

背景

因為在專案中需要使用阿里雲的視訊點播服務,需要獲取視訊點播的時長資訊。

工具類

生成簽名串Signature
SignatureUtils.java


package com.meeno.wzq.alibaba.signature;

import com.google.common.collect.Maps;
import com.meeno.framework.util.HttpUtils;
import lombok.extern.java.Log;
import sun.misc.BASE64Encoder;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @description: 生成簽名串Signature
 * @author: Wzq
 * @create: 2020-01-14 17:38
 */
@Log
public class SignatureUtils {


    /*對所有引數名稱和引數值做URL編碼*/
    public static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) {
        List<String> encodeParams = new ArrayList<String>();
        if (publicParams != null) {
            for (String key : publicParams.keySet()) {
                String value = publicParams.get(key);
                //將引數和值都urlEncode一下。
                String encodeKey = percentEncode(key);
                String encodeVal = percentEncode(value);
                encodeParams.add(encodeKey + "=" + encodeVal);
            }
        }
        if (privateParams != null) {
            for (String key : privateParams.keySet()) {
                String value = privateParams.get(key);
                //將引數和值都urlEncode一下。
                String encodeKey = percentEncode(key);
                String encodeVal = percentEncode(value);
                encodeParams.add(encodeKey + "=" + encodeVal);
            }
        }
        return encodeParams;
    }
    /*獲取 CanonicalizedQueryString*/
    public static String getCQS(List<String> allParams) {
        ParamsComparator paramsComparator = new ParamsComparator();
        Collections.sort(allParams, paramsComparator);
        String cqString = "";
        for (int i = 0; i < allParams.size(); i++) {
            cqString += allParams.get(i);
            if (i != allParams.size() - 1) {
                cqString += "&";
            }
        }
        return cqString;
    }
    /*字串引數比較器,按字母序升序*/
    public static class ParamsComparator implements Comparator<String> {
        @Override
        public int compare(String lhs, String rhs) {
            return lhs.compareTo(rhs);
        }
    }

    public static byte[] hmacSHA1Signature(String accessKeySecret, String stringToSign) {
        try {
            String key = accessKeySecret + "&";
            try {
                SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
                Mac mac = Mac.getInstance("HmacSHA1");
                mac.init(signKey);
                return mac.doFinal(stringToSign.getBytes());
            } catch (Exception e) {
                throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
            }
        } catch (SignatureException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static String newStringByBase64(byte[] bytes)
            throws UnsupportedEncodingException {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        return new String(new BASE64Encoder().encode(bytes));
    }

    /*特殊字元替換為轉義字元*/
    public static String percentEncode(String value) {
        try {
            String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8");
            String plusReplaced = urlEncodeOrignStr.replace("+", "%20");
            String starReplaced = plusReplaced.replace("*", "%2A");
            String waveReplaced = starReplaced.replace("%7E", "~");
            return waveReplaced;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return value;
    }

    /*生成當前UTC時間戳Time*/
    public static String generateTimestamp() {
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        return df.format(date);
    }

    /*生成隨機數SignatureNonce*/
    public static String generateRandom() {
        String signatureNonce = UUID.randomUUID().toString();
        return signatureNonce;
    }

}


httpUtils.java
請求工具類

package com.meeno.framework.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.meeno.encryptionmodule.testPaper.service.TestpaperServiceImpl;
import com.meeno.wzq.config.PlatformServerConfig;
import com.meeno.wzq.constants.EncryptionConstants;
import com.meeno.wzq.constants.PlatformUrlEnum;
import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HttpContext;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.*;

/**
 * @Auther: Wzq
 * @Date: 2019/4/2 11:20
 * @Description: 得不到的永遠在騷動,被偏愛的都有恃無恐。 -- HttpUtils
 */
public class HttpUtils {


    private final static PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager();  //連線池管理器
    private final static HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {  //retry handler
        public boolean retryRequest(IOException exception,
                                    int executionCount, HttpContext context) {
            if (executionCount >= 5) {
                return false;
            }
            if (exception instanceof NoHttpResponseException) {
                return true;
            }
            if (exception instanceof InterruptedIOException) {
                return false;
            }
            if (exception instanceof UnknownHostException) {
                return false;
            }
            if (exception instanceof ConnectTimeoutException) {
                return false;
            }
            HttpClientContext clientContext = HttpClientContext
                    .adapt(context);
            HttpRequest request = clientContext.getRequest();

            if (!(request instanceof HttpEntityEnclosingRequest)) {
                return true;
            }
            return false;
        }
    };

    static {   //類載入的時候 設定最大連線數 和 每個路由的最大連線數
        poolConnManager.setMaxTotal(200000);
        poolConnManager.setDefaultMaxPerRoute(100000);
    }
    /**
     * ########################### core code#######################
     * @return
     */
    private static CloseableHttpClient getCloseableHttpClient() {
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(poolConnManager)
                .setRetryHandler(httpRequestRetryHandler)
                .build();

        return httpClient;
    }

    /**
     * 封裝HTTP GET方法
     * 有引數的Get請求
     * @param
     * @param
     * @return
     * @throws ClientProtocolException
     * @throws java.io.IOException
     */
    public static String getAjax(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {
        HttpClient httpClient = getCloseableHttpClient();
        HttpGet httpGet = new HttpGet();
        List<NameValuePair> formparams = setHttpParams(paramMap);
        String param = URLEncodedUtils.format(formparams, "UTF-8");
        httpGet.setURI(URI.create(url + "?" + param));
        HttpResponse response = httpClient.execute(httpGet);
        String httpEntityContent = getHttpEntityContent(response);
        httpGet.abort();
        return httpEntityContent;
    }

    /**
     * 封裝HTTP GET方法
     * 有引數的Get請求
     * @param
     * @param
     * @return
     * @throws ClientProtocolException
     * @throws java.io.IOException
     */
    public static String get(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {
        paramMap = getParamsData(paramMap);
        HttpClient httpClient = getCloseableHttpClient();
        HttpGet httpGet = new HttpGet();
        List<NameValuePair> formparams = setHttpParams(paramMap);
        String param = URLEncodedUtils.format(formparams, "UTF-8");
        httpGet.setURI(URI.create(url + "?" + param));
        HttpResponse response = httpClient.execute(httpGet);
        String httpEntityContent = getHttpEntityContent(response);
        httpGet.abort();
        return httpEntityContent;
    }

    /**
     * 封裝HTTP GET方法
     * 無引數的Get請求
     * @param
     * @return
     * @throws ClientProtocolException
     * @throws java.io.IOException
     */
    public static String get(String url) throws ClientProtocolException, IOException {
        //首先需要先建立一個DefaultHttpClient的例項
        HttpClient httpClient = new DefaultHttpClient();
        //先建立一個HttpGet物件,傳入目標的網路地址,然後呼叫HttpClient的execute()方法即可:
        HttpGet httpGet = new HttpGet();
        httpGet.setURI(URI.create(url));
        HttpResponse response = httpClient.execute(httpGet);
        String httpEntityContent = getHttpEntityContent(response);
        httpGet.abort();
        return httpEntityContent;
    }
    /**
     * 獲得響應HTTP實體內容
     * @param response
     * @return
     * @throws java.io.IOException
     * @throws java.io.UnsupportedEncodingException
     */
    private static String getHttpEntityContent(HttpResponse response) throws IOException, UnsupportedEncodingException {
        //通過HttpResponse 的getEntity()方法獲取返回資訊
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream is = entity.getContent();
            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String line = br.readLine();
            StringBuilder sb = new StringBuilder();
            while (line != null) {
                sb.append(line + "\n");
                line = br.readLine();
            }
            br.close();
            is.close();
            return sb.toString();
        }
        return "";
    }


    /**
     * 封裝支付HTTP POST方法
     * @param
     * @param
     * @return
     * @throws ClientProtocolException
     * @throws java.io.IOException
     */
    public static String postPayMsg(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {
        HttpClient httpClient = new DefaultHttpClient();
        httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
        httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
        HttpPost httpPost = new HttpPost(url);
        paramMap = getParamsData(paramMap);
        List<NameValuePair> formparams = setHttpParams(paramMap);
        UrlEncodedFormEntity param = new UrlEncodedFormEntity(formparams, "UTF-8");
        //通過setEntity()設定引數給post
        httpPost.setEntity(param);
        //利用httpClient的execute()方法傳送請求並且獲取返回引數
        HttpResponse response = httpClient.execute(httpPost);
        String httpEntityContent = getHttpEntityContent(response);
        httpPost.abort();
        return httpEntityContent;
    }

    /**
     * 設定請求引數
     * @param
     * @return
     */
    private static List<NameValuePair> setHttpParams(Map<String, String> paramMap) {
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();
        Set<Map.Entry<String, String>> set = paramMap.entrySet();
        for (Map.Entry<String, String> entry : set) {
            formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
        }
        return formparams;
    }

    public static Map<String,String> getParamsData(Map<String,String> paramsMap){
        Map<String,String> params = new HashMap<>();
        String dataJson = JSONObject.toJSONString(paramsMap);
        params.put("Data",dataJson);

        return params;
    }

    /**
     * @描述:  獲取http請求的JSONObject
     * @引數: [jsonStr]
     * @返回值: com.alibaba.fastjson.JSONObject
     * @建立人 WZQ
     * @建立時間: 11:38 2019/4/2
     */
    public static JSONObject getResponseJson(String jsonStr){
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        return jsonObject;
    }

    /**
     * @描述: 獲取新增返回的data id
     * @引數: [jsonStr]
     * @返回值: java.lang.Long
     * @建立人 WZQ
     * @建立時間: 11:38 2019/4/2
     */
    public static Long getResponseData(String jsonStr){
        return JSONObject.parseObject(jsonStr).getLong("data");
    }


    /**
     * @描述: 執行獲取Id
     * @引數: [url, paramsMap]
     * @返回值: java.lang.Long
     * @建立人 WZQ
     * @建立時間: 17:24 2019/4/2
     */
  /*  public static Long executeHttpGetId(String url,Map<String,String> paramsMap){
//        JSONObject jsonObject = executeHttp(url,paramsMap);
        System.out.println(url);
        String getStr = null;
        try {
            getStr = get(url,paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONObject.parseObject(getStr).getLong("data");
    }*/

    /**
     * @描述: 執行返回JSONArr
     * @引數: [utl, paramsMap]
     * @返回值: java.lang.String
     * @建立人 WZQ
     * @建立時間: 17:17 2019/4/2
     */
    public static JSONArray executeHttpGetResultArr(String url, Map<String,String> paramsMap){
        System.out.println(url);
        String getStr = null;
        try {
            getStr = get(url,paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONObject.parseObject(getStr).getJSONArray("data");
    }

    public static JSONArray executeHttpGetResultArr(PlatformUrlEnum url, Map<String,String> paramsMap){
        System.out.println(url);
        String getStr = null;
        try {
            getStr = postPayMsg(PlatformServerConfig.baseUrl+url.getUrl(),paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONObject.parseObject(getStr).getJSONArray("data");
    }

    public static void executeHttpNoReturn(String url,Map<String,String> paramsMap){
        System.out.println(url);
        String getStr = null;
        try {
            getStr = get(url,paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //JSONObject jsonObject = JSONObject.parseObject(getStr);
    }

   /**
     * @描述: 執行返回JSON
     * @引數: [utl, paramsMap]
     * @返回值: java.lang.String
     * @建立人 WZQ
     * @建立時間: 17:17 2019/4/2
     */
    public static JSONObject executeHttpGetResult(String url,Map<String,String> paramsMap){
        System.out.println(url);
        String getStr = null;
        try {
            getStr = get(url,paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject jsonObject = JSONObject.parseObject(getStr);
        return jsonObject.getJSONObject("data");
    }

    public static JSONObject executeHttpGetResult(PlatformUrlEnum url, Map<String,String> paramsMap){
        System.out.println(url);
        String getStr = null;
        try {
            getStr = get(PlatformServerConfig.baseUrl+url.getUrl(),paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONObject.parseObject(getStr).getJSONObject("data");
    }

    /**
     * @描述:
     * @引數: [url, paramsMap]
     * @返回值: com.alibaba.fastjson.JSONObject
     * @建立人 WZQ
     * @建立時間: 15:44 2019/4/8
     */
  /*  public static JSONObject execute(String url,Map<String,String> paramsMap){
        System.out.println(url);
        String getStr = null;
        try {
            getStr = get(url,paramsMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONObject.parseObject(getStr);
    }
*/


    /**
     * @描述: 執行獲取Id
     * @引數: [url, paramsMap]
     * @返回值: java.lang.Long
     * @建立人 WZQ
     * @建立時間: 17:24 2019/4/2
     */
    public static Long executeHttpGetId(String url,Map<String,String> paramsMap){
        Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);
        Method method = (Method) tempMap.get("method");
        Object obj = tempMap.get("object");
        List params = Lists.newArrayList();

        for(String key : paramsMap.keySet()){
            String value = paramsMap.get(key);
            if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){
                Long tempVal = Long.valueOf(value);
                params.add(tempVal);
            }else{
                if("null".equals(value)){
                    params.add(null);
                }else{
                    params.add(value);
                }
            }
        }
        Object object = null;
        try {
            /*LocalVariableTableParameterNameDiscoverer u =
                    new LocalVariableTableParameterNameDiscoverer();
            String[] params1 = u.getParameterNames(method);
            String name = method.getParameters()[0].getName();*/
            object =  method.invoke(obj,params.toArray());
        } catch (Exception e) {
            e.printStackTrace();
            MeenoAssert.notTrue(true,"加密資料發生錯誤!");
        }

        return ((JSONObject)object).getLong("id");
    }

    /**
     * @描述: 執行返回JSON
     * @引數: [utl, paramsMap]
     * @返回值: java.lang.String
     * @建立人 WZQ
     * @建立時間: 17:17 2019/4/2
     */
    public static JSONObject executeHttp(String url,Map<String,String> paramsMap){
        Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);
        Method method = (Method) tempMap.get("method");
        Object obj = tempMap.get("object");
        List params = Lists.newArrayList();

        for(String key : paramsMap.keySet()){
            String value = paramsMap.get(key);
            if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){
                Long tempVal = Long.valueOf(value);
                params.add(tempVal);
            }else{
                if("null".equals(value)){
                    params.add(null);
                }else{
                    params.add(value);
                }
            }
        }
        Object object = null;
        try {
            object =  method.invoke(obj,params.toArray());
        } catch (Exception e) {
            e.printStackTrace();
            MeenoAssert.notTrue(true,"加密資料發生錯誤!");
        }

        return ((JSONObject)object);
    }

    /**
     * @描述:
     * @引數: [url, paramsMap]
     * @返回值: com.alibaba.fastjson.JSONObject
     * @建立人 WZQ
     * @建立時間: 15:44 2019/4/8
     */
    public static JSONObject execute(String url,Map<String,String> paramsMap){
        Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);
        Method method = (Method) tempMap.get("method");
        Object obj = tempMap.get("object");
        List params = Lists.newArrayList();

        for(String key : paramsMap.keySet()){
            String value = paramsMap.get(key);
            if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){
                Long tempVal = Long.valueOf(value);
                params.add(tempVal);
            }else{
                if("null".equals(value)){
                    params.add(null);
                }else{
                    params.add(value);
                }
            }
        }
        Object object = null;
        try {
            object =  method.invoke(obj,params.toArray());
        } catch (Exception e) {
            e.printStackTrace();
            MeenoAssert.notTrue(true,"加密資料發生錯誤!");
        }

        return ((JSONObject)object);
    }



}

VideoUtils.java
videoUtils獲取視訊資訊工具類


package com.meeno.wzq.alibaba.video;

import com.google.common.collect.Maps;
import com.meeno.framework.util.HttpUtils;
import com.meeno.wzq.alibaba.signature.SignatureUtils;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @description: videoUtils獲取視訊資訊工具類
 * @author: Wzq
 * @create: 2020-01-14 19:31
 */
public class VideoUtils {


    /**
     *@Description 獲取簽名結果
     *@Param [accessKeyId, accessKeySecret, videoId]
     *@Return java.lang.String
     *@Author Wzq
     *@Date 2020/1/14
     *@Time 19:30
     */
    public static String getVideoInfo(String accessKeyId,String accessKeySecret,String videoId) throws IOException {
        String timestamp = SignatureUtils.generateTimestamp();
        String signatureNonce = SignatureUtils.generateRandom();
        //1.1. 構造規範化的請求字串
        Map<String, String> privateParams = Maps.newLinkedHashMap();
        privateParams.put("Action","GetVideoInfo");
        privateParams.put("VideoId", videoId);
        Map<String, String> publicParams = Maps.newLinkedHashMap();
        publicParams.put("Timestamp",timestamp);
        publicParams.put("Format","JSON");
        publicParams.put("AccessKeyId",accessKeyId);
        publicParams.put("SignatureMethod", "HMAC-SHA1");
        publicParams.put("SignatureNonce",signatureNonce);
        publicParams.put("Version", "2017-03-21");
        publicParams.put("SignatureVersion","1.0");

        List<String> allParams = SignatureUtils.getAllParams(publicParams, privateParams);

        String canonicalizedQueryString = SignatureUtils.getCQS(allParams);

        //1.2. 構造待簽名的字串
        /*構造待簽名的字串*/
        String StringToSign = "GET" + "&" + SignatureUtils.percentEncode("/") + "&" + SignatureUtils.percentEncode(canonicalizedQueryString);

        //1.3. 計算待簽名字串的HMAC值
        byte[] bytes = SignatureUtils.hmacSHA1Signature(accessKeySecret, StringToSign);

        //1.4. 編碼得到最終簽名值
        //按照 Base64 編碼規則將1.3中計算得到的HMAC值編碼成字串,得到最終簽名值(Signature)。
        String signature = SignatureUtils.newStringByBase64(bytes);
//        log.info("-------------"+signature);
        Map<String,String> videoInfoMap = Maps.newLinkedHashMap();
        videoInfoMap.put("Action","GetVideoInfo");
        videoInfoMap.put("VideoId", videoId);
        videoInfoMap.put("Format","JSON");
        videoInfoMap.put("AccessKeyId",accessKeyId);
        videoInfoMap.put("Signature",signature);
        videoInfoMap.put("SignatureMethod","HMAC-SHA1");
        videoInfoMap.put("SignatureVersion","1.0");
        videoInfoMap.put("SignatureNonce",signatureNonce);
        videoInfoMap.put("Timestamp", timestamp);
        videoInfoMap.put("Version","2017-03-21");
        //呼叫http get請求
        String resultStr = HttpUtils.getAjax("http://vod.cn-shanghai.aliyuncs.com", videoInfoMap);
//        log.info(s);
        return resultStr;
    }

}

呼叫獲取視訊點播工具類獲取videoinfo

controller層程式碼如下:



    /**
    *@Description 獲取視訊點播的視訊資訊
    *@Param [session, request, response, data]
    *@Return void
    *@Author Wzq
    *@Date 2020/1/14
    *@Time 19:34
    */
    @RequestMapping(value = "getVideoInfo.action")
    public void getVideoInfo(final HttpSession session,
                             final HttpServletRequest request,
                             final HttpServletResponse response,
                             @RequestParam(value = "Data") String data) throws IOException {

        JSONObject jsonObject = JSONObject.parseObject(data);
        //視訊點播videoId
        String videoId = jsonObject.getString("videoId");
        Bank indexBank = this.enterpriseDao.getEnterprise().getIndexBank();
        String accessKeyId = "";
        String accessKeySecret = "";
        String videoInfo = VideoUtils.getVideoInfo(accessKeyId, accessKeySecret, videoId);
        JSONObject resultJson = null;
        if(videoInfo != null && !videoInfo.isEmpty()){
            resultJson = JSONObject.parseObject(videoInfo);
        }
        CommonUtil.toJson(response, new ResponseBean(Constant.RESPONSE_SUCCESS,"",resultJson));
    }