优酷下载地址获取JS版本 附土豆下载地址获取简单分析

  • 2012-12-18
  • 0
  • 5

为解决JS的跨域问题,先在自己博客所在虚拟主机上写个简单的php 获取

http://v.youku.com/player/getPlayList/VideoIDS/*

的下载地址列表,并接受传入callback参数,方便跨域调用

<?php
    $handle = fopen("http://v.youku.com/player/getPlayList/VideoIDS/".$_GET['ids'], "rb"); 
    $contents = stream_get_contents($handle);
    echo $_GET['callback'].'('.$contents.')';
    fclose($handle); 
?>

每个下载地址的特征如下:  都可在获取的JSON中得到

http://f.youku.com/player/getFlvPath/sid/130086939328910582812_00/st/flv/fileid/03000201004D8858360BD1047C4F5FF471CDD7-C742-8D74-3EED-90A9EF54EEC1?K=de1515a31372faac182698bc

蓝色部分的00代表分段视频的第一段,接下来以16进制依次类推

客户端js调用(用了JQuery的getJson)(下载地址解密算法来自互联网,具体出处我也找不到了….N多转载,我只是换成了JS版本)

var ids='XMzM0OTgyNzEy';//视频的IDS http://v.youku.com/v_show/id_XMzM0OTgyNzEy.html
$.getJSON('http://www.ccc5.cc/youku.php?ids='+ids+'&callback=?',function(d){
    var filedidObj=d.data[0].streamfileids,
        keyObj=d.data[0].segs,
        seed=d.data[0].seed;
    for(var i in filedidObj){
        var fildid=getFileId(filedidObj[i],seed),key='',format='',url='',size;
        for(var j in keyObj){
            if(i==j){
                if(j=='hd2')format='flv';//高清 格式也为flv  
                else format=j;
                var x=0;
                for(var n in keyObj[j]){//当第三个key以后为*号 说明为付费视频
                    key=keyObj[j][n].k;
                    size=(parseInt(keyObj[j][n].size)/1024/1024).toFixed(1);
                    url+='http://f.youku.com/player/getFlvPath/sid/'+ getSid()+'_00/st/'+format+'/fileid/'+fixedId(fildid,x)+'?K='+key+'     大小:'+size+'M<br>';
                    x++;
                    }
                document.write(j+': <br><br>'+url)  //输出
                break
            }
        }
    }
})
function fixedId(id,i){
    var hex=i.toString(16).toUpperCase();
    if(hex.length<2)hex='0'+hex;
    return id.replace(/^(\w{8})\w{2}/i,'$1'+hex)
} 
    
function getSid(){
    var i1 = parseInt(1000 + Math.floor(Math.random() * 999)),
        i2 = parseInt(1000 + Math.floor(Math.random() * 9000));
    return (new Date).getTime() + "" + i1 + "" + i2;
}
    
function getFileId(fileid,seed) {
    var mixed = getFileIDMixString(seed),
        ids = fileid.split("*"),
        realId='',idx;
    for (var i = 0; i < ids.length; i++) {
        idx = parseInt(ids[i]);
        realId+=mixed.charAt(idx);
    }
  return realId;
}
    
function getFileIDMixString(seed){
    var mixed ='',
        source ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890",
        index, 
        len = source.length;
    for (var i = 0; i < len; i++) {
        seed = (seed * 211 + 30031) % 65536;
        index = parseInt(seed / 65536 * source.length);
        mixed+=source.charAt(index);
        source=source.split(source.charAt(index)).join('');
    }
    return mixed;
}

====================2012-12-19========================

几天又去看了下土豆的视频

发现它的下载地址获取没优酷那么复杂,通过

http://v2.tudou.com/v.action?pw=&it=159399776

获得一个XML,其中就包含可视频各个清晰版本的下载地址

<v lg="0" wt="0" tm="199600" vi="1" ch="99" tt="【感谢你,我挚爱的人】如果明天就是末日,此时此刻的你最大的遗憾是什么?" cd="77t7WcEwhr4">
    <f st="3" s1="2b57b3ccfeaa74c204124cd2f23a33e41296541d" bc="0" brt="3">
        http://119.84.31.134/f4v/76/159399776.h264_2.f4v?key=1c0831ccdc9e6551e4b69a50d1d8910040db8509f3&playtype=1&tk=165100774880403682730491980&brt=3&bc=0&nt=0&du=199600&ispid=109&rc=200&inf=1&si=10000&npc=3644&pp=0&ul=0&mt=0&sid=10000&au=0&pc=0&cip=(这里是你的ip地址)&hf=0&id=tudou&itemid=129901704&fi=159399776&sz=11267213
    </f>
</v>

这里由于这个视频只有一种清晰度 所以只有一个下载地址

问题的关键在于传递给地址的参数 it   这个参数与视频一一对应,我通过chrome带的开发者工具查找网页中的“159399776“,找到了

itemData={
iid:159399776
,kw:"【感谢你,我挚爱的人】如果明天就是末日,此时此刻的你最大的遗憾是什么?"
,icode:"77t7WcEwhr4"
,cid:99 
,oid:118516358 
,hd:3 
,dl:true
,tict:3 
,vcode:""
,onic:"小奇_L"
,oname:"_118516358"
,mediaType: 'vi'
,NA: 0
,np:0
,pic:"http://i3.tdimg.com/159/399/776/p.jpg"
,time:"03:19"
 ,ol: 1
,olw: 1920
,olh: 1080
,olr: 3366224
,pt:1355639022000
,k: '末日|原创|遗憾|挚爱|感谢|刘原廷'
,cs: ''
}

其中的iid就是我们要找的…itemData是个全局对象,找了所有的加载JS文件中的itemData也没找到itemData是如何冒出来的,更别提iid的算法了,那么可能就是在服务器中生成的了 ,这个也没办法了

如果用js来直接获取iid还是挺简单

var iid=window.itemData.iid

然后ajax获取下载地址(由于子域V2.tudou.com与主域tudou.com也会有跨域限制,除了通过服务器把XML中转成JSON,貌似没别的办法)

……

就这样   哪天无聊搞个油猴脚本,方便自己下载视频,不过蛋疼的是优酷的长视频分段….不是一般的蛋疼

上一篇:    下一篇:

me@ccc5.cc - 衫小寨