Youtube 視訊地址解析 C#
阿新 • • 發佈:2019-02-11
第一篇部落格,最近再整國內各大視訊網站真實視訊地址解析,覺得很有必要共享給大家,那就從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.下載上述檔案,並且獲取檔案中的字串資訊。
2.用正則表示式從info中獲取關鍵資訊。//下載資訊檔案 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);
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;
}
轉載請說明出處。