2012-08-09 21 views
1

我試圖在ASP.NET中使用YoutubeFisher庫。我製作了一個HttpWebRequest來抓取HTML內容,處理比賽以提取視頻鏈接並在網頁上顯示鏈接。我設法使它在本地主機上工作。我可以檢索視頻鏈接並在locahost上下載視頻。但是當我將它推送到服務器時,它只有在我從同一服務器發送請求時纔有效。如果該頁面被客戶端瀏覽器訪問,則客戶端可以正確地看到鏈接,但是當單擊鏈接時,即使鏈接正確,每當客戶端點擊鏈接時,客戶端也會得到HTTP錯誤403。使用ASP.NET和YoutubeFisher訪問YouTube,但獲取HTTP錯誤403

我的分析是,當服務器使HttpWebRequest抓取HTML範圍時,它也會發送HTTP標題。我認爲從YouTube服務器發回的HTML內容(指向視頻文件的鏈接)將僅響應僅匹配從服務器發送的HTTP標頭的請求。所以,當客戶點擊鏈接時,它會向不同的HTTP頭髮送請求到YouTube服務器。

因此,我正在考慮從客戶端獲取HTTP標頭,然後在製作HttpWebRequest之前修改Server HTTP標頭以包含客戶端的HTTP標頭信息。我不太確定這是否可行。據我所知,HTTP heaer不能被修改。

下面是使HttpWebRequest的從YouTubeFisher庫中的代碼,

public static YouTubeService Create(string youTubeVideoUrl) 
     { 
      YouTubeService service = new YouTubeService(); 
      service.videoUrl = youTubeVideoUrl; 

      service.GetVideoPageHtmlSource(); 
      service.GetVideoTitle(); 
      service.GetDownloadUrl(); 

      return service; 
     } 

     private void GetVideoPageHtmlSource() 
     { 
      HttpWebRequest req = HttpWebRequest.Create(videoUrl) as HttpWebRequest; 
      HttpWebResponse resp = req.GetResponse() as HttpWebResponse; 
      videoPageHtmlSource = new StreamReader(resp.GetResponseStream(), Encoding.UTF8).ReadToEnd(); 
      resp.Close(); 
     } 

客戶端瀏覽網頁,但該鏈接是有,但給HTTP 403:

enter image description here

enter image description here

瀏覽的頁面的從服務器本身,一切都按預期工作:

enter image description here

我如何HttpWebRequest的客戶端,然後的代表?我對這個問題的分析是否正確?

謝謝您的輸入。

回答

0

使用諸如Charles,Fiddler甚至Firebug之類的http監視器來查找在成功情況下從瀏覽器發送了哪些附加頭文件。我懷疑你需要複製一個或多個accept,user-agentreferer

0

在過去,我只是假設youtube有這些鏈接編碼,以便他們只爲原始請求IP工作。如果是這樣的話,那將會困難得多。我不知道如果是這樣的情況下,嘗試轉發所有標題元素,你可以在走這條路線之前...

想到的唯一可能是你必須使用javascript請求將頁面下載到客戶端的瀏覽器,然後將其上傳到服務器進行處理,或者使用javascript進行處理。

或者你可以讓客戶端通過你的服務器下載視頻流,所以你的服務器會通過數據。這顯然會佔用大量的帶寬。