Получить название видео 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
Пожалуйста, помогите
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