2017-07-17 63 views
0

我使用webrequests使用URL http://youtube.com/get_video_info?video_id={ID HERE}的YouTube視頻信息回用瀏覽器和WebRequest的C#不同的結果

當我訪問的網址與瀏覽器獲取視頻數據離開YouTube,它下載的響應文件和所有的所需的數據存在。但是,當我使用HttpWebRequest下載適當的UserAgent的響應時,很多數據丟失。

不存在的數據主要涉及語言環境信息,瀏覽器版本信息(我認爲會附帶正確的UserAgent字符串,但我猜不到),以及引用從請求創建的事件的ID。

我的問題是:爲什麼數據出現在瀏覽器下載版本與WebRequest版本中?我怎樣才能看到我的瀏覽器發送的內容與我創建的請求有什麼不同?

這裏是我當前如何請求在C#中的數據:

 var url = string.Format("http://youtube.com/get_video_info?video_id={0}", videoId); 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.UserAgent = userAgent; 
     var response = request.GetResponse(); 

     string contents; 
     using (var sr = new StreamReader(response.GetResponseStream())) 
      contents = sr.ReadToEnd(); 
+0

您可以查看使用像[小提琴手(HTTP工具的請求/從你的瀏覽器和應用對策: //www.telerik.com/fiddler)。 – Poosh

回答

1

標準的WebRequest和瀏覽器請求發送不同的頭。您必須正確準備您的WebRequest(設置正確的標頭和Cookie)以發出相同的HTTP請求。

要查看其差異,請下載Fiddler並在瀏覽器中打開相同的URL,然後在Visual Studio中以原始文本模式比較兩個請求。你會注意到WebRequest缺少很多頭文件。

0

您的瀏覽器通常會向get_video_info發送較長的查詢,其中包含語言環境和某種稱爲sts的會話標識符。

得到sts我在手錶或嵌入頁面尋找json配置,然後搜索名爲「sts」的屬性。 您可以使用此正則表達式來找到它:

var sts = Regex.Match(html, @"""sts""\s*:\s*(\d+)").Groups[1].Value; 

語言環境/語言使用稱爲hl查詢參數傳遞。

然後有兩個其他參數elps,我不知道他們做了什麼,但它們也以某種方式影響響應。我只是將它們設置爲預定義的值。

最後,查詢字符串看起來喜歡這樣的:

"https://www.youtube.com/get_video_info?video_id={videoId}&sts={sts}&el=info&ps=default&hl={language}" 

從這裏摘自:https://github.com/Tyrrrz/YoutubeExplode/blob/f24c5b0040ffdded6922fc1b853c3d7155812f0b/YoutubeExplode/YoutubeClient.cs#L200

相關問題