Youku 视频绝对地址获取的方法详解

前端之家收集整理的这篇文章主要介绍了Youku 视频绝对地址获取的方法详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前一阵子为了研究 KnLiveCommentary 而进行了一系列的关于视频站点的研究。由于KnLiveCommentary需要能够获取充足的视频源进行测试,所以我们选取了 Youku(优酷)一个比较大的视频网站来进行测试。@H_403_0@其实开始研究解析绝对地址也是为了研究Youku 的自带播放器,顺便去除广告什么的。后来我们就把Youku 的播放器用 ASV6 (ActionScript Viewer 6)“反编译”了一下,达到了惊人的效果。Youku的视频采取了加密+动态的获取方式,视频地址需要访问网站动态获取,而结果则还需经过解密等操作。@H_403_0@<div class="codetitle"><a style="CURSOR: pointer" data="74462" class="copybut" id="copybut74462" onclick="doCopy('code74462')"> 代码如下:@H_5023@<div class="codebody" id="code74462">@H403_0@$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/'; //获取视频信息的地址 基地址@H_403_0@$_VIDEO_ID = $_GET['vid']; //从GET里面把Video Id提取@H_403_0@if($_VIDEOID=='')@H403_0@$_VIDEOID = 'XMjY0ODE1MDA0'; //我比较懒,测试的时 候就固定了一个@H403_0@$ch = curlinit(); //开启cURL对象@H403_0@curl_setopt($ch,CURLOPT_URL,$base_url . $_VIDEO_ID); //获取这个视频的信息的地址@H_403_0@curl_setopt($ch,CURLOPTHEADER,1); //要 HEADER@H403_0@curl_setopt($ch,CURLOPTRETURNTRANSFER,1);@H403_0@curl_setopt($ch,CURLOPT_REFERER,'http://v.youku.com/v_show/id_' . $_VIDEOID); //给一个假的"REFERER"@H403_0@curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USERAGENT']); //把现在的浏览器User Agent传递给服务器@H403_0@curl_setopt($ch,CURLOPTNOBODY,0);@H403_0@$content = curlexec($ch); //执行!!!@H403_0@curlclose($ch); /下面解析/@H403_0@pregmatch(‘~”seed”\s:\s(\d+)\s*,~iUs',$content,$seed);@H403_0@pregmatch(‘~{\s”(flv|mp4)”\s:\s”(.)”\s*}~iUs',$encoded);@H403_0@pregmatch(‘~”key1″\s:\s”(.)”\s,$key1);@H403_0@pregmatch(‘~”key2″\s:\s”(.)”\s,$key2);@H403_0@//从返回的JSON串中提取必要信息 seed,encodedurl,key1,key2@H4030@class decoder{@H4030@var $randomSeed = 0;@H403_0@var $cgstr=”";@H403_0@function _construct($seed){@H4030@$this->randomSeed = $seed;@H4030@}@H4030@function ran(){@H4030@$this->randomSeed = (($this->randomSeed * 211)+30031)%65536;@H4030@return ($this->randomSeed / 65536);// 根据旧的 Seed 计算新的Seed,并且返回一个Seed的比例位置 [0,1)@H4030@}@H403_0@function cg_hun(){ //估计这个叫 “CG混”,反正ASV解的函数就是这个名字@H_403_0@$this->cgstr="";@H4030@$sttext = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:.-1234567890'; //默认字符串(最大)@H_403_0@$len = strlen($sttext); //获取其长度@H_4030@for($i=0;$i<$len;$i++){@H403_0@$cuch = (int)($this->ran()strlen($sttext)); //获取字符串 Seed比例 位置的字符下标@H_403_0@$this->cgstr.=$sttext[$cuch]; //把字母读出来@H403_0@$sttext = strreplace($sttext[$cuch],”,$sttext); //删掉这个读出来的字母(到 0 就停)@H4030@}@H4030@}@H4030@function decode($string){@H4030@$output=”";@H403_0@$this->cghun();@H403_0@$expl = explode(‘',$string); //把 123344556* 这个字符串打散@H_4030@for($i=0;$i<count($expl)-1;$i++){@H403_0@$output.=$this->cg_str[(int)$expl[$i]]; //获取数字位代表的 cghun 打乱字符串字符,自此解密完成@H4030@}@H4030@return $output; //OK拉@H4030@}@H403_0@function decodekey($key1,$key2){@H4030@$key = hexdec($key1); //两个Key都是HEX@H403_0@$key = $key ^ -1520786011; //这个原来也是个8 位HEX,后来被我用计算器算了数值,因为这样方便PHP位运算@H_4030@return $key2 . dechex($key); //合成最终 Key@H4030@}@H4030@}//解密类,用这个很方便$new = new decoder((int)$seed[1]);@H4030@$fileid = $new->decode($encoded[2]);@H403_0@$key = $new->decodekey($key1[1],$key2[1]);@H4030@//把数据喂进去,计算//地址载构成@H4030@$s7 = substr($fileid,10,strlen($fileid));@H4030@$s5 = substr($fileid,8);@H4030@$s6 = substr($fileid,6,2);@H403_0@//拆开$s4 = '00′;//注意这是一个 HEX 值,即00表示视频第一个分段,01第二个 0f第十五个…依此类推$sid = time() . mt_rand(10,99) . '1000′ . mt_rand(30,80) . '00′;//获取一个随机的SID,给服务器(其实不会被检查) @H_403_0@$dADDR = ‘http://f.youku.com/player/getFlvPath/sid/‘ . $sid . ‘'. $s4 . ‘/st/' . $encoded[1] . ‘/fileid/' . $fileid;@H403_0@echo $dADDR . ‘?K=' . $key;@H403_0@//最后把地址输出@H_4030@@H5023@@H403_0@

<FONT style="COLOR: #ff0000">请注意,由于Youku 更换算法/格式上面的方法已经不能处理所有情况,我来描述下现在的流程:@H_4030@

1.访问http://v.youku.com/player/getPlayList/VideoIDS/[ID]@H403_0@2.获得文件,同时解析”streamfileids”:{“flv”:”加密地址”,”mp4″:”加密地址”,”等等等”:”加密地址”@H_403_0@3.按照上面的方法破解加密地址@H_403_0@4.获取分段数目和K@H_4030@{“mp4″:[{“no”:”0“,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce“},{“no”:”1“,”size”:”19045091″,”k”:”45398cdd4aa44968261c02ce“},@H4030@……@H4030@5.合成地址,不过每个分段的K都采用上面获得的新K@H403_0@

原文链接:https://www.f2er.com/php/25985.html

猜你在找的PHP相关文章