技术经验解读:优酷真实视频地址解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 技术经验解读:优酷真实视频地址解析

优酷真实视频地址解析——2016年9月20日


没时间跟优酷肛啊,投奔youtube-dl了。项目地址为


如果另有用途,比如只想拿到真实地址而不下载,可参考以下C#代码:


public string【】 getRealUrlUsingYoutubeDL(string YoukuUrl)


{


string fileName = @"youtube-dl.exe";


Process p = new Process();


p.StartInfo.UseShellExecute = false;


p.StartInfo.RedirectStandardOutput = true;


p.StartInfo.FileName = fileName;


p.StartInfo.CreateNoWindow = true;


p.StartInfo.Arguments = string.Format(" --get-url --skip-download {0}", YoukuUrl);


p.Start();


p.WaitForExit(5000);//亲测,youtube-dl会因为不知道什么原因阻塞。。


string output = p.StandardOutput.ReadToEnd();


return output.Split('\n');//最后一个是"",自己处理吧


}


顺便一提,腾讯视频、乐视、爱奇艺、搜狐、新浪什么的都可以这么处理。


=================================================我是分割线,以下是2015年的解析方法=============================================


序:优酷之前更新了次算法(很久之前了,呵呵。。。),故此很多博客的解析算法已经无法使用。很多大牛也已经更新了新的解析方法。我也在此写篇解析过程的文章。(本文使用语言为C#)


由于优酷视频地址时间限制,在你访问本篇文章时,下面所属链接有可能已经失效,望见谅。


例:


1:获取视频vid


在视频url中标红部分。一个正则表达式即可获取。


1 string getVid(string url)


2 {


3 string strRegex = "(?<=id_)(\w+)";


4 Regex reg = new Regex(strRegex);


5 Match match = reg.Match(url);


6 return match.ToString();


7 }


2:获取视频元信息


  http://v.youku.com/player/getPlayList/VideoIDS/XNzk2NTI0MzMy/Pf/4/ctype/12/ev/1


  将前述vid嵌入到上面url中访问即可得到视频信息文件。由于视频信息过长不在此贴出全部内容。下面是部分重要内容的展示。(获取文件为json文件,可直接解析)


1 { "data": 【 {


2 "ip": 996949050,


3 "ep": "NQXRTAodIbrd1vnC8+JxB4emuRs41w7DWho=",


4 "segs": {


5 "hd2": 【


6 {


7 "no": "0",


8 "size": "34602810",


9 "seconds": 205,


10 "k": "248fe14b4c1b37302411f67a",


11 "k2": "1c8e113cecad924c5"


12 },


13 {


14 "no": "1",


15 },】 }, } 】,}


上面显示的内容后面都会使用到。其中segs包含hd3,hd2,flv,mp4,3gp等各种格式,并且每种格式下均分为若干段。本次选用清晰度较高的hd2(视频格式为flv)


3:拼接m3u8地址


http://pl.youku.com/playlist/m3u8?ctype=12&ep={0}&ev=1&keyframe=1&oip={1}&sid={2}&token={3}&type={4}&vid={5}


以上共有6个参数,其中vid和oip已经得到,分别之前的vid和json文件中的ip字段,即(XNzk2NTI0MzMy和1991941296),但是ep,sid,token需要重新计算(json文件中的ep值不能直接使用)。type即为之前选择的segs。


3.1计算ep,sid,token


计算方法单纯的为数学计算,下面给出计算的函数。三个参数可一次性计算得到。其中涉及到Base64编码解码知识,点击查看。


1      private static string myEncoder(string a, byte【】 c, bool isToBase64)


2 {


3 string result = "";


4 List bytesR = new Listspan style="color: rgba(0, 0, 255, 1)">byte</span;


5 int f = 0, h = 0, q = 0;


6 int【】 b = new int【256】;


7 for (int i = 0; i < 256; i++)


8 b【i】 = i;


9 while (h < 256)


10 {


11 f = (f + b【h】 + a【h % a.Length】) % 256;


12 int temp = b【h】;


13 b【h】 = b【f】;


14 b【f】 = temp;


15 h++;


16 }


17 f = 0; h = 0; q = 0;


18 while (q [span style="color: rgba(0, 0, 0, 1)"> c.Length)


19 {


20 h = (h + 1) % 256;


21 f = (f + b【h】) % 256;


22 int temp = b【h】;


23 b【h】 = b【f】;


24 b【f】 = temp;


25 byte【】 bytes = new byte【】 { (byte)(c【q】 ^ b【(b【h】 + b【f】) % 256】) };


26 bytesR.Add(bytes【0】);


27 result += System.Text.ASCIIEncoding.ASCII.GetString(bytes);


28 q++;


29 }


30 if (isToBase64)


31 {


32 Byte【】 byteR = bytesR.ToArray();


33 result = Convert.ToBase64String(byteR);


34 }


35 return result;


36 }


37 public static void getEp(string vid, string ep, ref string pNew, ref string token, ref string sid)


38 {


39 string template1 = "becaf9be";


40 string template2 = "bf7e5f01";


41 byte【】 bytes = //代码效果参考:http://hnjlyzjd.com/hw/wz_24317.html

Convert.FromBase64String(ep);

42 ep = System.Text.ASCIIEncoding.ASCII.GetString(bytes);


43 string temp = myEncoder(template1, bytes, false);


44 string【】 part = temp.Split('');


45 sid = part【0】;


46 token = part【1】;


47 string whole = string.Format("{0}{1}_{2}", sid, vid, token);


48 byte【】 newbytes = System.Text.ASCIIEncoding.ASCII.GetBytes(whole);


49 epNew = myEncoder(template2, newbytes, true);


50 }


计算得到ep,token,sid分别为cCaVGE6OUc8H4ircjj8bMiuwdH8KXJZ0vESH/7YbAMZuNaHQmjbTwg==, 3825, 241273717793612e7b085。注意,此时ep并不能直接拼接到url中,需要对此做一下url编码ToUrlEncode(ep)。最终ep为cCaVGE6OUc8H4ircjj8bMiuwdH8KXJZ0vESH%2f7YbAMZuNaHQmjbTwg%3d%3d


3.2视频格式及清晰度


视频格式和选择的segs有密切关系。如本文选择的hd2,格式即为flv,下面是segs,视频格式和清晰度的对照。之前对此部分理解有些偏差,多谢削着苹果走路提醒。


“segs”,”视频格式”,”清晰度”


"hd3", "flv", "1080P"


"hd2", "flv", "超清"


"mp4", "mp4", "高清"


"flvhd", "flv", "高清"


"flv", "flv", "标清"


"3gphd", "3gp", "高清"


3.3拼接地址


  最后的m3u8地址为


4:获取视频地址


将上述m3u8文件下载后,其中内容即为真实地址,不过还需要稍微处理一下。部分内容如下:


1 #EXTM3U


2 #EXT-X-TARGETDURATION:12


3 #EXT-X-VERSION:3


4 #EXTINF:6.006,


5


6 #EXTINF:5.464,


7


8 #EXTINF:5.505,


9


10 #EXTINF:9.26,


11


12 #EXTINF:11.136,


13


14 #EXTINF:8.258,


15


16 #EXTINF:9.843,


17


18 #EXTINF:10.26,


19


相关文章
|
3天前
|
存储 网络协议 安全
必知的技术知识:DNS资源纪录(ResourceRecord)介绍
必知的技术知识:DNS资源纪录(ResourceRecord)介绍
|
1天前
|
存储 缓存 运维
云计算中的服务器选型与配置:技术深度解析
【6月更文挑战第29天】云计算服务器选型与配置深度解析:关注业务需求、技术要求及成本效益。重点包括CPU、内存、存储和网络配置的优化,结合负载均衡、缓存、虚拟化和自动化运维策略,以提升性能和效率,确保云服务的稳定与高效。
|
2天前
|
Java 程序员
程序技术好文:解析器组合子
程序技术好文:解析器组合子
|
3天前
|
缓存 监控 Java
深入解析Nacos配置中心的动态配置更新技术
深入解析Nacos配置中心的动态配置更新技术
|
3天前
|
机器学习/深度学习 存储 算法
技术好文:ttf文件结构解析
技术好文:ttf文件结构解析
|
3天前
|
存储 缓存 监控
深入解析JVM内存分配优化技术:TLAB
深入解析JVM内存分配优化技术:TLAB
|
3天前
|
存储 算法 NoSQL
技术经验分享:HashCode解析
技术经验分享:HashCode解析
|
3天前
|
Unix Shell Perl
技术心得:实例解析shell子进程(subshell)
技术心得:实例解析shell子进程(subshell)
|
9天前
|
机器学习/深度学习 缓存 算法
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
|
11天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
23 3

推荐镜像

更多