1

YouTube のタイトルと YouTube の説明を同じコードから取得していましたが、現在は機能していません。次のエラーが発生しています。

警告: DOMDocument::load() [domdocument.load]: http:// ラッパーは、16 行目の /home/colorsfo/public_html/zaroorat/admin/pages/addSongProcess.php の allow_url_fopen=0 によってサーバー構成で無効になっています

警告: DOMDocument::load(http://gdata.youtube.com/feeds/api/videos/Y7G-tYRzwYY) [domdocument.load]: ストリームを開くことができませんでした: /home/colorsfo/ に適切なラッパーが見つかりませんでしたpublic_html/zaroorat/admin/pages/addSongProcess.php の 16 行目

警告: DOMDocument::load() [domdocument.load]: I/O 警告: 外部エンティティ "http://gdata.youtube.com/feeds/api/videos/Y7G-tYRzwYY" を /home/colorsfo に読み込めませんでした/public_html/zaroorat/admin/pages/addSongProcess.php 16 行目

................................................... Youtube ビデオ データを取得するために、次のコーディングが使用されます。

$url = "http://gdata.youtube.com/feeds/api/videos/".$embedCodeParts2[0]; $doc = new DOMDocument; @$doc->load($url); $title = $doc->getElementsByTagName("title")->item(0)->nodeValue; $videoDescription = $doc->getElementsByTagName("description")->item(0)->nodeValue;

以前は機能していましたが (このコーディングはローカル サーバーでは正常に機能していますが、インターネットでは機能していません)、現在は機能していません。このエラーを修正する方法を教えてください。御時間ありがとうございます。

4

3 に答える 3

3

サーバーの allow_url_fopen が無効になっています (私の場合も同様です)。あなたの痛みが分かります。これが私がしたことです。

cURLを使用してみてください。ただし、YouTube の v2 API を使用して、json でデータを返します。これを行うには、そのデータを URL の末尾に追加します。

?v=2&alt=json

YouTube ID を取得する方法を投稿していません。それが問題の一部である可能性があります (ただし、サンプル URL は機能しました)。念のため、YouTube 動画の URL から ID を取得する簡単な関数も投稿します。

function get_youtube_id($url) {
    $newurl = parse_url($url);
    return substr($newurl['query'],2);
}

ビデオ ID があると仮定すると、返したいフィールドごとに次の関数を実行できます。

// Grab JSON and format it into PHP arrays from YouTube.
// Options defined in the switch. No option returns entire array
// Example of what the returned JSON will look like, pretty, here:
// http://gdata.youtube.com/feeds/api/videos/dQw4w9WgXcQ?v=2&alt=json&prettyprint=true
function get_youtube_info ( $vid, $info ) {
    $youtube = "http://gdata.youtube.com/feeds/api/videos/$vid?v=2&alt=json";
    $ch = curl_init($youtube);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);

    //If $assoc = true doesn't work, try:
    //$output = json_decode($output, true);
    $output = json_decode($output, $assoc = true);

    //Add the ['feed'] in if it exists.
    if ($output['feed']) {
        $path = &$output['feed']['entry'];
    } else {
        $path = &$output['entry'];
    }

    //set up a switch to return various data bits to return.
    switch($info) {
        case 'title':
            $output = $path['title']['$t'];
            break;
        case 'description':
            $output = $path['media$group']['media$description']['$t'];
            break;
        case 'author':
            $output = $path['author'][0]['name'];
            break;
        case 'author_uri':
            $output = $path['author'][0]['uri'];
            break;
        case 'thumbnail_small':
            $output = $path['media$group']['media$thumbnail'][0]['url'];
            break;
        case 'thumbnail_medium':
            $output = $path['media$group']['media$thumbnail'][2]['url'];
            break;
        case 'thumbnail_large':
            $output = $path['media$group']['media$thumbnail'][3]['url'];
            break;
        default:
            return $output;
            break;
    }
    return $output;
}

$url = "http://www.youtube.com/watch?v=oHg5SJYRHA0";
$id = get_youtube_id($url);

echo "<h3><a href=" . $url . ">" . get_youtube_info($id, 'title') . "</a></h3>"; //echoes the title
echo "<p><a href=" . $url . "><img style='float:left;margin-right: 5px;' src=" . get_youtube_info($id, 'thumbnail_small') . " /></a>" . get_youtube_info($id, 'description') . "</p>"; //echoes the description
echo "<br style='clear:both;' /><pre>";
echo print_r(get_youtube_info($id));
echo "</pre>";
于 2012-12-09T10:43:10.917 に答える
0

DOMDocuments の load() 関数は、PHP の fopen ラッパーを使用してファイルを取得します。あなたのウェブサーバーでallow_url_fopenは が 0 に設定されているため、これらのラッパーが無効になっているようです。スクリプトの先頭に次の行を追加してみてください。

ini_set ('allow_url_fopen', 1);

更新:これを試してください:

<?php
$url = "http://gdata.youtube.com/feeds/api/videos/" . $embedCodeParts2[0];

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$file = curl_exec($ch);

curl_close($ch);

$doc = new DOMDocument;
@$doc->loadHTML($file);
$title = $doc->getElementsByTagName("title")->item(0)->nodeValue;
$videoDescription = $doc->getElementsByTagName("description")->item(0)->nodeValue;
于 2012-05-11T12:55:37.787 に答える
0

手遅れにならないことを願っています。私の解決策は、Linux マシンで /etc/resolv.conf を編集し、最初の行を以下の行に置き換えることです。

ネームサーバー 8.8.8.8

次に、ファイルを保存します。サービスを再起動する必要はありません。

セキュリティのために一部の機能を誤って無効にしたサーバーで機能する可能性があります。

于 2014-09-28T12:50:14.557 に答える