优酷视频真实地址(分段以及整段mp4地址)

看到一篇博客
http://blog.163.com/zjq_123/blog/static/408997932012101715653556/
里面讲了优酷真实地址解析,看了看把flash改成php代理了。

http://f.youku.com/player/getFlvPath/sid/00_00/st/mp4/fileid/
03000803004D9F4390A67E002BCF4E9F3D1FCE-FB5D-561B-1A73-F791EE1DC9B3
?K=3c1817963398751b2827379d
  这是视频文件链接的标准式样。红色字符是需更换的内容。
03000803004D9F4390A67E002BCF4E9F3D1FCE-FB5D-561B-1A73-F791EE1DC9B3
  这一串字符由解密计算得到,“00”处是多片段节目的序号,为16进制。一个页面的节目无论多少段,每段的链接地址中的这一部分是相同的。
http://v.youku.com/v_show/id_XMjU3MzIxOTk2.html
  这是节目所在页面的地址,其中白色字符为节目的“编号”或叫“标志”应该都可以。所有关于节目的信息都是从这里得到的。
http://v.youku.com/player/getPlayList/VideoIDS/XMjU3MzIxOTk2
  节目的信息文件的地址。贴到地址栏可以看到内容,下载后成为一个文本文件。
  该文件内容为哈希表(json)格式,网上可方便查找到相关资料,flash的帮助里面也有介绍。这里不详述,恐篇幅太大。
  脚本编程中,用地址读入此信息文件的内容,然后根据内容得到或计算(解密)得到需要的东西,最后拼接出完整的视频文件地址。
  信息文件中的内容总是变化的,据网上资料介绍,仅维持一小时(未验证)。
  根据前帖所述资料介绍的方法,未能成功还原出视频地址。经反复尝试,对比,剖析优酷网站播放器的脚本,终于正确解密了地址。优酷网实在是用心良苦。

