通过 JSON 获取 Javascript 中单个视频(非提要)的 Youtube 信息

Posted

技术标签:

【中文标题】通过 JSON 获取 Javascript 中单个视频(非提要)的 Youtube 信息【英文标题】:Get Youtube information via JSON for single video (not feed) in Javascript 【发布时间】:2012-04-21 10:31:02 【问题描述】:

所以我试图通过 JSON 格式从单个 youtube 视频中获取信息。像标题描述类别一样,除了 cmets 之外我能得到的任何东西。我正在尝试在 javascript 中执行此操作。我注意到下面的链接,但他们的所有示例都是如何从提要中获取视频信息。假设我知道它的 ID,我想从单个视频中获取信息。

https://developers.google.com/youtube/2.0/developers_guide_json

我也在看这个*** Question,但我对它所说的获取请求有疑问 “test.js(第 10 行) 获取http://gdata.youtube.com/feeds/api/videos/VA770w...v=2&alt=json-in-script&callback=listInfo

200 正常 9ms"

简而言之,如果我有一个像 VA770wpLX-Q 这样的 youtube 视频 ID,那么在 JSON 中获取该视频信息的 url 是什么样的?

谢谢

【问题讨论】:

发布你尝试过的jquery代码 嘿 jquery 不是我的问题,我只是想不出正确的 url 或模式来获取 json 数据。下面的答案为我指明了正确的方向 【参考方案1】:

2015 年 5 月更新:

此解决方案无法正常工作,YouTube API v2 正在处理中,即将停用。

更多信息请访问: https://www.youtube.com/devicesupport


试试这样的:

var video_id='VA770wpLX-Q';

$.getJSON('http://gdata.youtube.com/feeds/api/videos/'+video_id+'?v=2&alt=jsonc',function(data,status,xhr)
    alert(data.data.title);
    // data contains the JSON-Object below
);

演示:http://jsfiddle.net/wqwxg/

返回的 JSON 如下所示:


    "apiVersion": "2.1",
    "data": 
        "id": "VA770wpLX-Q",
        "uploaded": "2011-02-24T22:31:02.000Z",
        "updated": "2012-04-08T21:37:06.000Z",
        "uploader": "drdrevevo",
        "category": "Music",
        "title": "Dr. Dre - I Need A Doctor (Explicit) ft. Eminem, Skylar Grey",
        "description": "Music video by Dr. Dre performing I Need A Doctor featuring Eminem and Skylar Grey (Explicit). © 2011 Aftermath Records",
        "tags": ["Dr", "Dre", "Eminem", "New", "Song", "Skylar", "Grey", "GRAMMYs", "Dr.", "Need", "Doctor", "video", "Eazy", "N.W.A.", "NWA", "easy", "drdre", "and", "em"],
        "thumbnail": 
            "sqDefault": "http://i.ytimg.com/vi/VA770wpLX-Q/default.jpg",
            "hqDefault": "http://i.ytimg.com/vi/VA770wpLX-Q/hqdefault.jpg"
        ,
        "player": 
            "default": "http://www.youtube.com/watch?v=VA770wpLX-Q&feature=youtube_gdata_player"
        ,
        "content": 
            "5": "http://www.youtube.com/v/VA770wpLX-Q?version=3&f=videos&app=youtube_gdata"
        ,
        "duration": 457,
        "aspectRatio": "widescreen",
        "rating": 4.902695,
        "likeCount": "430519",
        "ratingCount": 441253,
        "viewCount": 88270796,
        "favoriteCount": 306556,
        "commentCount": 270597,
        "status": 
            "value": "restricted",
            "reason": "requesterRegion"
        ,
        "restrictions": [
            "type": "country",
            "relationship": "deny",
            "countries": "DE"
        ],
        "accessControl": 
            "comment": "allowed",
            "commentVote": "allowed",
            "videoRespond": "allowed",
            "rate": "allowed",
            "embed": "allowed",
            "list": "allowed",
            "autoPlay": "denied",
            "syndicate": "allowed"
        
    

【讨论】:

