2011-12-19 17 views
2

私はvimeoからビデオをダウンロードしようとしています。 問題は、リダイレクトを行うコード302を受け取らなければならないときに、コード200(「Permission denied」と表示されているページ)が表示されることです。 これはコードです:ビデオをvimeoからダウンロードする

string url = "http://player.vimeo.com/play_redirect?clip_id=" + clip_id + "&sig=" + request_signature + "&time=" + request_signature_expires + "&quality=" + hd + "&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location="; 

_VideoURL = GetHttpSpecial(url, cookies); 

public string GetHttpSpecial(string url, CookieContainer cookies) 
     { 
      string html = ""; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      request.Method = "GET"; 
      request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      request.Headers.Add("Accept-Language: nl,en-us;q=0.7,en;q=0.3"); 
      request.Headers.Add("Accept-Encoding: gzip, deflate"); 
      request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"; 
      request.KeepAlive = true; 
      request.Timeout = 20000; 
      request.AllowAutoRedirect = false; 
      request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      foreach (Cookie cookie in response.Cookies) 
      { 
       cookies.Add(cookie); 
      } 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       try 
       { 
        Stream responseStream = response.GetResponseStream(); 
        StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
        try 
        { 
         html = reader.ReadToEnd(); 
        } 
        finally 
        { 
         reader.Close(); 
        } 
       } 
       finally 
       { 
        response.Close(); 
       } 
       return html; 
      } 
      else 
      { 
       if (response.StatusCode == HttpStatusCode.Found) 
       { 
        return response.Headers["Location"].ToString(); 
       } 
       else 
       { 
        return "error: server returned status description:" + response.StatusDescription; 
       } 
      } 
     } 

あなたは、私を助けてくださいもらえますか?

おかげ

+0

こんにちはサラ、サイトにようこそ。あなたは、プログラムでビデオをダウンロードしようとしているとき、またはvimeoをサイト経由で使っているときにこれを見ていますか? – StuperUser

+0

私のアプリケーションプログラミングを使用してvimeoからビデオをダウンロードしようとしています –

答えて

0

サラ、あなたが同じを送信していることを確認するために要求/応答を調べるためにFiddlerを使用しています。通常、ウェブサイトを使用してビデオを再生するのを見ると、再生リンクを直接呼び出すときではなく、前後に渡されるvimeoのクッキーがあります。

