youtube视频在本地成功下载,但在服务器(在线)上只下载了0字节的flv

时间:2010-04-10 11:34:00

标签: php youtube-api

我正在使用php tube类下载youtube视频。 通过提交YouTube视频网址,视频会自动下载到文件夹中。

在本地(XAMPP)上一切正常,但是当我将其上传到服务器(在线)时,只保存0字节的flv文件。

我还调试代码(本地和全局)。

我得到这样的网址(在本地上)

http://www.youtube.com/get_video?video_id=1jNWCFwqPvM&=vjVQa1PpcFMyYCECyfmYENWklpwXGyhVgJpSFPgNAEc%3D

而在服务器上,我得到了这样的链接

http://www.youtube.com/ get_video?video_id=1jNWCFwqPvM&t=vjVQa1PpcFNS3SPxIXi8hy-NF4qZFFrScDXCjGLLrLc%3D

当我从本地复制链接并粘贴到浏览器上时,浏览器上会出现一个下载框, 而当我从服务器复制链接并粘贴到浏览器上时,只显示一个空白页

  1. 请解决我的问题,错误在哪里?
  2. 如何知道服务器上是否安装了梨?
  3. 服务器端的
  4. 有时会得到像

    这样的链接

    http://www.youtube.com/get_video?video_id=1jNWCFwqPvM&t=vjVQa1PpcFNS3SPxIXi8hy-NF4qZFFrScDXCjGLLrLc%3D

  5. 但有时我只得到

    http://www.youtube.com/get_video?video_id=&t=

    如何解决这些问题?

    更新

    我调试了所有代码并发现file_get_contents()在服务器上返回字符串(0),而在本地它返回一些整数值。 allow_url_fopen是我的服务器

    这是index.php

    include_once('functions.php');  
    $url =  $_POST['url']; // here is url of youtube video
    $pattern = getPatternFromUrl($url); 
    $flv_path = GrabFlvFromYoutube($pattern );
    echo "File Successfully Downloaded at:".$flv_path."<br/>";
    

    这些功能在functions.php

    function getPatternFromUrl($url)
    {
    $url = $url.'&';
    $pattern = '/v=(.+?)&+/';
    preg_match($pattern, $url, $matches);
    //echo $matches[1]; die;
    return ($matches[1]);
    }
    

    function GrabFlvFromYoutube( $pattern )
    {
    require_once ("phptube.php");
    $tube = new PHPTube ();
    $flv_http_path = $tube->download($pattern) ;
        echo "<br/>Complete URL:".$flv_http_path;
    set_time_limit(0);
    
    $data = file_get_contents($flv_http_path);  
    //var_dump(file_get_contents($flv_http_path));  
    $new_flv_path = dirname(_FILE_).'/flvs/'.$pattern.'-'.time().'.flv' ;
    
    echo "<br />File uploaed:";
        file_put_contents($new_flv_path, $data);    
    
    return $new_flv_path ;
    }
    

    以下phptube.php

    中的功能
    class PHPTube {
    
    var $cookies;
    var $mgr;
    var $req; 
    var $debug = true;
    var $auth = false;
    
    function PHPTube () {}
        function download ($video_id) {
    
        $url = "http://www.youtube.com/watch?v=".$video_id;     
    $this->req =& new HTTP_Request($url);
    $response = $this->req->sendRequest();
    if (PEAR::isError($response)) {
        $response->getMessage()."\n";
    } else {    
            $page = $this->req->getResponseBody();  
        $vpattern = '/v=(.*?)&/';
        //$vpattern ='/video_id:(.*?)/';
        preg_match($vpattern,$page,$mv);
        //preg_match('&"video_id": "(.*?)"&', $page, $mv); 
        echo "<br />Video ID:".$v_id = $mv[1]; 
        //$tpattern='/"t": "(.*?)"/';
        $tpattern = '/&t=(.*?)&/';
        preg_match($tpattern,$page,$tickets);
        echo "<br />Token ID:".$token = $tickets[1];
        $curl = "video_id=";
        $curl .= $v_id;
        $curl .= "&t=";         
        $curl.= $token;
        //echo "<br />Query String:".$curl; die;
        $url = "http://www.youtube.com/get_video?".$curl;  
        if ($this->debug)
         return $url;
         }
       }
     }  
    

3 个答案:

答案 0 :(得分:2)

要将youtube视频下载/复制到您的服务器......您可以通过SSH来实现。

1)下载最新版本的youtube-dl脚本(此处:http://rg3.github.io/youtube-dl/将其另存为youtube-dl.py并将其上传到服务器上的任意位置。

2)要下载视频,请通过ssh登录服务器(使用putty或其他),导航到保存youtube-dl脚本的目录,然后输入如下命令下载视频:

代码:

python youtube-dl.py -o youroutputfile.mp4 http://www.youtubevideourl.com/

您在-o部分之后指定的文件名是您要将视频保存为的文件名,而youtubevideourl部分则类似http://www.youtube.com/watch?v=_DHEK9xJXvs即。来自Youtube的实际视频页面网址。该脚本将获取youtube页面,提取视频位置并保存视频。如果它停止工作,这意味着Youtube已更改其页面格式,您必须从该网站下载新版本的youtube-dl。

这是一个很棒的脚本,因为它从命令行运行,很容易将它合并到您自己的脚本中进行批量下载。

答案 1 :(得分:1)

您是否至少尝过我在上一个问题中提到的用户代理的想法?如果你没有,我会再把它粘贴在这里。

ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9');

而且你将把它粘贴在脚本文件的顶部。您也可以在user_agent设置下的php.ini文件中更改此内容。

我唯一可以想象的是,服务器和本地计算机之间的区别在于服务器识别自己的方式不同。

另一件事是,YouTube可能阻止您的服务器/网络主机请求视频。如果你是在一个共享主机上并且之前有人试图做这件事,那么谷歌可能会对其进行打击,并将主机的IP列入黑名单。从YouTube 下载FLV 违反服务条款,因此他们可能已经完成了这项工作。

希望这有助于(再次)。

答案 2 :(得分:0)

我认为这与试图解析其源代码或获取链接的机器的ip有关。在本地机器上,由于你拉了页面,链接将在ip param中有你的ip,如果在远程服务器上完成,那么服务器ip将在ip param中,你将尝试从你的机器下载ips不匹配的地方。

我也面临一个类似的情况,在我的开发机器上它很好,但是一旦我把它放到现场,它就全都去了。我正在试图弄清楚如何使它工作,这是我能想到的最简单/唯一的事情就是用javascript在客户端上做。

编辑:

我在客户端上使用ajax请求youtube页面的想法将无效,因为您无法从其他域请求。

我能想到让它工作的另一种方法是让服务器获得对服务器的ip有效的下载链接,然后使用readfile()代理文件下载{{1对客户来说。这个问题的一大问题是你绝对会将带宽流下载粉碎给用户。

我想知道是否有人有更好的想法?

相关问题