前一阵子为了研究 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 |