1. 程式人生 > >Youtube 視訊地址解析 C#

Youtube 視訊地址解析 C#

第一篇部落格,最近再整國內各大視訊網站真實視訊地址解析,覺得很有必要共享給大家,那就從Youtube開始吧~

首先,需要能翻牆,我就拿goagent來說吧,其他的翻牆我也沒用過,goagent開啟後,選擇設定IE代理,如下所示:

好了,正式開始吧~

第一步:獲取vid,比如:https://www.youtube.com/watch?v=LyjKbMlaMbM,vid就是LyjKbMlaMbM

第二部:獲取視訊資訊:”http://www.youtube.com/get_video_info?video_id=“ + vid,獲取的是一個檔案,檔案中包含了視訊地址、清晰度等資訊,現在說下如何獲取這個資訊。

1.下載上述檔案,並且獲取檔案中的字串資訊。

           //下載資訊檔案
            string infoURL = "http://www.youtube.com/get_video_info?video_id=" + vid;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(infoURL);
            Stream ns = request.GetResponse().GetResponseStream();
            byte[] nbytes = new byte[512];
            int nReadSize;
            string info = "";
            while (true)
            {
                nReadSize = ns.Read(nbytes, 0, 512);
                if (nReadSize == 0) break;
                //轉成字串
                info += Encoding.Default.GetString(nbytes);
            }
2.用正則表示式從info中獲取關鍵資訊。
            //提取出視訊關鍵資訊部分
            string regStr = "&url_encoded_fmt_stream_map=(.+?)&";
            Regex reg = new Regex(regStr);
            Match match = reg.Match(info);
            info = match.Groups[1].Value;
            //解碼
            info = Uri.UnescapeDataString(info);
現在獲取到的資訊是以“,”(無引號)分隔的不同清晰度視訊的資訊。

3.將每種清晰度檔案的資訊提取出來,每種清晰度的資訊中又包含了5項引數:itag,quality, type ,fallback_host,url,順序不定,以&分隔。

    <pre name="code" class="csharp">            string[] parts = info.Split(',').ToArray();//每種清晰度的引數
            Hashtable ht;//存放一種清晰度的引數鍵值對
            List<Hashtable> infoList = new List<Hashtable>();//資訊列表
            for (int i = 0; i < parts.Length; i++)
            {//對於每一種清晰度
                string[] part_info = parts[i].Split('&').ToArray();//一種清晰度的引數
                ht = new Hashtable();//新建一個HashTable
                for(int j = 0; j < part_info.Length; j++)
                {
                    string[] pair = part_info[j].Split('=').ToArray();//鍵值對,itag,quality, type ,fallback_host,url
                    ht.Add(pair[0], Uri.UnescapeDataString(pair[1]));
                }
                //加入列表
                infoList.Add(ht);
            }

4.到這裡,infoList中已經包含了各種清晰度的視訊資訊,每種清晰度的視訊資訊儲存在一個Hashtable中,以鍵值對的形式儲存。取出其中鍵為url的值即為該清晰度對應的視訊下載地址。

最後把獲取視訊資訊的全部程式碼附上:

        private static List<Hashtable> getVideoInfo(string vid)
        {
            List<Hashtable> infoList = new List<Hashtable>();//資訊列表
            //下載資訊檔案
            string infoURL = "http://www.youtube.com/get_video_info?video_id=" + vid;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(infoURL);
            Stream ns = request.GetResponse().GetResponseStream();
            byte[] nbytes = new byte[512];
            int nReadSize;
            string info = "";
            while (true)
            {
                nReadSize = ns.Read(nbytes, 0, 512);
                if (nReadSize == 0) break;
                //轉成字串
                info += Encoding.Default.GetString(nbytes);
            }
            //提取出視訊關鍵資訊部分
            string regStr = "&url_encoded_fmt_stream_map=(.+?)&";
            Regex reg = new Regex(regStr);
            Match match = reg.Match(info);
            info = match.Groups[1].Value;
            //解碼
            info = Uri.UnescapeDataString(info);

            string[] parts = info.Split(',').ToArray();//每種清晰度的引數
            Hashtable ht;//存放一種清晰度的引數鍵值對
            for (int i = 0; i < parts.Length; i++)
            {//對於每一種清晰度
                string[] part_info = parts[i].Split('&').ToArray();//一種清晰度的引數
                ht = new Hashtable();//新建一個HashTable
                for(int j = 0; j < part_info.Length; j++)
                {
                    string[] pair = part_info[j].Split('=').ToArray();//鍵值對,itag,quality, type ,fallback_host,url
                    ht.Add(pair[0], Uri.UnescapeDataString(pair[1]));
                }
                //加入列表
                infoList.Add(ht);
            }

            return infoList;
        }
轉載請說明出處。