本文主要介绍优酷用C#实现的真实视频地址解析功能(2014年新算法)。这篇文章在当前环境下是有效的,因为优酷之前更新过算法,有需要的朋友可以参考一下。
前言:优酷之前更新了算法(很久以前了,呵呵。),所以很多博客的解析算法已经不能用了。很多大牛也更新了新的分析方法。我也在这里写一篇关于分析过程的文章。(本文使用的语言是C#)
由于优酷视频地址的时间限制,当您访问本文时,以下链接可能已经失效。请原谅我。
例如:http://v.youku.com/v_show/id_XNzk2NTI0MzMy.html
1:获取视频vid
视频url中的红色部分。可以获得正则表达式。
复制代码如下:
字符串getVid(字符串url)
{
string strRegex='(?=id _)(\ \ w)';
Regex reg=new Regex(strRegex);
Match match=reg。匹配(网址);
返回匹配。ToString();
}
2:获取视频元信息
http://v . youku . com/player/get playlist/video ids/xnzk 2 nti 0 mzmy/Pf/4/ctype/12/ev/1
视频信息文件可以通过在上面的url中嵌入vid来获得。因为视频信息太长,所以不要把所有内容都贴在这里。以下是一些重要内容的介绍。(获取的文件是json文件,可以直接解析)
复制代码如下:
{ 'data': [ {
' ip': 1991941296,
EP ':' mwxrtasbjlnb 0 pbj 8 ujxadsivuu 11 wnk xxc=',
segs ':
hd2': [
{
否':' 0 ',
尺寸':' 34602810 ',
'秒':205,
k': '248fe14b4c1b37302411f67a ',
k2 ':' 1c8e 113 ecad 924 C5 '
},
{
否':' 1 ',
},] }, } ],}
上面显示的内容以后会用到。Segs包括hd3、hd2、flv、mp4、3gp等格式,每种格式又分为若干段。这次选的是高清的Hd2(视频格式是flv)
3:拼接m3u8地址
http://pl.youku.com/playlist/m3u8?ctype=12ep={ 0 } ev=1 key frame=1 OIP={ 1 } sid={ 2 } token={ 3 } type={ 4 } vid={ 5 }
上面有六个参数,其中vid和oip已经得到,之前vid和json文件中的ip字段,即(XNzk2NTI0MzMy和1991941296),但是ep、SID和token需要重新计算(不能直接使用json文件中的EP值)。类型比较简单,后面会讲到。
3.1计算ep,sid,token
计算方法是纯数学计算,下面给出计算函数。一次可以计算三个参数。涉及Base64编解码知识,点击查看。
复制代码如下:
私有静态字符串myEncoder(字符串a,字节[] c,布尔值isToBase64)
{
字符串结果=“”;
list byte bytes r=new list byte();
int f=0,h=0,q=0;
int[]b=new int[256];
for(int I=0;i 256我)
b[I]=I;
而(h . 256)
{
f=(f b[h]a[h % a . Length])% 256;
int temp=b[h];
b[h]=b[f];
b[f]=温度;
h;
}
f=0;h=0;q=0;
while(长度)
{
h=(h1)% 256;
f=(f b[h])% 256;
int temp=b[h];
b[h]=b[f];
b[f]=温度;
byte[]bytes=new byte[]{(byte)(c[q]^ b[(b[h]b[f])% 256])};
字节数。add(bytes[0]);
结果=系统。text . ascii encoding . ascii . getstring(字节);
q;
}
if(istobabase 64)
{
Byte[] byteR=bytesR。to array();
结果=转换。tobase 64 string(byteR);
}
返回结果;
}
公共静态void getEp(字符串vid,字符串Ep,引用字符串pNew,引用字符串token,引用字符串sid)
{
string template1=' becaf9be
string template 2=' BF 7 e5f 01 ';
byte[] bytes=转换。from base 64 string(EP);
ep=系统。text . ascii encoding . ascii . getstring(字节);
string temp=myEncoder(template1,bytes,false);
string[] part=temp拆分(' _ ');
sid=part[0];
token=part[1];
字符串整体=字符串。格式(' {0}_{1}_{2} ',sid,vid,token);
byte[] newbytes=System。text . ascii encoding . ascii . getbytes(整体);
epNew=myEncoder(template2,newbytes,true);
}
Ep,token,sid分别计算为diavge IVM WB 5 cxxjz 8 bnhi 0 ccehxjz 0 vesh/7 ybamzunahqnt/wzw==,4178,441265221168712cdf4f8。注意,ep此时不能直接拼接成url,需要对url ToUrlEncode(ep)进行编码。最终的ep是diavge+IVM WB 5 cxxjz 8 bnhi 0 ccehxjz 0 vesh/7 ybamzunahqnt/wzw==
3.2计算type
类型值与选定的segs密切相关。如果hd2,本文选择的类型是flv,下面是segs,类型和定义的比较。
复制代码如下:
“segs”,“类型”,“清晰度”
hd3 ',' flv ',' 1080P '
Hd2 ',' flv ','超清'
Mp4 ',' mp4 ','高清'
Flvhd ',' flv ','高清'
Flv ',' flv ','标清'
3gphd ',' 3gp ',' hd '
3.3拼接地址
最后一个m3u8地址是
http://pl.youku.com/playlist/m3u8?ctype=12ep=diaVGE+IVM WB 5 cxx JZ 8 bnhi 0 ccehxjz 0 vesh/7 ybamzunahqnt/Wzw==ev=1 key frame=1 OIP=1991941296 sid=441265221168712 CDF 4 f 8 token=4178 type=flv vid=xnzk 2 nti 0 mzmy
4:获取视频地址
下载上面的m3u8文件后,里面的内容是真实地址,但还是需要一点处理。部分内容如下:
复制代码如下:
#EXTM3U
#扩展X目标持续时间:12
# EXT-X-版本:3
#EXTINF:6,
http://59 . 108 . 137 . 14/696 CD 107 Fe 4d 821 ffbf 173 EB 3/03000208005430 b 01849631468 defec 61 c 5678-3a 78-37BA-1971-21 A0 D4 EEA 0 e 7 . flv?ts _ start=0ts _ end=5.9 ts _ seg _ no=0ts _ key frame=1
#EXTINF:5.533,
http://59 . 108 . 137 . 14/696 CD 107 Fe 4d 821 ffbf 173 EB 3/03000208005430 b 01849631468 defec 61 c 5678-3a 78-37BA-1971-21 A0 D4 EEA 0 e 7 . flv?ts _ start=5.9 ts _ end=11.433 ts _ seg _ no=1ts _ key frame=1
#EXTINF:5.467,
http://59 . 108 . 137 . 14/696 CD 107 Fe 4d 821 ffbf 173 EB 3/03000208005430 b 01849631468 defec 61 c 5678-3a 78-37BA-1971-21 A0 D4 EEA 0 e 7 . flv?ts _ start=11.433 ts _ end=16.9 ts _ seg _ no=2ts _ key frame=1
#EXTINF:9.267,
每个url只包含6s左右的视频,但实际长度可以通过去掉url中的参数得到。但是,在删除每个项目后,需要合并相同的url。例如,url片段可以从上面的列表中获得。
http://59 . 108 . 137 . 14/696 CD 107 Fe 4d 821 ffbf 173 EB 3/03000208005430 b 01849631468 defec 61 c 5678-3a 78-37BA-1971-21 A0 D4 EEA 0 e 7 . flv
下载m3u8中的所有网址片段就大功告成了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。