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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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


相关文章
|
2天前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
13 3
|
2天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
9 1
|
1天前
|
供应链 安全 分布式数据库
探索区块链技术:从原理到应用的全面解析
【10月更文挑战第22天】 本文旨在深入浅出地探讨区块链技术,一种近年来引起广泛关注的分布式账本技术。我们将从区块链的基本概念入手,逐步深入到其工作原理、关键技术特点以及在金融、供应链管理等多个领域的实际应用案例。通过这篇文章,读者不仅能够理解区块链技术的核心价值和潜力,还能获得关于如何评估和选择适合自己需求的区块链解决方案的实用建议。
7 0
|
3天前
|
存储 运维 监控
运维技术深度解析:构建高效、稳定的运维体系
【10月更文挑战第22天】运维技术深度解析:构建高效、稳定的运维体系
18 0
|
3天前
|
人工智能 运维 监控
运维技术深度解析:构建高效、稳定的IT基础设施
【10月更文挑战第22天】运维技术深度解析:构建高效、稳定的IT基础设施
12 0
|
3天前
|
机器学习/深度学习 边缘计算 运维
运维技术深度解析:构建高效、稳定的IT基础设施
【10月更文挑战第22天】运维技术深度解析:构建高效、稳定的IT基础设施
9 0
|
4天前
|
监控 物联网 网络架构
|
18天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
39 0
|
18天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
29 0
|
18天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
32 0

推荐镜像

更多