zoukankan      html  css  js  c++  java
  • 优酷真实视频地址解析——2016年9月20日 优酷视频下载工具

    优酷等下载工具:http://www.ilewo.cn/ 猎影视频下载工具

    没时间跟优酷肛啊,投奔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('
    ');//最后一个是"",自己处理吧
    }
    复制代码

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

    =================================================我是分割线,以下是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地址

    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字段,即(XNzk2NTI0MzMy1991941296),但是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地址为

    http://pl.youku.com/playlist/m3u8?ctype=12&ep=cCaVGE6OUc8H4ircjj8bMiuwdH8KXJZ0vESH%2f7YbAMZuNaHQmjbTwg%3d%3d&ev=1&keyframe=1&oip=996949050&sid=241273717793612e7b085&token=3825&type=hd2&vid=XNzk2NTI0MzMy

    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片段

    http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv

    将m3u8中所有的url片段全部下载即可大功告成。

  • 相关阅读:
    array and ram
    char as int
    pointer of 2d array and address
    Install SAP HANA EXPRESS on Google Cloud Platform
    Ubuntu remount hard drive
    Compile OpenSSL with Visual Studio 2019
    Install Jupyter notebook and tensorflow on Ubuntu 18.04
    Build OpenCV text(OCR) module on windows with Visual Studio 2019
    Reinstall VirtualBox 6.0 on Ubuntu 18.04
    Pitfall in std::vector<cv::Mat>
  • 原文地址:https://www.cnblogs.com/jifeng/p/6221115.html
Copyright © 2011-2022 走看看