url = "gdata.youtube.com/feeds/api/videos/NWHfY_lvKIQ?v=2&alt=json" 你就是这样做的。 NWHfY_lvKIQ 是视频的 ID。之后,您可以执行 $.getJSON(url, function(data) 并从那里获取 json 我想问一下如何以 HH:MM:ss 格式获取持续时间,因为在 json 文件中它是在秒中,有没有任何函数可以做到这一点!! 不再支持"error":"code":410,"message":"No longer available"【参考方案2】:

2018 年更新

API v2 已弃用。新的 youtube api v3 仅适用于开发者令牌,并且有免费连接限制。

您可以在没有 API 的情况下获取 JSON:

http://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=ojCkgU5XGdg&format=json

或xml

http://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=ojCkgU5XGdg&format=xml

新的 2018 json 响应有


  "html": "<iframe width=\"480\" height=\"270\" src=\"https://www.youtube.com/embed/ojCkgU5XGdg?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>",
  "title": "Creativity and Drugs (Eng Sub)",
  "thumbnail_height": 360,
  "provider_name": "YouTube",
  "author_url": "https://www.youtube.com/user/serebniti",
  "thumbnail_width": 480,
  "height": 270,
  "provider_url": "https://www.youtube.com/",
  "type": "video",
  "width": 480,
  "version": "1.0",
  "author_name": "serebniti",
  "thumbnail_url": "https://i.ytimg.com/vi/ojCkgU5XGdg/hqdefault.jpg"

点赞:

hqdefault.jpg 质量较差,但始终存在。

http://img.youtube.com/vi/ojCkgU5XGdg/hqdefault.jpg

http://img.youtube.com/vi/ojCkgU5XGdg/sddefault.jpg

最大尺寸

https://i.ytimg.com/vi/ojCkgU5XGdg/maxresdefault.jpg

小拇指:

http://img.youtube.com/vi/ojCkgU5XGdg/0.jpg
http://img.youtube.com/vi/ojCkgU5XGdg/1.jpg
http://img.youtube.com/vi/ojCkgU5XGdg/2.jpg
http://img.youtube.com/vi/ojCkgU5XGdg/3.jpg

注释

http://www.youtube.com/annotations_invideo?cap_hist=1&video_id=ojCkgU5XGdg

解析移动页面 16kb

https://m.youtube.com/watch?v=ojCkgU5XGdg

别忘了把用户代理改成ios / Safari 7

http://www.youtube.com/get_video_info?html5=1&video_id=ojCkgU5XGdg

还有如何嵌入 youtube live

https://www.youtube.com/embed/live_stream?channel=UCkA21M22vGK9GtAvq3DvSlA

UCkA21M22vGK9GtAvq3DvSlA 是您的频道 ID。 您可以在 YouTube 帐户中的“我的频道”链接中找到它。

实时拇指

https://i.ytimg.com/vi/W-fSCPrYSL8/hqdefault_live.jpg

【讨论】:

遗憾的是oembed不支持jsonp(即带回调),所以在浏览器中跨域使用会出现问题。 @BlaM 我可以用 jsonp learn.jquery.com/ajax/working-with-jsonp 加载它,但 jQuery 无法解析响应。 :-( 这就是我的意思。 YouTube 服务器不支持为这些 oembed 发送 JSONP。 @Alexufo 您可以使用您的网站后端来代理该连接。这样它就可以工作了 但是没有持续时间信息【参考方案3】:

在 v3 中:

$.getJSON('https://www.googleapis.com/youtube/v3/videos?id=videoId&key=myApiKey&part=snippet&callback=?',function(data)

 if (typeof(data.items[0]) != "undefined") 
     console.log('video exists ' + data.items[0].snippet.title);
    else 
     console.log('video not exists');
    
);

通过服务器端响应@Jonathan,使用 php 和 CURL:

$url = "https://www.googleapis.com/youtube/v3/videos?id=".$videoId."&key=".$miApikey."&part=snippet";
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$output=curl_exec($ch);                 
$response = json_decode($output, TRUE);
print_r($response);

【讨论】:

这样显示您的密钥似乎不是一个好主意。最好通过 ajax 调用您的服务器端脚本来获取该 url @Jonathan Google 提供了这样的 API 密钥,以便您可以公开进行。这些限制是在 Google 方面设置的。这是执行所需操作的正确方法。 API 密钥不能在您通过控制台允许的域之外使用。这一切都在控制台中非常清楚。【参考方案4】:

问题

YouTube API 不支持 JSONP - 请参阅 Issue 4329: oEmbed callback for JSONP。 另外,YouTube Data API v2 is deprecated。

解决方案

您可以使用Noembed 服务获取oEmbed 数据和JSONP 用于YouTube 视频。

奖金

不需要 API 密钥 不需要服务器端代理

示例

对于您的VA770wpLX-Q 视频,您可以尝试这样的链接:

https://noembed.com/embed?url=http://www.youtube.com/watch?v=VA770wpLX-Q

或者对于 JSONP:

https://noembed.com/embed?callback=example&url=http://www.youtube.com/watch?v=VA770wpLX-Q

这些链接具有作为 url 参数传递的 YouTube 视频的标准 URL。它不仅适用于 YouTube,还适用于 Vimeo 和 other sites,网址如下:

https://noembed.com/embed?url=https://vimeo.com/45196609

演示

这是一个使用 jQuery 的简单示例:

var id = 'VA770wpLX-Q';
var url = 'https://www.youtube.com/watch?v=' + id;

$.getJSON('https://noembed.com/embed',
    format: 'json', url: url, function (data) 
    alert(data.title);
);

请参阅:JS Bin 上的DEMO

其他选项

Embedly(商业服务,每月最多免费提供 5000 个网址) Oohembed(更新:现已被 Embedly 收购,但 the source 可用) AutoEmbed(更新:似乎已关闭或停止)

更多信息

另请参阅这些问题:

Youtube Video title with API v3 without API key? Response for JSONp request to youtube oembed call giving "invalid label" error

【讨论】:

@BobSinclar 谢谢。它也适用于 Vimeo 和其他网站,请参阅:noembed.com/#supported-sites @KenSharp 如果不能信任 first 方(API v3 doesn't support JSONP 和 API v2 is deprecated),那么我们可以告诉原始发布者它无法完成我们可以使用适用于问题中所问内容的第三方服务。但是,如果您有更好的解决方案,请发布答案。 知道Noembed是怎么做的吗? @jakob.j 它是开源的。所以,是的。

以上是关于通过 JSON 获取 Javascript 中单个视频(非提要)的 Youtube 信息的主要内容,如果未能解决你的问题,请参考以下文章

从表中的 json 中获取单个项目

如何在javascript中从多个数组中获取单个数组[重复]

使用JavaScript函数从数组中获取单个对象[重复]

用于解析单个键的正则表达式:Javascript 中 JSON 中的值

如何通过使用 JavaScript 的 HTTP 请求从 IBM Cloud 获取 JSON 格式的数据?

如何通过带有 cookie 身份验证的 Javascript 获取 JSON 数据?