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

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

优酷真实视频地址解析——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


相关文章
|
5天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
29 3
|
5天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
17 2
|
8天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
29 3
|
10天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
11天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
5天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
5天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
12 0
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0

推荐镜像

更多