java實現(xiàn)優(yōu)酷視頻地址解析示例代碼分享
舉個例子比較好理解,比如我現(xiàn)在要下http://v.youku.com/v_show/id_XNDM2Mjc0MzAw.html這個視頻。這里我們要獲得的是視頻的id,就是XNDM2Mjc0MzAw這部分,這是一個視頻唯一的,所以在解析的時候肯定會用到。
為了能看清楚youku視頻的播放過程,可以使用火狐的插件firebug對網(wǎng)頁進行跟蹤,如下圖。
可以看到有很多GET,我們要找的應該是以這個id作為參數(shù)的GET,在下面我們可以找到這個鏈接
http://v.youku.com/player/getPlayList/VideoIDS/XNDM2Mjc0MzAw/timezone/+08/version/5/source/video?ran=3545&password=&n=3
這是youku獲取播放列表的GET,打開它的響應,這是一個json,我們需要的內(nèi)容是seed、streamfileids和segs。segs里面放的是視頻的分段key,streamfileids是一串亂碼,要用seed對他解碼。下面我截取了下載器的一部分來說明解碼的過程,解析json用的是json-lib-2.4-jdk15。
List<Video> videos = new ArrayList<Video>();
JSONObject data;
//json就是剛獲得的響應,類型為String。
data = JSONObject.fromObject(json).getJSONArray("data").getJSONObject(0);
double seed = Double.valueOf(data.getString("seed"));
String title = data.getString("title");
String fileid = data.getJSONObject("streamfileids").getString("flv");//如果要下的是mp4格式的話
String realFileid = getFileID(fileid, seed); //把flv改成mp4(前提是這個節(jié)點存在)
String fileid1 = realFileid.substring(0, 8);//解碼出來的id分成兩部分,中間要插入視頻分段
String fileid2 = realFileid.substring(10);
JSONArray segs = data.getJSONObject("segs").getJSONArray("flv");//segs部分解析
for (Iterator iterator = segs.iterator(); iterator.hasNext();) {
JSONObject object = (JSONObject) iterator.next();
int order = object.getInt("no");
String size = object.getString("size");
int seconds = object.getInt("seconds");
String key = object.getString("k");
String no = String.format("%1$02x", order);
String youUrl = "http://f.youku.com/player/getFlvPath/sid/" + "00_"
+ no + "/st/flv/fileid/" + fileid1 + no + fileid2 + "?K="
+ key;
videos.add(new Video(order, seconds, youUrl, size, key, title));
}
youUrl就是我們要的視頻地址,比如上面那個視頻的第一段是:
http://f.youku.com/player/getFlvPath/sid/134434081131213125530_00/st/flv/fileid/030001090050201D77EDBC04650AC2DD6027D5-ED5F-27F6-8E73-DEF478121887&K=b499f3d5df944cfc2827e2ec
藍色的是隨機生成的,可以用00代替。
flv表示所要下載的視頻格式,也可以選mp4,如果有的話。
黃色的兩個00是分段碼,十六進制,比如第一段是00,第二段01,第十五段0f。
后面的是fileid,需要通過seed和streamfileids來破解,每段視頻都一樣。
最后面的K是在segs中獲得的,不需要破解,每段視頻都不一樣。
其中的兩個解碼函數(shù)為:
private String getFileID(String fileid, double seed) {
String mixed = getFileIDMixString(seed);
String[] ids = fileid.split("\\*");
StringBuilder realId = new StringBuilder();
int idx;
for (int i = 0; i < ids.length; i++) {
idx = Integer.parseInt(ids[i]);
realId.append(mixed.charAt(idx));
}
return realId.toString();
}
private String getFileIDMixString(double seed) {
StringBuilder mixed = new StringBuilder();
StringBuilder source = new StringBuilder(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890");
int index, len = source.length();
for (int i = 0; i < len; ++i) {
seed = (seed * 211 + 30031) % 65536;
index = (int) Math.floor(seed / 65536 * source.length());
mixed.append(source.charAt(index));
source.deleteCharAt(index);
}
return mixed.toString();
}
代碼最后將得到一個Video類型的List,Video中的order是視頻的編號,seconds是時間長度,size是字節(jié)長度,youUrl就是真正的視頻地址,還有視頻的標題title。還有一些其他的內(nèi)容都可以從json中獲得。
相關文章
Java基于JavaMail實現(xiàn)向QQ郵箱發(fā)送郵件
這篇文章主要為大家詳細介紹了Java基于JavaMail實現(xiàn)向QQ郵箱發(fā)送郵件的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01springboot大文件上傳、分片上傳、斷點續(xù)傳、秒傳的實現(xiàn)
本文主要介紹了springboot大文件上傳、分片上傳、斷點續(xù)傳、秒傳的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07springboot自動裝配TypeNotPresentExceptionProxy異常排查解決
這篇文章主要為大家介紹了springboot自動裝配TypeNotPresentExceptionProxy異常排查解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Java+Nginx實現(xiàn)POP、IMAP、SMTP郵箱代理服務
本篇文章的內(nèi)容是介紹Java+Nginx如何實現(xiàn)POP、IMAP、SMTP郵箱代理服務,步驟詳細,思路清新,需要的朋友可以參考下2015-07-07