看到一篇博客
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的。
- <?php
- /*
- 返回:
- array
- ’mp4’ => string ’http://f.youku.com/player/getFlvPath/sid/138041779515547_00/st/mp4/fileid/03000804005241236C2C5300422C39EBED4FE4-2CCC-71BB-6AC3-59B4332828D7?K=48daa69002023a2a2828f4f1' (length=167)
- ’flv’ => string ’http://f.youku.com/player/getFlvPath/sid/138041779514451_00/st/flv/fileid/030002040052410FA52C5300422C39EBED4FE4-2CCC-71BB-6AC3-59B4332828D7?K=b9c1dfedde4eb5052828f4f1' (length=167)
- */
- if(YoukuFlv::getYoukuFlv(“http://v.youku.com/v_show/id_XNjA3MDM3NDMy.html“))
- {
- var_dump( YoukuFlv::result() );
- }
- else
- {
- echo YoukuFlv::error();
- }
- /*
- 获取优酷视频地址
- */
- class YoukuFlv{
- static private $error = “”;
- static private $result = array();
- static public function getYoukuFlv($url){
- //从url获取youkuid
- if(! $id = self::getYoukuId($url)){
- return false;
- }
- //获取youku视频详细信息
- $content = self::get_curl_contents( “http://v.youku.com/player/getPlayList/VideoIDS/“.$id );
- $data = json_decode($content);
- if(!isset($data->data[0]->streamfileids)){
- self::$error = “Cannot find this video”;
- return false;
- }
- foreach($data->data[0]->streamfileids AS $k=>$v){
- if($k == ’flv’ || $k == ’mp4’){
- //sid
- $sid= self::getSid();
- //fileid
- $fileid = self::getfileid($v,$data->data[0]->seed);
- $one=($data->data[0]->segs->$k);
- self::$result[$k] = “http://f.youku.com/player/getFlvPath/sid/{$sid}_00/st/{$k}/fileid/{$fileid}?K={$one[0]->k}“;
- }
- }
- if(emptyempty(self::$result)){
- self::$error = “THIS VIOD IS NOT IN MP4 OR FLV FORMAT”;
- return false;
- }else{
- return true;
- }
- }
- static public function error(){
- return self::$error;
- }
- static public function result(){
- return self::$result;
- }
- static private function getYoukuId($url){
- //url 不能为空
- if($url == “” || substr($url , 0 , 29) != “http://v.youku.com/v_show/id_“){
- self::$error = “URL IS ERROR”;
- return false;
- }
- return substr($url , 29 , -5);
- }
- static private function get_curl_contents($url, $second = 5){
- if(!function_exists(‘curl_init’)) die(‘php.ini未开启php_curl.dll’);
- $c = curl_init();
- curl_setopt($c,CURLOPT_URL,$url);
- $UserAgent=$_SERVER[‘HTTP_USER_AGENT’];
- curl_setopt($c,CURLOPT_USERAGENT,$UserAgent);
- curl_setopt($c,CURLOPT_HEADER,0);
- curl_setopt($c,CURLOPT_TIMEOUT,$second);
- curl_setopt($c,CURLOPT_RETURNTRANSFER, true);
- $cnt = curl_exec($c);
- curl_close($c);
- return $cnt;
- }
- static private function getSid() {
- $sid = time().(rand(0,9000)+10000);
- return $sid;
- }
- static private function getfileid($fileId,$seed) {
- $mixed = self::getMixString($seed);
- $ids = explode(“*”,$fileId);
- unset($ids[count($ids)-1]);
- $realId = “”;
- for ($i=0;$i < count($ids);++$i) {
- $idx = $ids[$i];
- $realId .= substr($mixed,$idx,1);
- }
- return $realId;
- }
- static private function getMixString($seed) {
- $mixed = “”;
- $source = “abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890”;
- $len = strlen($source);
- for($i=0;$i< $len;++$i){
- $seed = ($seed * 211 + 30031) % 65536;
- $index = ($seed / 65536 * strlen($source));
- $c = substr($source,$index,1);
- $mixed .= $c;
- $source = str_replace($c, “”,$source);
- }
- return $mixed;
- }
- }
- ?>
加上对分段的处理。。。效果截图:只有一段多种格式,
[caption id=”attachment_399” align=”aligncenter” width=”300”] 只有一段多种格式[/caption]
有多段一种格式,
[caption id=”attachment_400” align=”aligncenter” width=”300”] 多段只有一种格式[/caption]
多段多格式,
[caption id=”attachment_401” align=”aligncenter” width=”300”] 多格式多段[/caption]
以上的接口json获取的都是分段的,每段只有7分钟左右。
某论坛上发现了个手机接口,mp4整段的,可供播放器直接调用,如下:
- <?php
- //优酷 整段视频代理
- if(isset ($_GET[‘id’])) {
- $url= ’http://m.youku.com/wap/pvs?id=’.$_GET[‘id’].’&format=3gphd’;
- header(“location:$url”);
- }
- ?>
修改版源码下载:[url href=”http://t.cn/8FDHWl7"]youku.php[/url]
支持13位id,也可是优酷播放页网址。(?id=……)