2

私のアプリケーションの 1 つで、YouTube ビデオの ID を保存しています...「A4fR3sDprOE」のように。そのタイトルをアプリケーションに表示する必要があります。タイトルを取得するための次のコードを取得しましたが、正常に動作しています。

問題は、エラーが発生した場合 (ビデオの削除の場合)、PHP がエラーを表示していることです。条件を追加しました。しかし、それでもエラーが表示されます。

foreach($videos as $video) {

    $video_id = $video->videos;
    if($content=file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id)) {
        parse_str($content, $ytarr);

        $myvideos[$i]['video_title']=$ytarr['title'];

    }
    else
        $myvideos[$i]['video_title']="No title";

    $i++;
}

return $myvideos;

エラーが発生した場合、次のように終了します。

重大度: 警告

メッセージ: file_get_contents( http://youtube.com/get_video_info?video_id=A4fR3sDprOE ) [function.file-get-contents]: ストリームを開くことができませんでした: HTTP 要求が失敗しました! HTTP/1.0 402 支払いが必要

ファイル名: models/webs.php

ライン番号: 128

4

7 に答える 7

11

リモート URL でfile_get_contents()を使用するのは安全ではありません。YouTube API 2.0 では代わりに cURL を使用します。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/feeds/api/videos/' . $video_id);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);
curl_close($ch);

if ($response) {
    $xml   = new SimpleXMLElement($response);
    $title = (string) $xml->title;
} else {
    // Error handling.
}
于 2012-03-12T09:44:05.510 に答える
6

これが私の解決策です。とても短いです。

$id = "VIDEO ID";
$videoTitle = file_get_contents("http://gdata.youtube.com/feeds/api/videos/${id}?v=2&fields=title");

preg_match("/<title>(.+?)<\/title>/is", $videoTitle, $titleOfVideo);
$videoTitle = $titleOfVideo[1];
于 2013-03-31T20:02:47.253 に答える
3

file_get_contentsの前にエラー制御演算子を使用すると機能する場合があります。

何かのようなもの:

if($content = @file_get_contents("http://youtube.com/get_video_info?video_id=" . $video_id))

エラーを削除し、それを使用してifステートメントでfalseを返す必要があります。

それ以外の場合は、try / catchステートメントを使用できます(例外を参照)。

try{
    // Code
}
catch (Exception $e){
    // Else code
}
于 2012-03-12T09:33:35.483 に答える
1

あなたのホスティング プロバイダーは、セキュリティ上の理由から file_get_contents を無効にしていると思います。cURLを使用する必要があります。

<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://youtube.com/get_video_info?video_id=" . $video_id);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    /* Parse YouTube's response as you like below */
?>
于 2012-03-12T09:36:57.917 に答える
1

試す:

// Use @ to suppress warnings
$content = @file_get_contents("http://youtube.com/get_video_info?video_id=" . $video_id);
if($content===FALSE) {
    .. Handle error here
}
else{
    ..The rest of your code
}
于 2012-03-12T09:38:31.723 に答える
1

ここに表示される特定のエラー (HTTP 402 - 支払いが必要です。それ以外の場合、サーバーが一般的に実装していない HTTP ステータス コードです) は、YouTube が「過剰な」金額と判断したときに返すものです。のトラフィックがあなたの IP アドレス (または IP アドレス範囲 - OVH の IP アドレス範囲を頻繁にブロックすることを楽しんでいます[1] [2] )から来ています。

そのため、(API ではなく) youtube.com にプログラムで (PHP などを使用して) アクセスしている場合、最終的にこのエラーが発生することがあります。YouTube は通常、「過剰なトラフィック」IP アドレスからのリクエストに CAPTCHA を提示することから始めますが、CAPTCHA を完了していない場合 (PHP スクリプトはそうではありません)、本質的に頼りなくこれらの役に立たない 402 応答に切り替えます - YouTube IP アドレスがブロックされているために Web サイトに実際にアクセスできない場合は、連絡を取る機会がさらに少なくなります。

その他の参照:
http://productforums.google.com/forum/#!topic/youtube/tR4WkNBPnUo http://productforums.google.com/forum/?fromgroups=#!topic/youtube/179aboankVg

于 2013-02-07T21:31:05.090 に答える