24

如何使用 PHP 检查 YouTube 上是否存在视频?

4

15 回答 15

45

Youtube 支持oEmbed格式。
与 Pascal MARTIN 提供的 xml 响应相比,我的只需下载 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 :(
}
于 2014-01-12T00:48:54.253 回答
41

使用 Youtube 的 API怎么样?
毕竟,这意味着使用一些官方,这比解析一些 HTML 页面更不可能改变。

有关更多信息:YouTube API 和工具 - 开发人员指南:PHP

检索特定视频条目似乎很有趣:如果您向这样的 URL 发送请求:

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

(将“videoID”替换为视频的 ID,当然——在您的示例中为“GeppLPQtihA”),如果视频有效,您将获得一些 ATOM 提要;如果不是,则为“无效的 ID”


而且,我坚持:这种方式,您依赖于文档化的 API,而不是今天存在的某种行为,但不能保证。

于 2009-09-05T11:30:30.373 回答
3

这是我用来检查 YouTube 视频是否存在使用视频 ID 的解决方案。这是C#代码,但基本上你可以检查视频的缩略图是否存在,你会得到200或404,非常方便。

    private async Task<bool> VideoExists(string id)
    {
        var httpClient = new HttpClient();
        var video = await httpClient.GetAsync($"https://img.youtube.com/vi/{id}/0.jpg");
        return video.IsSuccessStatusCode;
    }
于 2020-02-02T20:51:29.193 回答
2

使用 HEAD 方法请求 URL,如下所示:

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
于 2009-09-05T11:28:03.797 回答
1

你应该请求这个 URL

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

之后,您将收到包含uploadStatus字段的响应 json

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

并且有 5 个可能的值uploadStatus

已删除、失败、已处理、已拒绝、已上传

对于uploadStatus=processeduploaded=> 您的 youtube 视频可用

于 2016-08-10T04:29:49.660 回答
1

在 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";
}

工作正常。

于 2018-06-26T22:24:32.750 回答
1

正如@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**)

用于API V3的新 URL 是https://www.googleapis.com/youtube/v3/videos?id={the_id_of_the_video}&key={your_api_key}&part={parts}

在哪里

  • {the_id_of_the_video}你应该知道这是什么

  • {your_api_key}是您的应用程序的密钥,可以在您的开发者控制台中找到

  • {parts}逗号分隔的列表,在此处检查有效值

现在看结果

如果Video Id 为 VALID ,您将在items字段中获得数据,其中包括视频的 Id 和您通过parts参数查询的信息。

如果视频 ID 无效,那么您将得到一个空项目

提供一个错误的会给你一个ERROR 400(一个错误对象)。

于 2015-07-15T09:46:22.827 回答
1

这是一个不涉及使用 youtube api 的解决方案,它在加载 url 时检查视频 id 是否存在

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

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

希望有帮助

于 2019-03-22T09:08:59.013 回答
1

在2021 年 9 月之后获取 YouTube 视频数据的一种新方法是通过 PHP 中的 cURL:

function getYouTubeData($videoId) {
    $theURL = "https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=$videoId&format=json";

    $curl = curl_init($theURL);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    $body = curl_exec($curl);
    curl_close($curl);

    return json_decode($body, true);
}

用法:

$ytData = getYouTubeData($video_id);

if (empty($ytData)) {
    $error = 'YouTube movie data could not be fetched.';
}
$title = $ytData['title'];

样本输出:

Array
(
    [title] => Use online tools available at Laminas Starter Kit - Laminas MVC
    [author_name] => Divix
    [author_url] => https://www.youtube.com/channel/UC6lBQpNdQH6cu0j15qhkCAg
    [type] => video
    [height] => 113
    [width] => 200
    [version] => 1.0
    [provider_name] => YouTube
    [provider_url] => https://www.youtube.com/
    [thumbnail_height] => 360
    [thumbnail_width] => 480
    [thumbnail_url] => https://i.ytimg.com/vi/LjDdAcB9-Mo/hqdefault.jpg
    [html] => <iframe width="200" height="113" src="https://www.youtube.com/embed/LjDdAcB9-Mo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
)

于 2021-09-22T12:47:32.087 回答
0

您想验证 youtube 网址是否是真实 youtube 视频的网址?这很难,您可以使用正则表达式,但请记住,有很多有效的方式来表达 youtube url:

视频代码也可以包含字母数字字符、下划线、-characters(不知道它们叫什么),可能还有更多。

于 2009-09-05T11:18:08.603 回答
0
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');
}
于 2011-05-07T06:40:15.823 回答
0

另一种(一种低效的)方法是使用 cURL 来获取假定视频页面的 HTML 并运行一些正则表达式来验证它是一个实际的视频页面。

于 2009-09-05T14:24:32.990 回答
0
/**
* 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

于 2015-08-07T21:24:11.883 回答
0

我使用 YouTube API 来检查 YouTube 上是否存在视频。我下载了适用于 PHP 的 Google API 客户端库。我使用了以下功能:

/**
* 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;
}
于 2016-02-11T17:00:49.977 回答
0

这是使用 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;
}

检查您的 YouTube 网址,如下所示:

if (check_remote_video_exists('YOUR_YOUTUBE_VIDEO_URL')) {
    // video exists, do stuff
} else {
    // video does not exist, do other stuff
}
于 2019-02-09T04:12:56.813 回答