2

YouTubeビデオをダウンロードするためにphpチューブクラスを使用しています。YouTube ビデオの URL を送信すると、ビデオがフォルダに自動的にダウンロードされます。

ローカル (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

ローカルから取得したリンクをコピーしてブラウザーに貼り付けると、ダウンロード ボックスがブラウザーに表示されますが、サーバーから取得したリンクをコピーしてブラウザーに貼り付けると、空白のページのみが表示されます。

  1. 私の問題を解決してください、エラーはどこにありますか?
  2. pearがサーバーにインストールされているかどうかを知る方法は?
  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()サーバーでは string(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

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設定で変更することもできます。

お使いのサーバーとローカル マシンで異なると私が想像できる唯一のことは、サーバーが自分自身を別様に識別していることです。

ここでのもう 1 つのことは、YouTube がサーバー/ウェブ ホストによる動画のリクエストをブロックしている可能性があることです。あなたが共有ホストを使用していて、誰かが以前にこのようなことをしようとした場合、Google はそれを取り締まり、ホストの IP をブラックリストに載せた可能性があります。YouTube から FLV をダウンロードすること利用規約に違反しているため、これを行った可能性は十分にあります。

これが役立つことを願っています(再び)。

于 2010-04-11T14:28:20.703 に答える
0

ソースコードを解析したり、リンクを取得しようとするマシンの IP に関係があると思います。ローカル マシンでは、ページをプルするため、リンクの ip パラメータに IP が含まれます。リモート サーバーで行う場合、そのサーバの IP は ip パラメータに含まれ、マシンからダウンロードしようとします。 IPが一致しない場所。

私も同様の状況に直面しています。開発マシンでは問題ありませんが、ライブにするとすべてが無駄になります。私はそれを機能させる方法を理解しようとしています.atmで私が考えることができる最も簡単な/唯一のことは、javascriptを使用してクライアントで行うことです.

編集:

クライアントでajaxを使用してYouTubeページをリクエストするという私の考えは、別のドメインからリクエストできないため機能しません。

それを機能させるために私が考えることができる唯一の他の方法は、サーバーのIPに有効なダウンロードリンクをサーバーに取得させてからreadfile()、いくつかheader()のを使用してファイルのダウンロードをクライアントにプロキシすることです。これの大きな問題は、帯域幅のストリーミング ダウンロードをユーザーに完全に壊してしまうことです。

誰かがより良いアイデアを持っているかどうか知りたいですか?

于 2010-04-11T20:14:01.443 に答える