关键词:
优酷真实视频地址解析——2016年9月20日
没时间跟优酷肛啊,投奔youtube-dl了。项目地址为https://github.com/rg3/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#)
由于优酷视频地址时间限制,在你访问本篇文章时,下面所属链接有可能已经失效,望见谅。
例:http://v.youku.com/v_show/id_XNzk2NTI0MzMy.html
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地址
以上共有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<Byte> bytesR = new List<byte>(); 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 < 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 = 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 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=0&ts_end=5.906&ts_seg_no=0&ts_keyframe=1 6 #EXTINF:5.464, 7 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=5.906&ts_end=11.37&ts_seg_no=1&ts_keyframe=1 8 #EXTINF:5.505, 9 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=11.37&ts_end=16.875&ts_seg_no=2&ts_keyframe=1 10 #EXTINF:9.26, 11 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=16.875&ts_end=26.135&ts_seg_no=3&ts_keyframe=1 12 #EXTINF:11.136, 13 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=26.135&ts_end=37.271&ts_seg_no=4&ts_keyframe=1 14 #EXTINF:8.258, 15 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=37.271&ts_end=45.529&ts_seg_no=5&ts_keyframe=1 16 #EXTINF:9.843, 17 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=45.529&ts_end=55.372&ts_seg_no=6&ts_keyframe=1 18 #EXTINF:10.26, 19 http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=55.372&ts_end=65.632&ts_seg_no=7&ts_keyframe=1
其中每条url只包含6s左右视频,但是可将url中参数部分去掉即可得到实际的长度。但是每条去掉后需合并一下相同的url,如上述列表可得到url片段
将m3u8中所有的url片段全部下载即可大功告成。
本文地址:http://www.cnblogs.com/zhaojunjie/p/4009192.html,转载请注明源地址。
2014年7月22日6点30分
感觉到你的担忧、你的胆怯;感受到你的挣扎、你的彷徨;体会到你的无助、你的期望。是啊。怕被伤了又伤,但又满怀希望。怕伤害了自己,也怕伤害了对方。 不知道到底经历过什么,让你... 查看详情
swt是谁名字的缩写snh48
...”[1]。2013年1月12日,举办首场演唱会“GiveMePower!”[2]。2014年7月26日,举办首届偶像年度人气总选举演唱会[3][4]。2015年[5]1月31日,举办首届SNH48年度金曲大赏演唱会[6];7月25日,举办第二届总选举演唱会[7];12月26日,举办第二... 查看详情
2018年10月7日-博客园cnblogs-页面定制css代码备份
2018年10月7日-博客园Cnblogs-页面定制CSS代码备份/*全局样式*/*{margin:0;padding:0;}html,body{font-family:"SFMono-Regular",Consolas,"LiberationMono",Menlo,Courier,monospace!important;font-size:16px!imp 查看详情
2017年7月10日星期一--出埃及记exodus28:1
2017年7月10日星期一--出埃及记Exodus28:1"HaveAaronyourbrotherbroughttoyoufromamongtheIsraelites,alongwithhissonsNadabandAbihu,EleazarandIthamar,sotheymayservemeaspriests.你要从以色列人中,使你的哥哥亚伦和他的儿子拿答,亚比户,以利亚撒,以他玛一同就近... 查看详情
放假6天干啥
参考技术A提起日历表2022日历全年,大家都知道,有人问日历2022年假期表,另外,还有人想问假期安排2022法定节假日日历,你知道这是怎么回事?其实放假安排2022年日历,下面就一起来看看日历年假期表,希望能够帮助到大家... 查看详情
你如何以这种格式显示日期? “2018 年 7 月 18 日上午 10:02”
】你如何以这种格式显示日期?“2018年7月18日上午10:02”【英文标题】:Howdoyoudisplaydateinthisformat?"Jul18,2018at10:02AM"【发布时间】:2018-07-3022:28:29【问题描述】:letdateFormatter=DateFormatter()dateFormatter.locale=Locale(identifier:"UTC")date... 查看详情
2020年下半年信息安全工程师上午真题及答案解析
1.2019年10月26日,十三届全国人民代表大会常务委员会第十四次会议审议通过了《中华人民共和国密码法》,该法将自( )起施行。A.2020年10月1日 B.2020年12月1日 C.2020年1月1日 D.2020年7月1日2.根据自主可控的... 查看详情
22年国庆假期怎么放
国庆节法定节假日是三天,是每年的10月1日到3日,按照规定,2021年国庆节从10月1日至10月7日,共放假7天。这7天,只有前三天是法定假日。因此,劳动者在前三天法定假日上班,用人单位应该按照日工资的300%支付加班工资,这... 查看详情
2022年——个人每日分享汇总
摘要:这里先行创建好,主要避免以下问题1.在21年,中途手机坏了一次,部分数据丢失2.累计几月后不便于及时的回顾,比如本次发现21的分享太多都是直接摘抄文章段落,缺少自己思考和书本系统的阅读2... 查看详情
在 PDF 报告中以 2014 年 1 月 12 日 12:10 格式显示日期时出现问题
】在PDF报告中以2014年1月12日12:10格式显示日期时出现问题【英文标题】:Issueswhiledisplayingdateintheformat12Jan201412:10inPDFreport【发布时间】:2014-09-0310:14:54【问题描述】:我在.pdf查看器中以12Jan201212:10即(dd-MMM-yyyyhh:mm)格式显示日期时... 查看详情
目标计划及执行情况
...标掌握的程度时间完成情况备注学习WebApi能用,会用2018年7月16日~2018年7月22日0学习WebService能用,会用2018年7月9日~2018年7月15日100%成功做了个例子2018年7月2日~2018年7月8日0继续完成上周任务2018年6月25日~2018年7月1日0继续完成上周... 查看详情
2018年7月31日
2018年7月31日阴转阵雨2018年7月31日,一不小心翻到了过去的日记,然后惊叹自己的表达能力。2018年7月31日,文艺青年开始重新写日记,可不能忘掉自己。2018年7月31日,天空下了一场暴雨,硬板凳上的人没有淋湿自己。2018年7月31... 查看详情
2017年3月10日上午考研日志
2017年3月10日上午复习高等数学,按照计划观看了张宇高等数学第三讲教学视频考研数学命题的稳定性,张宇老师讲课生动有趣,能激发对学数学的兴趣,知识点通俗易懂,使我记忆更加深刻。 查看详情
怎么用c#计算两个时间段的时间差(将其转换成秒)比如2013年10月1日上午10点到2014年10
...段的时间差(将其转换成秒)比如2013年10月1日上午10点到2014年10月1日上午10点半有多少秒,怎么求参考技术Astringtime1="2013-10-0110:00:00";stringtime2="2013-10-0110:30:00";DateTimet1=Convert.ToDateTime(time1);DateTimet2=Convert.ToDateTime(time2... 查看详情
徒弟涨工资排行榜
这个是徒弟张工资了,和我聊天,我截图的,假设内容不真实,天打雷劈不得好死。2015年7月29日上海一个徒弟15k了。25岁2015年7月21日 深圳2个徒弟,搞erp的。都过20k了,一个去互联网行业,一个还是在ERP2015年7月21日上海一个... 查看详情
2023年3月29日
...于它们的作用和使用场景不同。 Mock接口是用于模拟真实接口返回的数据格式,以便在开发阶段不依赖于后端接口可以独立测试前端页面或接口逻辑是否正确。Mock接口通常是在前端开发人员准备开发新功能时,通过自己手动... 查看详情
如何获得这种类型的时间格式“2014 年 8 月 13 日,下午 4:04”使用strftime?
】如何获得这种类型的时间格式“2014年8月13日,下午4:04”使用strftime?【英文标题】:Howtogetthistypeoftimeformat"Aug.13,2014,4:04p.m."usingstrftime?【发布时间】:2014-10-0616:50:41【问题描述】:我需要得到“2014年8月13日下午4:04”使... 查看详情
解析推送通知仍会在 2017 年 1 月 28 日停止吗?
】解析推送通知仍会在2017年1月28日停止吗?【英文标题】:ParsepushnotificationstillgoingtostoponJanuary28,2017?【发布时间】:2016-08-1312:10:39【问题描述】:我有一个托管在Amazon(AWS)服务器上的应用程序和一个在godaddy.inadmin上的应用程序管... 查看详情