Подтвердить что ты не робот

Как проверить, существует ли видео на YouTube, используя PHP?

Как проверить, существует ли видео на YouTube, используя PHP?

4b9b3361

Ответ 1

Как насчет использования API YouTube?
В конце концов, это будет означать использование некоторого официального сообщения, которое с меньшей вероятностью изменится, чем при анализе некоторой HTML-страницы.

Для получения дополнительной информации: API и инструменты YouTube - Руководство разработчика: PHP

Получение определенной записи видео кажется довольно интересным: если вы отправляете запрос на URL-адрес, подобный следующему:

http://gdata.youtube.com/feeds/api/videos/videoID

(заменив "videoID" на идентификатор видео, конечно же - "GeppLPQtihA" в вашем примере), вы получите некоторую ленту ATOM, если видео действительно; и "Неверный идентификатор", если он не


И я настаиваю: таким образом, вы полагаетесь на документированный API, а не на какое-то поведение, которое существует сегодня, но не гарантировано.

Ответ 2

Youtube поддерживает формат oEmbed.
По сравнению с xml-ответом, предоставленным Pascal MARTIN, мне нужно только загрузить 600 байт против 3800 байт, что делает его более быстрым и снижает пропускную способность (только 1/6 от размера).

function yt_exists($videoID) {
    $theURL = "http://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=$videoID&format=json";
    $headers = get_headers($theURL);

    return (substr($headers[0], 9, 3) !== "404");
}

$id = 'yyDUC1LUXSU'; //Video id goes here

if (yt_exists($id)) {
    //  Yep, video is still up and running :)
} else {
    //  These aren't the droids you're looking for :(
}

Ответ 3

Запросите URL-адреса с помощью метода HEAD, например:

HEAD /watch?v=p72I7g-RXpg HTTP/1.1
Host: www.youtube.com                         

HTTP/1.1 200 OK
[SNIP]


HEAD /watch?v=p72I7g-BOGUS HTTP/1.1
Host: www.youtube.com              

HTTP/1.1 303 See Other
[SNIP]
Location: http://www.youtube.com/index?ytsession=pXHSDn5Mgc78t2_s7AwyMvu_Tvxn6szTJFAbsYz8KifV-OP20gt7FShXtE4gNYS9Cb7Eh55SgoeFznYK616MmFrT3Cecfu8BcNJ7cs8B6YPddHQSQFT7fSIXFHd5FmQBk299p9_YFCrEBBwTgtYhzKL-jYKPp2zZaACNnDkeZxCr9JEoNEDXyqLvgbB1w8zgOjJacI4iIS6_QvIdmdmLXz7EhBSl92O-qHOG9Rf1HNux_xrcB_xCAz3P3_KbryeQk_9JSRFgCWWgfwWMM3SjrE74-vkSDm5jVRE3ZlUI6bHLgVb7rcIPcg

Ответ 4

Как прокомментировал @dbro, ответ на Pascal MARTIN был приемлемым ответом на тот момент. Однако, поскольку API продвинулся вперед, исправлен и улучшен, новое решение работает следующим образом. Пожалуйста, обратите внимание, что это основано на технике, предоставляемой @Pascal, и я цитирую:

...if you send a request to an URL like this one

http://gdata.youtube.com/feeds/api/videos/videoID
(Replacing "videoID" by the idea of the video, of course -- "GeppLPQtihA" in your example)

You'll get some ATOM feed (**STOP HERE**)

Новый URL-адрес для использования V3 API https://www.googleapis.com/youtube/v3/videos?id={the_id_of_the_video}&key={your_api_key}&part={parts}

WHERE

  • {the_id_of_the_video} вы должны знать, что это такое

  • {your_api_key} - это ваш ключ приложения, который можно найти в Консоль разработчика

  • {parts} список, разделенный запятыми, отметьте здесь для допустимых значений

Теперь для результата

Если Идентификатор видео имеет значение VALID, вы получите данные в поле items, которое включает в себя идентификатор видео и информацию, запрошенную через параметр деталей.

Если Идентификатор видео не имеет значения VALID, вы получите пустые элементы.

Поставка неправильной клавиши дает ERROR 400 (объект ошибки).

Ответ 5

Вы должны запросить этот URL

https://www.googleapis.com/youtube/v3/videos?id={the_id_of_the_video}&key={your_api_key}&part=status

После этого вы получите ответ json, который содержит поле uploadStatus

{
    etag = "\"I_8xdZu766_FSaexEaDXTIfEWc0/8QgL7Pcv5G8OwpNyKYJa8PaQTc0\"";
    items =     (
                {
            ...
            status =             {
                embeddable = 1;
                license = youtube;
                privacyStatus = public;
                publicStatsViewable = 1;
                uploadStatus = processed;
            };
        }
    );
    ...
}

