2010-08-01 148 views
0

我想知道在过去几个月里,在YouTube的所有变化之后是否有办法编写一个可以下载视频的脚本?使用PHP从YouTube上下载视频 - 仍有可能吗?

我意识到一年前工作的方法不再相关的事实。

+2

注意:这样做违反了Youtube使用条款。 – 2010-08-01 19:45:10

回答

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 2010-08-02 14:59:44

+0

好吧,我试过这段代码,它下载了html文件。这是我如何使用脚本 echo ___ get_youtube_video(“http://www.youtube.com/watch?v=dDwKPGUIVME”); 它下载Alizee + - + Moi + Lolita.mp4.html – Alex1987 2010-08-03 08:43:02

+0

它可能是你的服务器,试图调试它,看看会发生什么。 – 2010-08-07 22:28:28