熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

Youku 視頻絕對地址獲取的方法詳解

2013-11-15 12:27:30  來源: PHP編程 

  前一陣子為了研究 KnLiveCommentary 而進行了一系列的關於視頻站點的研究由於KnLiveCommentary需要能夠獲取充足的視頻源進行測試所以我們選取了 Youku(優酷)一個比較大的視頻網站來進行測試
其實開始研究解析絕對地址也是為了研究Youku 的自帶播放器順便去除廣告什麼的後來我們就把Youku 的播放器用 ASV (ActionScript Viewer )“反編譯”了一下達到了驚人的效果

Youku的視頻采取了加密+動態的獲取方式視頻地址需要訪問網站動態獲取而結果則還需經過解密等操作

復制代碼 代碼如下:
$base_url = ; //獲取視頻信息的地址 基地址
$_VIDEO_ID = $_GET[vid]; //從GET裡面把Video Id提取
if($_VIDEO_ID==)
$_VIDEO_ID = XMjYODEMDA; //我比較懶測試的時 候就固定了一個
$ch = curl_init(); //開啟cURL對象
curl_setopt($ch CURLOPT_URL $base_url $_VIDEO_ID); //獲取這個視頻的信息的地址
curl_setopt($ch CURLOPT_HEADER ); //要 HEADER
curl_setopt($ch CURLOPT_RETURNTRANSFER );
curl_setopt($ch CURLOPT_REFERER $_VIDEO_ID); //給一個假的"REFERER"
curl_setopt($ch CURLOPT_USERAGENT $_SERVER[HTTP_USER_AGENT]); //把現在的浏覽器User Agent傳遞給服務器
curl_setopt($ch CURLOPT_NOBODY );
$content = curl_exec($ch); //執行!!!
curl_close($ch); /*下面解析*/
preg_match(‘~”seed”s*:s*(d+)s*~iUs$content$seed);
preg_match(‘~{s*”(flv|mp)”s*:s*”(*)”s*}~iUs$content$encoded);
preg_match(‘~”key″s*:s*”(*)”s*~iUs$content$key);
preg_match(‘~”key″s*:s*”(*)”s*~iUs$content$key);
//從返回的JSON串中提取必要信息 seed encoded_url key key
class decoder{
var $randomSeed = ;
var $cg_str=”";
function __construct($seed){
$this>randomSeed = $seed;
}
function ran(){
$this>randomSeed = (($this>randomSeed * )+)%;
return ($this>randomSeed / );// 根據舊的 Seed 計算新的Seed並且返回一個Seed的比例位置 [)
}
function cg_hun(){ //估計這個叫 “CG混”反正ASV解的函數就是這個名字
$this>cg_str="";
$sttext = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/:_; //默認字符串(最大)
$len = strlen($sttext); //獲取其長度
for($i=;$i<$len;$i++){
$cuch = (int)($this>ran()*strlen($sttext)); //獲取字符串 Seed比例 位置的字符下標
$this>cg_str=$sttext[$cuch]; //把字母讀出來
$sttext = str_replace($sttext[$cuch]$sttext); //刪掉這個讀出來的字母(到 就停)
}
}
function decode($string){
$output=”";
$this>cg_hun();
$expl = explode(‘*$string); //把 ***** 這個字符串打散
for($i=;$i<count($expl);$i++){
$output=$this>cg_str[(int)$expl[$i]]; //獲取數字位代表的 cg_hun 打亂字符串字符自此解密完成
}
return $output; //OK拉
}
function decode_key($key$key){
$key = hexdec($key); //兩個Key都是HEX
$key = $key ^ ; //這個原來也是個 位HEX後來被我用計算器算了數值因為這樣方便PhP位運算
return $key dechex($key); //合成最終 Key
}
}//解密類用這個很方便$new = new decoder((int)$seed[]);
$fileid = $new>decode($encoded[]);
$key = $new>decode_key($key[]$key[]);
//把數據喂進去計算//地址載構成
$s = substr($fileidstrlen($fileid));
$s = substr($fileid);
$s = substr($fileid);
// 拆開$s = ′;//注意這是一個 HEX 值表示視頻第一個分段第二個 f第十五個…依此類推$sid = time() mt_rand() mt_rand() ′;//獲取一個隨機的SID給服務器(其實不會被檢查)
$d_ADDR = ‘$sid ‘_ $s ‘/st/ $encoded[] ‘/fileid/ $file_id;
echo $d_ADDR ‘?K= $key;
//最後把地址輸出

  
請注意由於Youku 更換算法/格式上面的方法已經不能處理所有情況我來描述下現在的流程
訪問[ID]
獲得文件同時解析”streamfileids”:{“flv”:”加密地址””mp″:”加密地址””等等等”:”加密地址”
按照上面的方法破解加密地址
獲取分段數目和K
{“mp″:[{“no”:””size”:””seconds”:””k”:”ffdbbbcce“}{“no”:””size”:””seconds”:””k”:”cddaacce“}
……
合成地址不過每個分段的K都采用上面獲得的新K


From:http://tw.wingwit.com/Article/program/PHP/201311/20987.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.