我正在使用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
当我从本地复制链接并粘贴到浏览器上时,浏览器上会出现一个下载框, 而当我从服务器复制链接并粘贴到浏览器上时,只显示一个空白页
有时会得到像
这样的链接 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;
}
}
}
答案 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对客户来说。这个问题的一大问题是你绝对会将带宽流下载粉碎给用户。
我想知道是否有人有更好的想法?