Получить название видео youtube на PHP



В одном из моих приложений я сохраняю идентификатор youtube video... Например, "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) [функция.file-get-contents]: не удалось открыть поток: HTTP-запрос не удался! HTTP / 1.0 402 требуется оплата



Имя файла: models/webs.php



Номер Строки: 128



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

806   7  

7 ответов:

Можно ли использовать @ (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
}

Небезопасно использовать 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.
}

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

$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];

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

Попробуйте:


//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
}

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

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

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

Мое решение таково:

$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); }

Это дает название видео.

Comments

    Ничего не найдено.