おそらくRepsonse.GetResponseHeader("Set-Cookie")から(Vimeoのクッキーを取得し、さらに呼び出しでそれを使用する最初のホーム・ページに対する要求を行ってみてください。

それは、Vimeoのは言及されていない要求を許可しないことが考えられます彼らのウェブサイトからあなたも

request.Referer = 
      "http://a.vimeocdn.com/[[IMPORT]]/player.vimeo.com/assets/flash/moogaloop/5.2.8/controllers/videoController.swf"; 
+0

私はFiddleでそれをチェックしましたが、要求/応答は次のとおりです:

 # \t Result \t Protocol \t Host \t URL \t Body \t Caching \t Content-Type \t Process \t Comments \t Custom \t 118 \t 302 \t HTTP \t player.vimeo.com \t /play_redirect?clip_id=33735037&sig=85b60dd8d19ec06b9307fbc1e733048d&time=1324303943&quality=hd&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location= \t 20 \t no-store, no-cache, must-revalidate Expires: Fri, 25 Feb 1983 09:30:00 GMT \t text/html; charset=UTF-8 \t avp:3544 \t \t \t 119 \t 200 \t HTTP \t av.vimeo.com \t /38970/772/76932486.mp4?token=1324304859_f553bbbfb98f07551487cefe95ec3135 \t 55.608.510 \t \t video/mp4 \t avp:3544 \t \t \t 

+0

私のコードはC#パーミッションが拒否された状態で200コードが表示されます。 リファラーを試しましたが、リダイレクトできません。 ありがとうございました –

1

を行うために必要がある場合がありますので、このコードは私のための作品です 私は簡単なボタンを使用して新しいWPFプロジェクトを作成ここでは、コードビハインドである:。。

private Dictionary<int, CookieContainer> m_cookieContainer = new Dictionary<int, CookieContainer>(); 

private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      HttpWebRequest req = CreateRequest("http://vimeo.com/42082443"); 
      req.AllowAutoRedirect = false; 
      req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0"; 
      req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      req.Headers[HttpRequestHeader.AcceptLanguage] = "ru,en;q=0.8,en-us;q=0.5,uk;q=0.3"; 
      req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; 
      req.KeepAlive = true; 
      req.Timeout = 20000; 
      req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
      using (HttpWebResponse response = GetResponse(req)) 
      { 
       if (response.StatusCode == HttpStatusCode.OK) 
       { 
        string pageData = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

        string clipId = null; 
        if (Regex.Match(pageData, @"clip_id=(\d+)", RegexOptions.Singleline).Success) 
        { 
         clipId = Regex.Match(pageData, @"clip_id=(\d+)", RegexOptions.Singleline).Groups[1].ToString(); 
        } 
        else if (Regex.Match(pageData, @"(\d+)", RegexOptions.Singleline).Success) 
        { 
         clipId = Regex.Match(pageData, @"(\d+)", RegexOptions.Singleline).Groups[1].ToString(); 
        } 

        string sig = Regex.Match(pageData, "\"signature\":\"(.+?)\"", RegexOptions.Singleline).Groups[1].ToString(); 
        string timestamp = Regex.Match(pageData, "\"timestamp\":(\\d+)", RegexOptions.Singleline).Groups[1].ToString(); 

        string videoUrl = string.Format("http://player.vimeo.com/play_redirect?clip_id={0}&sig={1}&time={2}&quality=hd&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location=", clipId, sig, timestamp); 

        req = CreateRequest(videoUrl); 
        req.AllowAutoRedirect = false; 
        req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0"; 
        req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
        req.Headers[HttpRequestHeader.AcceptLanguage] = "ru,en;q=0.8,en-us;q=0.5,uk;q=0.3"; 
        req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; 
        req.KeepAlive = true; 
        req.Referer = "http://a.vimeocdn.com/p/flash/moogaloop/5.2.25/moogaloop.swf?v=1.0.0"; 
        req.Timeout = 20000; 
        req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
        using (HttpWebResponse response2 = GetResponse(req)) 
        { 
         if (response2.StatusCode == HttpStatusCode.Found) 
         { 
          string location = response2.Headers[HttpResponseHeader.Location]; 
          MessageBox.Show(location); 
         } 
        } 
       } 
      } 
     } 

     private CookieContainer GetCookieContainerPerThread() 
     { 
      int managedThreadId = Thread.CurrentThread.ManagedThreadId; 
      lock (typeof(MainWindow)) 
      { 
       if (!this.m_cookieContainer.ContainsKey(managedThreadId)) 
       { 
        CookieContainer container = new CookieContainer(); 
        this.m_cookieContainer.Add(managedThreadId, container); 
       } 
      } 
      return this.m_cookieContainer[managedThreadId]; 
     } 

     public HttpWebRequest CreateRequest(string url) 
     { 
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
      req.CookieContainer = this.GetCookieContainerPerThread(); 
      //this.InitProxy(req); 
      return req; 
     } 

     public HttpWebResponse GetResponse(HttpWebRequest req) 
     { 
      HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
      this.GetCookieContainerPerThread().Add(response.Cookies); 
      return response; 
     } 
は、
+0

私はあなたの答えを試しましたが、私は "場所"しか見ることができません:どのようにその場所を使ってビデオをダウンロードできますか?ありがとう – Marco

+0

@Marco Locationは、リモートサーバーの物理ビデオファイルへの直接リンクでなければなりません。それをWebClient.DownloadFileに渡します。 –

+0

これは、使用したビデオリンクで機能しました。しかし、私が[this](http://vimeo.com/30881879)または[this other](http://vimeo.com/17913746)を試してもlocationはnullです。あなたは何か考えていますか?ありがとうございました – Marco

関連する問題