Youku 視頻絕對(duì)地址獲取的方法詳解
更新時(shí)間:2013年06月26日 11:59:23 作者:
本篇文章是對(duì)Youku 視頻絕對(duì)地址獲取的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
前一陣子為了研究 KnLiveCommentary 而進(jìn)行了一系列的關(guān)于視頻站點(diǎn)的研究。由于KnLiveCommentary需要能夠獲取充足的視頻源進(jìn)行測(cè)試,所以我們選取了 Youku(優(yōu)酷)一個(gè)比較大的視頻網(wǎng)站來(lái)進(jìn)行測(cè)試。
其實(shí)開(kāi)始研究解析絕對(duì)地址也是為了研究Youku 的自帶播放器,順便去除廣告什么的。后來(lái)我們就把Youku 的播放器用 ASV6 (ActionScript Viewer 6)“反編譯”了一下,達(dá)到了驚人的效果。
Youku的視頻采取了加密+動(dòng)態(tài)的獲取方式,視頻地址需要訪(fǎng)問(wèn)網(wǎng)站動(dòng)態(tài)獲取,而結(jié)果則還需經(jīng)過(guò)解密等操作。
$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/'; //獲取視頻信息的地址 基地址
$_VIDEO_ID = $_GET['vid']; //從GET里面把Video Id提取
if($_VIDEO_ID=='')
$_VIDEO_ID = 'XMjY0ODE1MDA0'; //我比較懶,測(cè)試的時(shí) 候就固定了一個(gè)
$ch = curl_init(); //開(kāi)啟cURL對(duì)象
curl_setopt($ch, CURLOPT_URL, $base_url . $_VIDEO_ID); //獲取這個(gè)視頻的信息的地址
curl_setopt($ch, CURLOPT_HEADER, 1); //要 HEADER
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://v.youku.com/v_show/id_' . $_VIDEO_ID); //給一個(gè)假的"REFERER"
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //把現(xiàn)在的瀏覽器User Agent傳遞給服務(wù)器
curl_setopt($ch, CURLOPT_NOBODY, 0);
$content = curl_exec($ch); //執(zhí)行?。。?BR>curl_close($ch); /*下面解析*/
preg_match(‘~”seed”\s*:\s*(\d+)\s*,~iUs',$content,$seed);
preg_match(‘~\{\s*”(flv|mp4)”\s*:\s*”(.*)”\s*\}~iUs',$content,$encoded);
preg_match(‘~”key1″\s*:\s*”(.*)”\s*,~iUs',$content,$key1);
preg_match(‘~”key2″\s*:\s*”(.*)”\s*,~iUs',$content,$key2);
//從返回的JSON串中提取必要信息 seed, encoded_url, key1, key2
class decoder{
var $randomSeed = 0;
var $cg_str=”";
function __construct($seed){
$this->randomSeed = $seed;
}
function ran(){
$this->randomSeed = (($this->randomSeed * 211)+30031)%65536;
return ($this->randomSeed / 65536);// 根據(jù)舊的 Seed 計(jì)算新的Seed,并且返回一個(gè)Seed的比例位置 [0,1)
}
function cg_hun(){ //估計(jì)這個(gè)叫 “CG混”,反正ASV解的函數(shù)就是這個(gè)名字
$this->cg_str="";
$sttext = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890'; //默認(rèn)字符串(最大)
$len = strlen($sttext); //獲取其長(zhǎng)度
for($i=0;$i<$len;$i++){
$cuch = (int)($this->ran()*strlen($sttext)); //獲取字符串 Seed比例 位置的字符下標(biāo)
$this->cg_str.=$sttext[$cuch]; //把字母讀出來(lái)
$sttext = str_replace($sttext[$cuch],”,$sttext); //刪掉這個(gè)讀出來(lái)的字母(到 0 就停)
}
}
function decode($string){
$output=”";
$this->cg_hun();
$expl = explode(‘*',$string); //把 1*23*34*45*56* 這個(gè)字符串打散
for($i=0;$i<count($expl)-1;$i++){
$output.=$this->cg_str[(int)$expl[$i]]; //獲取數(shù)字位代表的 cg_hun 打亂字符串字符,自此解密完成
}
return $output; //OK拉
}
function decode_key($key1,$key2){
$key = hexdec($key1); //兩個(gè)Key都是HEX
$key = $key ^ -1520786011; //這個(gè)原來(lái)也是個(gè)8 位HEX,后來(lái)被我用計(jì)算器算了數(shù)值,因?yàn)檫@樣方便PhP位運(yùn)算
return $key2 . dechex($key); //合成最終 Key
}
}//解密類(lèi),用這個(gè)很方便$new = new decoder((int)$seed[1]);
$fileid = $new->decode($encoded[2]);
$key = $new->decode_key($key1[1],$key2[1]);
//把數(shù)據(jù)喂進(jìn)去,計(jì)算//地址載構(gòu)成
$s7 = substr($fileid,10,strlen($fileid));
$s5 = substr($fileid,0,8);
$s6 = substr($fileid,6,2);
//拆開(kāi)$s4 = '00′;//注意這是一個(gè) HEX 值,即00表示視頻第一個(gè)分段,01第二個(gè) 0f第十五個(gè)…依此類(lèi)推$sid = time() . mt_rand(10,99) . '1000′ . mt_rand(30,80) . '00′;//獲取一個(gè)隨機(jī)的SID,給服務(wù)器(其實(shí)不會(huì)被檢查)
$d_ADDR = ‘http://f.youku.com/player/getFlvPath/sid/‘ . $sid . ‘_'. $s4 . ‘/st/' . $encoded[1] . ‘/fileid/' . $file_id;
echo $d_ADDR . ‘?K=' . $key;
//最后把地址輸出
請(qǐng)注意,由于Youku 更換算法/格式上面的方法已經(jīng)不能處理所有情況,我來(lái)描述下現(xiàn)在的流程:
1.訪(fǎng)問(wèn)http://v.youku.com/player/getPlayList/VideoIDS/[ID]
2.獲得文件,同時(shí)解析”streamfileids”:{“flv”:”加密地址”,”mp4″:”加密地址”,”等等等”:”加密地址”
3.按照上面的方法破解加密地址
4.獲取分段數(shù)目和K
{“mp4″:[{“no”:”0“,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce“},{“no”:”1“,”size”:”19045091″,”seconds”:”421″,”k”:”45398cdd4aa44968261c02ce“},
……
5.合成地址,不過(guò)每個(gè)分段的K都采用上面獲得的新K
其實(shí)開(kāi)始研究解析絕對(duì)地址也是為了研究Youku 的自帶播放器,順便去除廣告什么的。后來(lái)我們就把Youku 的播放器用 ASV6 (ActionScript Viewer 6)“反編譯”了一下,達(dá)到了驚人的效果。
Youku的視頻采取了加密+動(dòng)態(tài)的獲取方式,視頻地址需要訪(fǎng)問(wèn)網(wǎng)站動(dòng)態(tài)獲取,而結(jié)果則還需經(jīng)過(guò)解密等操作。
復(fù)制代碼 代碼如下:
$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/'; //獲取視頻信息的地址 基地址
$_VIDEO_ID = $_GET['vid']; //從GET里面把Video Id提取
if($_VIDEO_ID=='')
$_VIDEO_ID = 'XMjY0ODE1MDA0'; //我比較懶,測(cè)試的時(shí) 候就固定了一個(gè)
$ch = curl_init(); //開(kāi)啟cURL對(duì)象
curl_setopt($ch, CURLOPT_URL, $base_url . $_VIDEO_ID); //獲取這個(gè)視頻的信息的地址
curl_setopt($ch, CURLOPT_HEADER, 1); //要 HEADER
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://v.youku.com/v_show/id_' . $_VIDEO_ID); //給一個(gè)假的"REFERER"
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //把現(xiàn)在的瀏覽器User Agent傳遞給服務(wù)器
curl_setopt($ch, CURLOPT_NOBODY, 0);
$content = curl_exec($ch); //執(zhí)行?。。?BR>curl_close($ch); /*下面解析*/
preg_match(‘~”seed”\s*:\s*(\d+)\s*,~iUs',$content,$seed);
preg_match(‘~\{\s*”(flv|mp4)”\s*:\s*”(.*)”\s*\}~iUs',$content,$encoded);
preg_match(‘~”key1″\s*:\s*”(.*)”\s*,~iUs',$content,$key1);
preg_match(‘~”key2″\s*:\s*”(.*)”\s*,~iUs',$content,$key2);
//從返回的JSON串中提取必要信息 seed, encoded_url, key1, key2
class decoder{
var $randomSeed = 0;
var $cg_str=”";
function __construct($seed){
$this->randomSeed = $seed;
}
function ran(){
$this->randomSeed = (($this->randomSeed * 211)+30031)%65536;
return ($this->randomSeed / 65536);// 根據(jù)舊的 Seed 計(jì)算新的Seed,并且返回一個(gè)Seed的比例位置 [0,1)
}
function cg_hun(){ //估計(jì)這個(gè)叫 “CG混”,反正ASV解的函數(shù)就是這個(gè)名字
$this->cg_str="";
$sttext = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890'; //默認(rèn)字符串(最大)
$len = strlen($sttext); //獲取其長(zhǎng)度
for($i=0;$i<$len;$i++){
$cuch = (int)($this->ran()*strlen($sttext)); //獲取字符串 Seed比例 位置的字符下標(biāo)
$this->cg_str.=$sttext[$cuch]; //把字母讀出來(lái)
$sttext = str_replace($sttext[$cuch],”,$sttext); //刪掉這個(gè)讀出來(lái)的字母(到 0 就停)
}
}
function decode($string){
$output=”";
$this->cg_hun();
$expl = explode(‘*',$string); //把 1*23*34*45*56* 這個(gè)字符串打散
for($i=0;$i<count($expl)-1;$i++){
$output.=$this->cg_str[(int)$expl[$i]]; //獲取數(shù)字位代表的 cg_hun 打亂字符串字符,自此解密完成
}
return $output; //OK拉
}
function decode_key($key1,$key2){
$key = hexdec($key1); //兩個(gè)Key都是HEX
$key = $key ^ -1520786011; //這個(gè)原來(lái)也是個(gè)8 位HEX,后來(lái)被我用計(jì)算器算了數(shù)值,因?yàn)檫@樣方便PhP位運(yùn)算
return $key2 . dechex($key); //合成最終 Key
}
}//解密類(lèi),用這個(gè)很方便$new = new decoder((int)$seed[1]);
$fileid = $new->decode($encoded[2]);
$key = $new->decode_key($key1[1],$key2[1]);
//把數(shù)據(jù)喂進(jìn)去,計(jì)算//地址載構(gòu)成
$s7 = substr($fileid,10,strlen($fileid));
$s5 = substr($fileid,0,8);
$s6 = substr($fileid,6,2);
//拆開(kāi)$s4 = '00′;//注意這是一個(gè) HEX 值,即00表示視頻第一個(gè)分段,01第二個(gè) 0f第十五個(gè)…依此類(lèi)推$sid = time() . mt_rand(10,99) . '1000′ . mt_rand(30,80) . '00′;//獲取一個(gè)隨機(jī)的SID,給服務(wù)器(其實(shí)不會(huì)被檢查)
$d_ADDR = ‘http://f.youku.com/player/getFlvPath/sid/‘ . $sid . ‘_'. $s4 . ‘/st/' . $encoded[1] . ‘/fileid/' . $file_id;
echo $d_ADDR . ‘?K=' . $key;
//最后把地址輸出
請(qǐng)注意,由于Youku 更換算法/格式上面的方法已經(jīng)不能處理所有情況,我來(lái)描述下現(xiàn)在的流程:
1.訪(fǎng)問(wèn)http://v.youku.com/player/getPlayList/VideoIDS/[ID]
2.獲得文件,同時(shí)解析”streamfileids”:{“flv”:”加密地址”,”mp4″:”加密地址”,”等等等”:”加密地址”
3.按照上面的方法破解加密地址
4.獲取分段數(shù)目和K
{“mp4″:[{“no”:”0“,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce“},{“no”:”1“,”size”:”19045091″,”seconds”:”421″,”k”:”45398cdd4aa44968261c02ce“},
……
5.合成地址,不過(guò)每個(gè)分段的K都采用上面獲得的新K
您可能感興趣的文章:
- javascript實(shí)現(xiàn)youku的視頻代碼自適應(yīng)寬度
- JS實(shí)現(xiàn)仿google、百度搜索框輸入信息智能提示的實(shí)現(xiàn)方法
- JS+CSS實(shí)現(xiàn)仿新浪微博搜索框的方法
- js實(shí)現(xiàn)文本框只允許輸入數(shù)字并限制數(shù)字大小的方法
- JS簡(jiǎn)單實(shí)現(xiàn)城市二級(jí)聯(lián)動(dòng)選擇插件的方法
- js實(shí)現(xiàn)當(dāng)前輸入框高亮顯示的方法
- JS實(shí)現(xiàn)仿新浪微博發(fā)布內(nèi)容為空時(shí)提示功能代碼
- js實(shí)現(xiàn)YouKu的漂亮搜索框效果
相關(guān)文章
Ajax+PHP實(shí)現(xiàn)的模擬進(jìn)度條功能示例
這篇文章主要介紹了Ajax+PHP實(shí)現(xiàn)的模擬進(jìn)度條功能,結(jié)合實(shí)例形式分析了php結(jié)合ajax動(dòng)態(tài)讀取文件實(shí)現(xiàn)進(jìn)度條功能的相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
php開(kāi)發(fā)過(guò)程中關(guān)于繼承的使用方法分享
通常需要這樣一些類(lèi),這些類(lèi)與其它現(xiàn)有的類(lèi)擁有相同變量和函數(shù)。實(shí)際上,定義一個(gè)通用類(lèi)用于所有的項(xiàng)目,并且不斷豐富這個(gè)類(lèi)以適應(yīng)每個(gè)具體項(xiàng)目將是一個(gè)不 錯(cuò)的練習(xí)。2011-06-06
PHP實(shí)現(xiàn)的曲線(xiàn)統(tǒng)計(jì)圖表示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的曲線(xiàn)統(tǒng)計(jì)圖表,結(jié)合實(shí)例形式分析了php基于圖形繪制實(shí)現(xiàn)曲線(xiàn)統(tǒng)計(jì)圖展現(xiàn)功能的相關(guān)操作技巧,需要的朋友可以參考下2016-11-11
php實(shí)現(xiàn)異步將遠(yuǎn)程鏈接上內(nèi)容(圖片或內(nèi)容)寫(xiě)到本地的方法
這篇文章主要介紹了php實(shí)現(xiàn)異步將遠(yuǎn)程鏈接上內(nèi)容(圖片或內(nèi)容)寫(xiě)到本地的方法,涉及php基于curl進(jìn)行遠(yuǎn)程文件傳輸?shù)南嚓P(guān)操作技巧,需要的朋友可以參考下2016-11-11
php數(shù)組函數(shù)array_push()、array_pop()及array_shift()簡(jiǎn)單用法示例
這篇文章主要介紹了php數(shù)組函數(shù)array_push()、array_pop()及array_shift()簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了PHP數(shù)組函數(shù)array_push()、array_pop()及array_shift()操作數(shù)組的入棧、出棧、移除等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-01-01
生成靜態(tài)頁(yè)面的php函數(shù),php愛(ài)好者站推薦
生成靜態(tài)頁(yè)面的php函數(shù),php愛(ài)好者站推薦...2007-03-03

