2010-08-01 6 views
0

지난 몇 달 동안 유튜브의 모든 변화 이후에 비디오를 다운로드 할 수있는 스크립트를 작성하는 방법이 있는지 궁금합니다.YouTube에서 YouTube로 동영상을 다운로드 할 수 있습니까?

1 년 전에 작동 한 방법이 더 이상 적합하지 않다는 사실을 알고 있습니다.

+2

참고 : Youtube 이용 약관을 위반하는 것입니다. –

답변

3

예 아직 방법이 있습니다. 나는 당신을 위해 전체 스크립트를 쓰지 않을 것이지만 적어도 YouTube에서 다운로드 링크를 제공하는 함수를 작성하겠습니다.

좋아, 이렇게하려면 CURL이 필요합니다.

/* Developed by User - WebEntrepreneur @ StackOverlow.com */ 

function ___get_youtube_video($youtube_url) 
{ 
    if(eregi('youtube.com', $youtube_url)) 
    { 
     preg_match('/http:\/\/(.+)youtube.com\/watch(.+)?v=(.+)/', $youtube_url, $youtube_id_regex); 
     $youtube_id = ($youtube_id_regex[3]) ? $youtube_id_regex[3] : ''; 

     if(!$youtube_id) 
     { 
      return INVALID_YOUTUBE_ID; 
     } 

     if(eregi('\&', $youtube_id)) 
     { 
      $youtube_id_m = explode('&', $youtube_id); 
      foreach($youtube_id_m as $slices) 
      { 
       $youtube_id = $slices; 
       break; 
      } 
     } 

    } else { 
     $youtube_id = ($youtube_url); 
    } 

    $ping = ___get_curl("http://www.youtube.com/watch?v={$youtube_id}&feature=youtu.be"); 

    if(!$ping) 
    { 
     return YOUTUBE_UNAVAILABLE; 
    } 

    $ping_scan = nl2br($ping); 
    $ping_scan = explode('<br />', $ping_scan); 

    if(eregi('= null', $ping_scan[36]) or !$ping_scan[36]) 
    { 
     return YOUTUBE_TOO_MANY_REQUESTS; 
    } 

    $ping_scan = str_replace("\n", "", $ping_scan[36]); 
    $ping_scan = str_replace("    img.src = '", "", $ping_scan); 
    $out[1] = str_replace("';", "", $ping_scan); 

    $sub_ping = ___get_curl("http://gdata.youtube.com/feeds/api/videos/{$youtube_id}"); 

    preg_match('/<title type=\'text\'>(.+)<\/title>/', $sub_ping, $inout); 

    $inout = $inout[1]; 

    if(!$out[1]) 
    { 
     return VERSION_EXPIRED; 
    } 

    $out[1] = str_replace("generate_204", "videoplayback", $out[1]); 
    $out[1] = str_replace("\\/", "/", $out[1]); 
    $out[1] = rawurldecode($out[1]); 

    if($inout) 
    { 
     $out[1] .= "&file=".urlencode($inout).".mp4"; 
     $filename = urlencode($inout).".mp4"; 
    } 

    header("Content-Disposition: attachment; filename=\"".$filename."\""); 
    flush(); 
    return ___get_curl($out[1]); 
} 

function ___get_curl($url) 
{ 

    if(!function_exists("curl_setopt")) 
    { 
     return CURL_NOT_INSTALLED; 
    } 

    $ch=curl_init(); 
    curl_setopt($ch,CURLOPT_USERAGENT, "YouTube Video Downloader"); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); 
    curl_setopt($ch,CURLOPT_HEADER,0); 
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); 
    curl_setopt($ch,CURLOPT_TIMEOUT,100000); 

    $curl_output=curl_exec($ch); 
    $curlstatus=curl_getinfo($ch); 
    curl_close($ch); 

    return $curl_output; 

} 

이제 코드에 대해 이야기하겠습니다. 약 30 분의 연구 끝에 알고리즘을 해킹 할 수 있었지만 지금은 매우 엄격한 경계를 가지고 있습니다.

비디오 다운로드에 대한 각 요청은 IP에만 묶여 있기 때문에 위의 스크립트가 수행하는 대역폭에서 스트림을 스트리밍해야합니다. 그러나 keepvid.com과 같은 사이트에서는 Java를 사용하여 다운로드 URL을 가져 와서 사용자에게 스트리밍합니다. 나는 또한 이러한 종류의 도구에 매우 유용한 내 자신의 YouTube ID 그래버를 넣었습니다.

명시된 바와 같이 YouTube는 항상 알고리즘을 변경하며이 도구의 사용에 따른 모든 책임은 사용자에게 있습니다. YouTube에 대한 어떠한 손해에 대해서도 책임을지지 않습니다.

희망은 당신을 위해 좋은 경계를 설정하고, 그것을 만드는 동안 보냈습니다.

+0

고마워요. 그게 내가 찾고 있던 바로 그 것이다. – Alex1987

+0

좋아,이 코드를 시도하고 html 파일을 다운로드한다. 이것은 내가 귀하의 스크립트를 사용하는 방법입니다 echo ___ get_youtube_video ("http://www.youtube.com/watch?v=dDwKPGUIVME"); Alizee + - + Moi + Lolita.mp4.html – Alex1987

+0

서버가되어 디버깅을 시도하고 어떤 결과가 나오는지 확인할 수 있습니다. –

관련 문제