使用 youtube api v3 验证视频是不是存在

Posted

技术标签:

【中文标题】使用 youtube api v3 验证视频是不是存在【英文标题】:verify if video exist with youtube api v3使用 youtube api v3 验证视频是否存在 【发布时间】:2015-05-23 20:30:58 【问题描述】:

我正在尝试使用 youtube api V3 验证 youtube 视频(带有 id_video)是否有效/存在。这就是我所做的(y2oy7b4SFgE 是我测试的视频的 id):

$file_headers = @get_headers('https://www.googleapis.com/youtube/v3/videos?part=id&id=y2oy7b4SFgE&key=ma_clé_api_publique');
   //exit(var_dump($file_headers));
if ($file_headers[0] == 'HTTP/1.0 200 OK') 
  $resultat = $file_headers[0].'Goood'
 else 
  $resultat = $file_headers[0].'PasGoood'

但我有一个“代码”:403, "message": "在您的 API 密钥上配置了 per-IP 或 per-Referer 限制,并且请求与这些限制不匹配。如果来自此 IP 或引用者的请求应该使用 Google Developers Console 更新您的 API 密钥配置被允许。”

它在没有推荐人的情况下运作良好。但是当我放一个时,我尝试使用我的网站名称或我的 vps 服务器的 ip,每次都不起作用。

【问题讨论】:

【参考方案1】:

你找到解决办法了吗?

官方的方式是使用videos.list并提交video id。文档提到了以下错误,但从未抛出:

“notFound (404) videoNotFound 无法找到您尝试检索的视频。请检查请求的 id 参数的值以确保它是正确的。”

https://developers.google.com/youtube/v3/docs/videos/list?hl=de

【讨论】:

【参考方案2】:

我忘记写了。这是我找到的解决方案,并认为这是最好的方法,因为谷歌喜欢控制所有。您必须在谷歌控制台中创建一个公钥,就像谷歌知道是您的网站要求他验证视频并且他可以向您收取一些配额。

我执行以下操作并验证标头代码:

$file_headers = @get_headers('https://www.googleapis.com/youtube/v3/videos?part=id&id='. $id_video .'&key='.$publicKey);

if ($file_headers[0] == 'HTTP/1.0 200 OK') 
    $datavideo = file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=id&id='. $id_video .'&key='. $publicKey);
    $data = json_decode($datavideo);
    if ($data->items)
        $this->idvideo = $id_video;
    else
        ...

 else 
    ...

希望对我有帮助:D

【讨论】:

该 url 将返回 200 和一个空的 items 对象,而不是 404 或类似的。 嗨,哈利,你给我打了-1!? :) 实际上我在帖子中问的是知道视频是否存在 -> 我提出的解决方案对此有好处!现在我已经完成了我的帖子,其中包含可以访问视频数据的代码,如果你需要的话......现在对你有好处吗? :) 该解决方案不起作用。您的代码检查 200 标头,但该端点将始终返回 200 标头。此外,该端点返回一个数组,而不是您建议的对象。使用您的方法知道视频是否无效的唯一方法是检查项目的长度。我没有减1你,但答案无效。【参考方案3】:

我知道有两种方法可以使用 YouTube 视频 ID 检查视频是否存在。

最简单的方法是使用视频的 oembed url。这不需要身份验证,并在视频无效时返回 404 标头。你真的应该用 curl 来做这件事,因为取决于你的设置 file_get_contents 可能不是你的选择......

$headers = get_headers('https://www.youtube.com/oembed?format=json&url=http://www.youtube.com/watch?v=' . $videoID);

if(is_array($headers) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$headers[0]) : false)
    // video exists
 else 
    // video does not exist

第二种是使用V3 of the data api。要使用此方法,您需要在开发者控制台中生成一个 api 密钥。

$response = file_get__contents('https://www.googleapis.com/youtube/v3/videos?part=id&id=' . $videoID . '&key=' . $apiPublicKey);
$json = json_decode($response);

if (sizeof($json['items'])) 
    // video exists
 else 
    // video does not exist

【讨论】:

嗨@user3417911 - 希望这现在足够流行,可以用勾号标记为正确答案? 谢谢,我有同样的问题,这段代码似乎适用于我遇到的大多数视频。但是,当我输入此代码:“5B7QBjORgR8”时,该函数说该视频不存在,但我可以清楚地看到该视频已在 Youtube 上播放。【参考方案4】:

这是我的解决方案。在向 API 发出请求之前,您必须从谷歌开发者控制台生成服务器密钥。

$youtubeApiKey = 'YOUR_KEY';

function checkVideoWorking($videoID) 
    global $youtubeApiKey;

    $url = sprintf("https://www.googleapis.com/youtube/v3/videos?part=id&id=%s&key=%s", $videoID, $youtubeApiKey);

    $response = file_get_contents($url);

    $working = true;
    $decoded = json_decode($response, true);

    if ($decoded['pageInfo'] && $decoded['pageInfo']['totalResults'] == 0) 
        $working = false;
    

    return $working;

【讨论】:

【参考方案5】:

php 中,验证视频是否存在非常简单。 使用 PHP 函数 file_get_contents 检查视频是否存在。

general Video URL to check a video would be
$video_url = https://www.youtube.com/oembed?format=json&url=http://www.youtube.com/watch?v=VideoId

$video_url = @file_get_contents('https://www.youtube.com/oembed?format=json&url=http://www.youtube.com/watch?v=Xu4MTv5wgys');
if($video_url) 
    echo('video exists');
 else 

    echo('video does not exists');

;

【讨论】:

以上是关于使用 youtube api v3 验证视频是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

YouTube API v3 - 确定用户是不是观看过视频?

YouTube API v3.0:如何确定视频是不是为“按次付费”?

未经用户同意使用 youtube Data API V3 将视频自动上传到我的帐户

YouTube Data API V3:获取多个 videoCategoryId 视频

YouTube API v3 - 直接上传到自己的频道

YouTube API v3 - 我真的需要使用 OAuth 进行基本的读取操作吗?