2

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

在本地(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. 在服务器端,有时我会得到类似的链接

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

但有时我只得到

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;
     }
   }
 }  
4

3 回答 3

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。

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

于 2014-10-08T11:48:17.987 回答
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');

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

我能想象到的唯一一件事是您的服务器和本地计算机之间的不同之处在于服务器以不同的方式识别自己。

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

希望这会有所帮助(再次)。

于 2010-04-11T14:28:20.703 回答
0

我认为这与试图解析其源代码或获取链接的机器的 ip 有关。在本地计算机上,由于您拉取页面,因此链接将在 ip 参数中包含您的 ip,如果在远程服务器上完成,则该服务器 ip 将在 ip 参数中,您将尝试从您的机器下载ips不匹配的地方。

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

编辑:

我在客户端上使用 ajax 请求 youtube 页面的想法不起作用,因为您无法从另一个域请求。

我能想到的让它工作的唯一另一种方法是让服务器获取对服务器的 ip 有效的下载链接,然后使用readfile()和一些代理文件下载header()到客户端。这样做的最大问题是,您绝对会破坏您的带宽流下载给用户。

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

于 2010-04-11T20:14:01.443 回答