2011-11-30 2 views
0

YouTube에서 비디오를 다운로드하고 싶습니다. 나는 IDM에서 링크 위에 있어요YouTube에서 비디오 다운로드 링크를 얻는 방법은 무엇입니까?

http://www.youtube.com/watch?v=Fwa_GvIBH38&feature=feedrec_grec_index 

http://o-o.preferred.btcl-dac1.v6.lscache4.c.youtube.com/videoplayback?sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Csource%2Calgorithm%2Cburst%2Cfactor%2Ccp&fexp=914016%2C904443&algorithm=throttle-factor&itag=34&ip=58.0.0.0&burst=40&sver=3&signature=82D07EBDBED8BC79D08AEE3F90B1473E44D4065E.88AB21BBB9E2D252B65FE6C419CD7867CDE8815C&source=youtube&expire=1322694000&key=yt1&ipbits=8&factor=1.25&cp=U0hRR1ZUUl9FSkNOMV9OTlZBOmRXLUt2VHYwWVY2&id=1706bf1af2011f7f&ptchn=collegehumor&ptk=collegehumor 

에 도착합니다.

위의 링크를 얻으려면 웹 사이트에서 두 가지 방법이 있습니다.

//this methods get's the download link for youtube videos in mp4 format. 
    public string url(string url) 
    {  
     string html = getYoutubeHtml(url);  
     HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument();  
     hDoc.LoadHtml(html);  
     HtmlNode node = hDoc.GetElementbyId("movie_player");  
     string flashvars = node.Attributes[5].Value; 
     string _url = Uri.UnescapeDataString(flashvars);  
     string[] w = _url.Split('&');  
     string link = ""; 
     bool foundUrlMap = false; 
     for (int i = 0; i < w.Length; i++) 
     {  
      if (w[i].Contains("fmt_url_map="))   
      {   
       foundUrlMap = true;  
       link += w[i].Split('|')[1];  
      }   
      if (foundUrlMap)  
      {   
       //add the parameters to the url  
       link += "&" + w[i];   
       if (w[i].Contains("id="))  
       {    
        link = link.Split(',')[0]; 
        //change the array index for different formats   
        break;    
       }  
      }   
     }   
     link = link.Split('|')[1] + "&title=out"; 
     System.Windows.MessageBox.Show(link); 
     return link; 
    } 
    //this method downloads the html code from the youtube page. 
    private string getYoutubeHtml(string url)  
    {   
     string html = ""; 
     WebRequest request = WebRequest.Create(url); 
     WebResponse response = request.GetResponse(); 
     TextReader reader = new StreamReader(response.GetResponseStream()); 
     string line = ""; 
     while ((line = reader.ReadLine()) != null)   
     {   
      html += line;  
     }  
     return html; 
    } 

그것은 내가 무엇을 할 수 지금 그래서

승의 내부 fmt_url_map=을 찾을 수없는

을 work.ing 아니에요?

+0

([이 질문의 대답] 변환 시도 http://stackoverflow.com/questions/6015962/how- 웹 클라이언트에서 직접 스트림을로드 to-get-mp4-mov-m4v-video-link-for-a-youtube-video)를 C# – Blender

+0

에 보내면 해결책이 작동하지 않습니다. – Vero009

+0

당신이 그것을 변환? – Blender

답변

2

문자열 fmt_url_map은 더 이상 YouTube에 존재하지 않으며이 문제는 YouTube가 지속적으로 진화하는 짐승임을 유감입니다. 그것은 이것이 현재 효과가있을 것이라고 말했다.

현재 검색해야하는 문자열은 "url_encoded_fmt_stream_map"이지만 다시 "url ="으로 쉽게 나눌 수 있습니다.

나는 오늘 이것을 테스트하는 데 몇 시간을 보냈다. 플래시 버스트 문자열을 올바르게 디코딩하는 데 이상한 점이 있었다.

 string _url = string.Empty; 
     //Crazy string! 
     _url = Uri.UnescapeDataString(flashvars); 
     _url = HttpUtility.HtmlDecode(_url); 
     _url = HttpUtility.UrlDecode(_url); 
     _url = Uri.UnescapeDataString(_url); 

Uri.UnescapeDataString()이 두 번 필요합니다!

public string url(string url, string videoFormat) 
    { 
     HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument(); 
     hDoc.Load(new WebClient().OpenRead(url)); 
     HtmlNode node = hDoc.GetElementbyId("movie_player"); 
     string flashvars = node.Attributes[5].Value; 

     string _url = string.Empty; 
     //Crazy string! 
     _url = Uri.UnescapeDataString(flashvars); 
     _url = HttpUtility.HtmlDecode(_url); 
     _url = HttpUtility.UrlDecode(_url); 
     _url = Uri.UnescapeDataString(_url); 

     string[] w = _url.Split(new[] {"url="}, StringSplitOptions.None); 
     string link = ""; 
     if(!string.IsNullOrEmpty(videoFormat)) 
     { 
      foreach (string t in w) 
      { 
       if(t.Contains("type=") && t.Contains(videoFormat)) 
       { 
        link = t; 
        break; 
       } 
      } 
     } 
     else 
     { 
      link = w[1]; 
     } 

     link += "&title=out"; 
     System.Windows.MessageBox.Show(link); 
     Process.Start(link); 
     return link; 
    } 

그래서 일부 보너스 포인트 방법은 지금 당신이 필요한 비디오 포맷, "MP4", "X-FLV"또는 "WEBM"을 통과하는 문자열을 받아들입니다.

그리고 그것은 더 이상 getYoutubeHtml() 메소드가 필요, 그것은

HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument(); 
    hDoc.Load(new WebClient().OpenRead(url)); 
+1

나는 1 년 이상 된 것을 알고 있으며, YouTube가 끊임없이 변화하고 있다고 말한 바 있습니다. 즉, 나는이 방법이 더 이상 작동하지 않는다고 생각합니다. 이유 : flashvars 변수는 javascript를 통해 생성되고 'placeholder'flashvars는 인코딩 된 javascript 문자열로 즉시 대체됩니다. YT 비디오의 소스를 확인하고 이것을 찾으십시오 :'swf = swf.replace ('__ flashvars__', encoded.join ('&'));' – Anders

관련 문제