用php改写了下解析程序,网上流传的几个函数什么的都是一样的,但是都只对第一段做了处理,后面的就没了,贴一个OOP的。

  1. <?php  
  2.  /* 
  3. 返回: 
  4. array 
  5.   'mp4' => string 'http://f.youku.com/player/getFlvPath/sid/138041779515547_00/st/mp4/fileid/03000804005241236C2C5300422C39EBED4FE4-2CCC-71BB-6AC3-59B4332828D7?K=48daa69002023a2a2828f4f1' (length=167) 
  6.   'flv' => string 'http://f.youku.com/player/getFlvPath/sid/138041779514451_00/st/flv/fileid/030002040052410FA52C5300422C39EBED4FE4-2CCC-71BB-6AC3-59B4332828D7?K=b9c1dfedde4eb5052828f4f1' (length=167) 
  7. */  
  8.  if(YoukuFlv::getYoukuFlv("http://v.youku.com/v_show/id_XNjA3MDM3NDMy.html"))  
  9.  {  
  10.     var_dump( YoukuFlv::result() );  
  11.  }  
  12.  else  
  13.  {  
  14.     echo YoukuFlv::error();  
  15.  }  
  16.    
  17.    
  18.    
  19.  /* 
  20. 获取优酷视频地址     
  21. */  
  22.  class YoukuFlv{  
  23.    
  24.     static private $error   =   "";  
  25.     static private $result  =   array();  
  26.    
  27.     static public function getYoukuFlv($url){  
  28.         //从url获取youkuid  
  29.         if(! $id    =   self::getYoukuId($url)){  
  30.             return false;  
  31.         }  
  32.         //获取youku视频详细信息  
  33.         $content    =   self::get_curl_contents( "http://v.youku.com/player/getPlayList/VideoIDS/".$id );  
  34.         $data   =   json_decode($content);  
  35.         if(!isset($data->data[0]->streamfileids)){  
  36.             self::$error    =   "Cannot find this video";  
  37.             return false;  
  38.         }  
  39.         foreach($data->data[0]->streamfileids AS $k=>$v){  
  40.             if($k == 'flv' || $k == 'mp4'){           
  41.                 //sid  
  42.                 $sid=   self::getSid();  
  43.                 //fileid  
  44.                 $fileid =   self::getfileid($v,$data->data[0]->seed);  
  45.                 $one=($data->data[0]->segs->$k);  
  46.                 self::$result[$k]   = "http://f.youku.com/player/getFlvPath/sid/{$sid}_00/st/{$k}/fileid/{$fileid}?K={$one[0]->k}";  
  47.             }  
  48.         }  
  49.         if(emptyempty(self::$result)){  
  50.             self::$error    =   "THIS VIOD IS NOT IN MP4 OR FLV FORMAT";  
  51.             return false;  
  52.         }else{  
  53.             return true;  
  54.         }  
  55.     }   
  56.     static public function error(){  
  57.         return self::$error;  
  58.     }  
  59.    
  60.     static public function result(){  
  61.         return self::$result;  
  62.     }  
  63.    
  64.     static private function getYoukuId($url){         
  65.         //url 不能为空  
  66.         if($url == "" || substr($url , 0 , 29) != "http://v.youku.com/v_show/id_"){  
  67.             self::$error    =   "URL IS ERROR";  
  68.             return false;  
  69.         }  
  70.         return substr($url , 29 , -5);        
  71.     }  
  72.    
  73.     static private function get_curl_contents($url$second = 5){  
  74.         if(!function_exists('curl_init')) die('php.ini未开启php_curl.dll');  
  75.         $c = curl_init();  
  76.         curl_setopt($c,CURLOPT_URL,$url);  
  77.         $UserAgent=$_SERVER['HTTP_USER_AGENT'];  
  78.         curl_setopt($c,CURLOPT_USERAGENT,$UserAgent);  
  79.         curl_setopt($c,CURLOPT_HEADER,0);  
  80.         curl_setopt($c,CURLOPT_TIMEOUT,$second);  
  81.         curl_setopt($c,CURLOPT_RETURNTRANSFER, true);  
  82.         $cnt = curl_exec($c);  
  83.         curl_close($c);  
  84.         return $cnt;  
  85.     }  
  86.     static private function getSid() {  
  87.         $sid = time().(rand(0,9000)+10000);  
  88.         return $sid;  
  89.     }  
  90.     static private function getfileid($fileId,$seed) {  
  91.         $mixed = self::getMixString($seed);  
  92.         $ids = explode("*",$fileId);  
  93.         unset($ids[count($ids)-1]);  
  94.         $realId = "";  
  95.         for ($i=0;$i < count($ids);++$i) {  
  96.             $idx = $ids[$i];  
  97.             $realId .= substr($mixed,$idx,1);  
  98.         }  
  99.         return $realId;  
  100.     }  
  101.     static private function getMixString($seed) {  
  102.         $mixed = "";  
  103.         $source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890";  
  104.         $len = strlen($source);  
  105.         for($i=0;$i$len;++$i){  
  106.             $seed = ($seed * 211 + 30031) % 65536;  
  107.             $index = ($seed / 65536 * strlen($source));  
  108.             $c = substr($source,$index,1);  
  109.             $mixed .= $c;  
  110.             $source = str_replace($c"",$source);  
  111.         }  
  112.         return $mixed;  
  113.     }  
  114.  }  
  115.    
  116.    
  117.    
  118.  ?>  

加上对分段的处理。。。效果截图:只有一段多种格式,

只有一段

只有一段多种格式


有多段一种格式,
多段只有一种格式

多段只有一种格式


多段多格式,
多格式多段

多格式多段

以上的接口json获取的都是分段的,每段只有7分钟左右。

某论坛上发现了个手机接口,mp4整段的,可供播放器直接调用,如下:

  1. <?php  
  2. //优酷 整段视频代理  
  3. if(isset ($_GET['id'])) {  
  4.        $url= 'http://m.youku.com/wap/pvs?id='.$_GET['id'].'&format=3gphd';  
  5.        header("location:$url");  
  6. }  
  7. ?>  

修改版源码下载:[url href="http://t.cn/8FDHWl7"]youku.php[/url]
支持13位id,也可是优酷播放页网址。(?id=……)

未经允许不得转载:ganlei的个人博客 » 优酷视频真实地址(分段以及整段mp4地址)

赞 (2)
分享到:更多 ()