И есть 5 возможных значений для uploadStatus

удалено, не выполнено, обработано, отклонено, загружено

Для uploadStatus= processed или uploaded = > доступно ваше видео youtube

Ответ 6

Нашел это решение на github: Проверьте, существует ли видео на YouTube

Простота в использовании:

$headers = get_headers('http://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=nonexistingid');

if (!strpos($headers[0], '200')) {
    echo "The YouTube video you entered does not exist";
}

Работает нормально.

Ответ 7

Вот решение, которое не связано с использованием API YouTube, оно проверяет, существует ли идентификатор видео при загрузке URL-адреса

function checkYoutubeUrlIsValid($url) {
    $buffer = file_get_contents($url);
    $matches = [];
    preg_match('#[a-zA-Z0-9_-]{11}$#', $url, $matches);

    return strpos($buffer, $matches[0]) !== false;
}

Надеюсь, это поможет

Ответ 8

Вы хотите проверить, является ли URL-адрес youtube URL-адресом реального видео на YouTube. Это довольно сложно, вы можете использовать регулярные выражения, но имейте в виду, что существует масса допустимых способов выражения URL-адреса youtube:

Также видеокод может содержать буквенно-цифровые символы, символы подчеркивания, -символы (не знаю, что они называются) и, возможно, больше.

Ответ 9

Другим (неэффективным) способом является использование cURL для получения HTML предполагаемой видеостраницы и запуск некоторых регулярных выражений, чтобы убедиться, что это фактическая страница видео.

Ответ 10

http://www.youtube.com/watch?v=bQVoAWSP7k4  
http://www.youtube.com/watch?v=bQVoAWSP7k4&feature=popular  
http://www.youtube.com/watch?v=McNqjYiFmyQ&feature=related&bhablah  
http://youtube.com/watch?v=bQVoAWSP7k4
var matches = $('#videoUrl').val().match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/);
if (matches) {
    alert('valid');
} else {
    alert('Invalid');
}

Ответ 11

/**
* Check youtube url, check video exists or not,
*
* @param $url full youtube video url
*
* @return string - yotube video id
*/  
public static function checkYoutube($url) 
{
    if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) 
    {   
        $headers = get_headers('http://gdata.youtube.com/feeds/api/videos/' . $match[1]);

        if (strpos($headers[0], '200')) 
        {
            return $match[1];
        } 

        return false;   
    } 

    return false;
} 

ссылка:

https://github.com/DimitriMikadze/php-helpers

Ответ 12

Я использовал API YouTube для проверки наличия видео на You Tube. Я загрузил клиентскую библиотеку API Google для PHP. Я использовал следующую функцию:

/**
* Used to check if the given movie is availabe on youtube
*
* It uses youtube api and checks if given movie is available on youtube
* If a movie is not available then it returns false
*
* @param string $youtube_video_url the youtube movie url
*
* @return boolean $is_available indicates if the given video is available on youtube
*/
private function IsMovieAvailable($youtube_video_url)
{
    /** The autoload.php file is included */
    include_once("autoload.php");

    /** Is available is set to false */
    $is_available = false;

    /** The youtube video id is extracted */
    $video_id = str_replace("https://www.youtube.com/watch?v=", "",   $youtube_video_url);

   $DEVELOPER_KEY = $google_api_key;
   $client = new \Google_Client();
   $client->setDeveloperKey($DEVELOPER_KEY);

   // Define an object that will be used to make all API requests.
   $youtube = new \Google_Service_YouTube($client);

   // Call the search.list method to retrieve results matching the specified
   // query term.
   $searchResponse = $youtube->videos->listVideos('status', array('id' => $video_id));

   /** Each item in the search results is checked */
   foreach ($searchResponse['items'] as $video) {
       /** If the video id matches the given id then function returns true  */
       if ($video['id'] == $video_id) {
           $is_available = true;
           break;
       }
    }
    return $is_available;
}

Ответ 13

Здесь быстрое, простое, быстрое решение с использованием метода запроса HEAD.

function check_youtube_video_exists($video_url) {

    if (strpos($video_url, 'youtube.com') > 0 || strpos($video_url, 'youtu.be') > 0) {
        $video_url = 'https://www.youtube.com/oembed?url='. $video_url .'&format=json';
    }

    $headers = @get_headers($video_url);

    return (strpos($headers[0], '200') > 0) ? true : false;
}

Проверьте свой URL YouTube следующим образом:

if (check_remote_video_exists('YOUR_YOUTUBE_VIDEO_URL')) {
    // video exists, do stuff
} else {
    // video does not exist, do other stuff
}