Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP检查YouTube上是否存在视频?_Php_Youtube - Fatal编程技术网

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

如何使用PHP检查YouTube上是否存在视频?,php,youtube,Php,Youtube,如何使用PHP检查YouTube上是否存在视频?是否要验证YouTube url是否是真实YouTube视频的url?这相当困难,您可以使用正则表达式,但请记住,有很多有效的方法可以表达youtube url: 等等 此外,视频代码还可以包含字母数字字符、下划线、-字符(不知道它们的名称)以及可能更多的字符。使用HEAD方法请求URL,如下所示: HEAD /watch?v=p72I7g-RXpg HTTP/1.1 Host: www.youtube.com

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

是否要验证YouTube url是否是真实YouTube视频的url?这相当困难,您可以使用正则表达式,但请记住,有很多有效的方法可以表达youtube url:

  • 等等

此外,视频代码还可以包含字母数字字符、下划线、-字符(不知道它们的名称)以及可能更多的字符。

使用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

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

有关更多信息:

这似乎很有趣:如果您向如下URL发送请求:

http://gdata.youtube.com/feeds/api/videos/videoID
(当然,将“videoID”替换为视频的ID—“GeppLPQtihA”,在您的示例中),如果视频有效,您将获得一些ATOM提要;如果不是,则为“无效id”



而且,我坚持认为:这样一来,您依赖于一个有文档记录的API,而不是依赖于今天存在的某种行为,但这种行为无法保证。

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

Youtube支持该格式。
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 与Pascal MARTIN提供的xml响应相比,mine只需下载600字节,而不是3800字节,这使得它的速度更快,占用的带宽更少(仅为大小的1/6)


正如@dbro所评论的,当时的答案是可以接受的。然而,由于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={视频的id}&key={your的api}&part={parts}

其中

  • {视频的\u id\u}
    你应该知道这是什么

  • {your_api_key}
    是可以在

  • {parts}
    使用逗号分隔的列表,检查有效值
现在看看结果 如果视频Id有效,您将在项目字段中获得数据,其中包括视频Id和通过零件参数查询的信息

如果视频Id无效,则您将获得一个空的项目

提供错误的键会导致错误400(错误对象)

链接:


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

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

您应该请求访问此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;
            };
        }
    );
    ...
}
对于
uploadStatus

删除、失败、处理、拒绝、上载


对于
上传状态
=
已处理
上传
=>您的youtube视频可用

在github上找到此解决方案:

易于使用:

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

工作正常。

这里有一个使用HEAD请求方法的快速解决方案

检查您的YouTube URL,如下所示:


这是一个不涉及使用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;
}

希望对你有所帮助,这里有一个解决方案,我使用视频id检查YouTube视频是否存在。这是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;
    }
私有异步任务存在(字符串id)
{
var httpClient=新的httpClient();
var video=wait httpClient.GetAsync($)https://img.youtube.com/vi/{id}/0.jpg”);
返回video.issucessStatusCode;
}


请更加精确。你认为一个有效的YouTube URL是什么?我想他是想检查视频是否存在,或者更简单的方法是从YouTube的OEMAP页面得到响应,这是一个标准:EX:这个API版本(V2)在2014年3月4日被否决,现在不可用了。您应该改为使用此请求:您是否知道与此等效的方法?此方法已被折旧,请更新您的答案。API不再可用。此选项不再可用。我使用了Giacomo的选项来检查Youtube的视频是否可用。Youtube即使对于不存在的视频也会返回200,只要id看起来正确。我也在添加控件401。。如果不是嵌入式视频,这是太必须控制。。。如果(substr($headers[0],9,3)!==“404”| | substr($headers[0],9,3)!==“401”){这是最快的方法。没有API注册,只是一个简单的请求。Thx!这就是我需要的!谢谢。这应该是所有检查youtube视频存在问题的最佳答案。一个更干净的方法可以是`list($protocol,$statusCode,$statusMsg)=explode(“”,$headers[0]);return$statusCode==='200';`这不再受支持,感谢您的建议,在每个视频中都会出现“不再可用”的结果。尝试更具体一点:)对同一IP有任何限制吗?请注意,这不适用于不可嵌入的视频,如
http://www.youtube.com/watch?v=MCs5OvhV9S4
(请参阅:)这一个无法检测视频是否从youtube上删除,这与问题无关。我将此方法与oembed方法进行了比较。看,这太棒了!喜欢图表与oembed方法的比较。
$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";
}
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;
}
if (check_remote_video_exists('YOUR_YOUTUBE_VIDEO_URL')) {
    // video exists, do stuff
} else {
    // video does not exist, do other stuff
}
function checkYoutubeUrlIsValid($url) {
    $buffer = file_get_contents($url);
    $matches = [];
    preg_match('#[a-zA-Z0-9_-]{11}$#', $url, $matches);

    return strpos($buffer, $matches[0]) !== false;
}
    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;
    }