当前位置: 移动技术网 > IT编程>开发语言>Java > java实现优酷视频地址解析示例代码分享

java实现优酷视频地址解析示例代码分享

2019年07月22日  | 移动技术网IT编程  | 我要评论

举个例子比较好理解,比如我现在要下http://v.youku.com/v_show/id_xndm2mjc0mzaw.html这个视频。这里我们要获得的是视频的id,就是xndm2mjc0mzaw这部分,这是一个视频唯一的,所以在解析的时候肯定会用到。

为了能看清楚youku视频的播放过程,可以使用火狐的插件firebug对网页进行跟踪,如下图。

可以看到有很多get,我们要找的应该是以这个id作为参数的get,在下面我们可以找到这个链接
http://v.youku.com/player/getplaylist/videoids/xndm2mjc0mzaw/timezone/+08/version/5/source/video?ran=3545&password=&n=3
这是youku获取播放列表的get,打开它的响应,这是一个json,我们需要的内容是seed、streamfileids和segs。segs里面放的是视频的分段key,streamfileids是一串乱码,要用seed对他解码。下面我截取了下载器的一部分来说明解码的过程,解析json用的是json-lib-2.4-jdk15。

复制代码 代码如下:

list<video> videos = new arraylist<video>();
jsonobject data;
//json就是刚获得的响应,类型为string。
data = jsonobject.fromobject(json).getjsonarray("data").getjsonobject(0);
double seed = double.valueof(data.getstring("seed"));
string title = data.getstring("title");
string fileid = data.getjsonobject("streamfileids").getstring("flv");//如果要下的是mp4格式的话
string realfileid = getfileid(fileid, seed);            //把flv改成mp4(前提是这个节点存在)
string fileid1 = realfileid.substring(0, 8);//解码出来的id分成两部分,中间要插入视频分段
string fileid2 = realfileid.substring(10);

jsonarray segs = data.getjsonobject("segs").getjsonarray("flv");//segs部分解析
for (iterator iterator = segs.iterator(); iterator.hasnext();) {
    jsonobject object = (jsonobject) iterator.next();
    int order = object.getint("no");
    string size = object.getstring("size");
    int seconds = object.getint("seconds");
    string key = object.getstring("k");
    string no = string.format("%1$02x", order);
    string youurl = "http://f.youku.com/player/getflvpath/sid/" + "00_"
        + no + "/st/flv/fileid/" + fileid1 + no + fileid2 + "?k="
        + key;         
    videos.add(new video(order, seconds, youurl, size, key, title));
}

youurl就是我们要的视频地址,比如上面那个视频的第一段是:

http://f.youku.com/player/getflvpath/sid/134434081131213125530_00/st/flv/fileid/030001090050201d77edbc04650ac2dd6027d5-ed5f-27f6-8e73-def478121887&k=b499f3d5df944cfc2827e2ec

蓝色的是随机生成的,可以用00代替。
flv表示所要下载的视频格式,也可以选mp4,如果有的话。
黄色的两个00是分段码,十六进制,比如第一段是00,第二段01,第十五段0f。
后面的是fileid,需要通过seed和streamfileids来破解,每段视频都一样。
最后面的k是在segs中获得的,不需要破解,每段视频都不一样。

其中的两个解码函数为:

复制代码 代码如下:

private string getfileid(string fileid, double seed) {
    string mixed = getfileidmixstring(seed);
    string[] ids = fileid.split("\\*");
    stringbuilder realid = new stringbuilder();
    int idx;
    for (int i = 0; i < ids.length; i++) {
        idx = integer.parseint(ids[i]);
        realid.append(mixed.charat(idx));
    }
    return realid.tostring();
}

private string getfileidmixstring(double seed) {
    stringbuilder mixed = new stringbuilder();
    stringbuilder source = new stringbuilder(
        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/\\:._-1234567890");
    int index, len = source.length();
    for (int i = 0; i < len; ++i) {
        seed = (seed * 211 + 30031) % 65536;
        index = (int) math.floor(seed / 65536 * source.length());
        mixed.append(source.charat(index));
        source.deletecharat(index);
    }
    return mixed.tostring();
}

代码最后将得到一个video类型的list,video中的order是视频的编号,seconds是时间长度,size是字节长度,youurl就是真正的视频地址,还有视频的标题title。还有一些其他的内容都可以从json中获得。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网