阿里雲視訊點播獲取視訊點播的video資訊
阿新 • • 發佈:2020-09-22
背景
因為在專案中需要使用阿里雲的視訊點播服務,需要獲取視訊點播的時長資訊。
工具類
生成簽名串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));
}