Получить название YouTube видео в PHP - PullRequest
2 голосов
/ 12 марта 2012

В одном из моих приложений я сохраняю идентификатор видео YouTube ... Как "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

Пожалуйста, помогите

Ответы [ 7 ]

11 голосов
/ 12 марта 2012

Не безопасно использовать file_get_contents () с удаленными URL-адресами.Вместо этого используйте cURL с Youtube API 2.0:

$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.
}
6 голосов
/ 01 апреля 2013

Это моё решение.Это очень коротко.

$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];
3 голосов
/ 12 марта 2012

работает ли использование @ ( php-manual ) перед file_get_contents?

что-то вроде:

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

должен устранить ошибку и использовать ее для возврата false в вашем операторе if

иначе вы можете просто использовать оператор try / catch ( php-manual )

try{
    // code
}catch (Exception $e){
    // else code
}
1 голос
/ 08 февраля 2013

Я хотел бы добавить к этому, что конкретная ошибка, наблюдаемая здесь (HTTP 402 - Требуется оплата, в противном случае это код состояния HTTP, который серверы обычно не реализуют), - это то, что возвращает YouTube, когда он определил, что "с вашего IP-адреса (или диапазона IP-адресов поступает чрезмерное количество трафика), они предпочитают часто блокировать диапазоны IP-адресов OVH [1] [2] ).

Поэтому, если вы обращаетесь к youtube.com (не к API) программно (используя PHP или иным способом), вы можете в конечном итоге столкнуться с этой ошибкой.Обычно YouTube начинает с представления CAPTCHA на запросы с IP-адресов с «избыточным трафиком», но если вы их не завершаете (чего не будет ваш PHP-скрипт), они переключатся на эти бесполезные 402 ответа практически без помощи - YouTube этого не делает.у вас точно нет службы поддержки клиентов, и если вы не можете получить доступ к любому из их веб-сайтов из-за блокировки IP-адресов, у вас еще меньше шансов связаться с ними.

Другие ссылки:
http://productforums.google.com/forum/#!topic/youtube/tR4WkNBPnUo http://productforums.google.com/forum/?fromgroups=#!topic/youtube/179aboankVg

1 голос
/ 12 марта 2012

Попробуйте:


//use @ to supress warnings
$content=@file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id);
if($content===FALSE) {
  ..handle error here
}
else{
  ..rest of your code
}

1 голос
/ 12 марта 2012

Я считаю, что ваш хостинг-провайдер отключил 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 */
?>
0 голосов
/ 20 декабря 2013

Мое решение:

$xmlInfoVideo    = simplexml_load_file("http://gdata.youtube.com/feeds/api/videos/".$videoId."?v=2&fields=title");

foreach($xmlInfoVideo->children() as $title) { $videoTitle = strtoupper((string) $title); }

Это название заголовка видео.

...