YouTube видео успешно загружено на локальный, но на сервер (онлайн) загружается только 0 байт. - PullRequest
2 голосов
/ 10 апреля 2010

Я использую класс php tube для загрузки видео с YouTube. Видео автоматически загружается в папку, отправляя URL-адрес видео на YouTube.

все работает нормально на локальном компьютере (XAMPP), но когда я загружаю это на сервер (онлайн), ТОЛЬКО 0 байт файл flv сохраняется.

Я также отлаживаю код с обеих сторон (локальный и глобальный).

Я получаю URL, как это (на локальный )

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

тогда как на сервере я получил такую ​​ссылку

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

когда я копирую ссылку, полученную из local и вставляю в браузер, в браузере появляется окно загрузки, тогда как когда я копирую ссылку, полученную с сервера и вставляю в браузер, появляется только пустая страница

  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=

Как их решить?

UPDATE:

Я отлаживал весь код и обнаружил, что 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 ]

2 голосов
/ 08 октября 2014

Чтобы загрузить / скопировать видео 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 т.е. фактический URL страницы видео с Youtube. Сценарий извлечет страницу YouTube, извлечет местоположение видео и сохранит видео. Если он перестает работать, это означает, что Youtube изменил форматирование своей страницы, и вам необходимо загрузить новую версию youtube-dl с сайта.

Это отличный сценарий, поскольку, поскольку он запускается из командной строки, его очень легко включить в свои собственные сценарии для выполнения пакетной загрузки.

1 голос
/ 11 апреля 2010

Вы хотя бы попробовали идею агента пользователя, которую я упомянул в вашем последнем вопросе? Я вставлю это сюда снова, если вы этого не сделали.

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-адрес вашего хоста. Загрузка FLV с YouTube является нарушением условий обслуживания, поэтому они вполне могли это сделать.

Надеюсь, это поможет (снова).

0 голосов
/ 12 апреля 2010

Я думаю, что это связано с ip-адресом машины, которая пытается проанализировать их исходный код или получить ссылку. На локальном компьютере, так как вы перетаскиваете страницу, ссылка будет иметь ваш ip в параметре ip, если это сделано на удаленном сервере, то серверы ip будут в параметре ip, и вы будете пытаться скачать с вашего компьютера где ips не совпадают.

Я также сталкиваюсь с похожей ситуацией, когда на моей dev-машине все нормально, но как только я включил ее, все пошло в гору. Я пытаюсь понять, как заставить это работать, самое простое / единственное, что я могу придумать, это делать на клиенте с помощью JavaScript.

EDIT:

Моя идея запроса страницы YouTube с использованием ajax на клиенте не будет работать, поскольку вы не можете запросить у другого домена.

Единственный другой способ заставить его работать, это позволить серверу получить ссылку для скачивания, которая будет действительна для ip-адреса сервера, затем прокси-файл для загрузки файла, используя readfile() и некоторые header(). клиенту. Большая проблема с этим заключается в том, что вы абсолютно сократите скорость потоковой загрузки для пользователей.

Хотелось бы узнать, есть ли у кого идеи получше?

...