前一陣子為了研究 KnLiveCommentary 而進行了一系列的關於視頻站點的研究由於KnLiveCommentary需要能夠獲取充足的視頻源進行測試所以我們選取了 Youku(優酷)一個比較大的視頻網站來進行測試
其實開始研究解析絕對地址也是為了研究Youku 的自帶播放器順便去除廣告什麼的後來我們就把Youku 的播放器用 ASV (ActionScript Viewer )“反編譯”了一下達到了驚人的效果
Youku的視頻采取了加密+動態的獲取方式視頻地址需要訪問網站動態獲取而結果則還需經過解密等操作
復制代碼 代碼如下:
$base_url =
; //獲取視頻信息的地址 基地址
$_VIDEO_ID = $_GET[
vid
]; //從GET裡面把Video Id提取
if($_VIDEO_ID==
)
$_VIDEO_ID =
XMjY
ODE
MDA
; //我比較懶
測試的時 候就固定了一個
$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($fileid
strlen($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