我现在正在玩Youtube API,我开始了一个小项目(为了好玩)。
问题是我找不到从Id获取视频标题的方法。 (例如:ylLzyHk54Z0)
我查看了DATA和PLAYER api文档,但我找不到它。
如果有人知道该怎么做,或者有人可以帮我找到办法,请帮助我。
注意:我正在使用javascript。它将是一个网络应用程序。
编辑:我有一个想法。也许使用Regular expresion来解析页面标题中的标题。我正在研究这个问题。答案 0 :(得分:36)
由于您尝试从其他域获取文档,因此在javascript中完全不可能。如果你很乐意投入一些PHP试试这个。测试好了:
<?
$vidID = $_POST['vidID'];
$url = "http://gdata.youtube.com/feeds/api/videos/". $vidID;
$doc = new DOMDocument;
$doc->load($url);
$title = $doc->getElementsByTagName("title")->item(0)->nodeValue;
?>
<html>
<head>
<title>Get Video Name</title>
</head>
<body>
<form action="test.php" method="post">
<input type="text" value="ID Here" name="vidID" />
<input type="submit" value="Get Name" />
</form>
<div id="page">URL: [<?= $url ?>]</div>
<div id="title">Title: [<?= $title ?>]</div>
</body>
</html>
答案 1 :(得分:22)
这是使用JavaScript和V3 YouTube数据API实现的方法。
var ytApiKey = "...";
var videoId = "ylLzyHk54Z0";
$.get("https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + videoId + "&key=" + ytApiKey, function(data) {
alert(data.items[0].snippet.title);
});
答案 2 :(得分:15)
致电http://gdata.youtube.com/feeds/api/videos/ylLzyHk54Z0
。
在此XML文件中,读取<title>
标记的值。
答案 3 :(得分:14)
您可以使用JSON请求:http://gdata.youtube.com/feeds/api/videos/ylLzyHk54Z0?v=2&alt=jsonc
答案 4 :(得分:4)
此答案截至2015年12月是准确的。
要从YouTube视频ID中获取视频标题,您必须使用YouTube Data API构建以下网址(您需要使用API密钥,否则请求将失败):
https://www.googleapis.com/youtube/v3/videos?part=snippet&id={YOUTUBE_VIDEO_ID}&fields=items(id%2Csnippet)&key={YOUR_API_KEY}
执行GET请求,您将获得类似于下面的块的JSON响应。对于标题,它存在于snippet/title
键中。
{
"items":[
{
"id":"Jglv0A0qLI8",
"snippet":{
"publishedAt":"2014-06-30T03:42:20.000Z",
"channelId":"UCdTU5vd37FlTZ-xoB0xzRDA",
"title":"AIA Malaysia - A-Plus Venus Plan - Comprehensive Female Protection and Insurance Plan",
"description":"A comprehensive female protection plan for the modern women\n\nFor more information visit: http://www.aia.com.my/en/individuals/products-and-services/health/a-plus-venus-a-plus-venus-extra.html\n\nFor more products, visit AIA Malaysia's Products and Services playlist:\nhttps://www.youtube.com/playlist?list=PLSrgVT3aQ1fZ3SCe-dEVnFJDApBYkqolP\n\nFor more videos. subscribe to AIA Malaysia's YouTube channel:\nhttps://www.youtube.com/channel/UCdTU5vd37FlTZ-xoB0xzRDA",
"thumbnails":{
"default":{
"url":"https://i.ytimg.com/vi/Jglv0A0qLI8/default.jpg",
"width":120,
"height":90
},
"medium":{
"url":"https://i.ytimg.com/vi/Jglv0A0qLI8/mqdefault.jpg",
"width":320,
"height":180
},
"high":{
"url":"https://i.ytimg.com/vi/Jglv0A0qLI8/hqdefault.jpg",
"width":480,
"height":360
},
"standard":{
"url":"https://i.ytimg.com/vi/Jglv0A0qLI8/sddefault.jpg",
"width":640,
"height":480
},
"maxres":{
"url":"https://i.ytimg.com/vi/Jglv0A0qLI8/maxresdefault.jpg",
"width":1280,
"height":720
}
},
"channelTitle":"AIA Malaysia",
"tags":[
"aia",
"aia malaysia",
"a-plus venus",
"female health insurance",
"female life insurance",
"female insurance",
"female medical insurance"
],
"categoryId":"27",
"liveBroadcastContent":"none",
"localized":{
"title":"AIA Malaysia - A-Plus Venus Plan - Comprehensive Female Protection and Insurance Plan",
"description":"A comprehensive female protection plan for the modern women\n\nFor more information visit: http://www.aia.com.my/en/individuals/products-and-services/health/a-plus-venus-a-plus-venus-extra.html\n\nFor more products, visit AIA Malaysia's Products and Services playlist:\nhttps://www.youtube.com/playlist?list=PLSrgVT3aQ1fZ3SCe-dEVnFJDApBYkqolP\n\nFor more videos. subscribe to AIA Malaysia's YouTube channel:\nhttps://www.youtube.com/channel/UCdTU5vd37FlTZ-xoB0xzRDA"
}
}
}
]
}
有关详细信息,请访问the API documentation page。
答案 5 :(得分:2)
视频标题位于API中,可使用点表示法在JavaScript中访问:
the_name_of_your_video_object.A.videoData.title
答案 6 :(得分:2)
Robert Sim和cbaigorri的答案是最好的,这是用JS做这个的正确方法,请GET请求:
https://www.googleapis.com/youtube/v3/videos?part=snippet&id={YOUTUBE_VIDEO_ID}&fields=items(id,snippet)&key={YOUR_API_KEY}
关于此的一点说明: 您可以使用逗号分隔的YouTube视频ID在一个请求中获取多个视频信息。
要获得1个视频,请将{YOUTUBE_VIDEO_ID}
替换为视频ID(例如:123456
)
要在一个请求中获取更多视频,请使用逗号分隔的ID替换{YOUTUBE_VIDEO_ID}
(例如:123456,234567,345678,456789
)
这将在配额中计为单个请求,这样您只需1个配额/请求费用即可获得大量视频详细信息。
答案 7 :(得分:1)
我的解决方案是:
$xmlInfoVideo = simplexml_load_file("http://gdata.youtube.com/feeds/api/videos/".$videoId."?v=2&fields=title");
foreach($xmlInfoVideo->children() as $title) { $videoTitle = strtoupper((string) $title); }
这是获得视频的标题。
答案 8 :(得分:1)
而不是使用http://gdata.youtube.com/feeds/api/videos/ ....
如果您加载了视频,则可以使用播放器对象的getVideoData()方法来检索视频信息,包括标题。它将返回一个包含:video_id,author,title的对象。
答案 9 :(得分:0)
使用 PHP
<?php
echo explode(' - YouTube',explode('</title>',explode('<title>',file_get_contents("https://www.youtube.com/watch?v=$youtube_id"))[1])[0])[0];
?>
答案 10 :(得分:0)
我编写了一个函数来获取给定 id 的 Youtube 视频的标题和作者。该函数在 iframe 中加载 Youtube 视频,然后在 Youtube 发出其初始消息时添加一个消息侦听器。该初始消息包含视频数据。然后从页面中删除 iframe 和消息侦听器。
import { Observable } from 'rxjs';
function getVideoData$(ytId){
return new Observable((observer) => {
let embed = document.createElement('iframe');
embed.setAttribute('src', `https://www.youtube.com/embed/${ytId}?enablejsapi=1&widgetid=99`);
embed.cssText = "position: absolute; display: hidden";
embed.onload = function() {
var message = JSON.stringify({ event: 'listening', id: 99, channel: 'widget' });
embed.contentWindow.postMessage(message, 'https://www.youtube.com');
}
function parseData(e) {
const {event, id, info} = JSON.parse(e.data)
// console.log(JSON.parse(e.data))
if (event == 'initialDelivery' && id == 99) observer.next(info.videoData)
}
document.body.appendChild(embed); // load iframe
window.addEventListener("message", parseData) // add Api listener for initialDelivery
return function cleanup(){
window.removeEventListener("message", parseData)
document.body.removeChild(embed)
}
});
}
我选择返回一个 observable,因为视频必须从 yt 的服务器异步检索,然后发送回 iframe,然后发送到我们设置的消息处理程序。在这里可以使用承诺,但我发现承诺会在消息侦听器被删除之前多次解析。所以我使用 rxjs 只获取第一个值。下面是我如何使用这个功能。
import { firstValueFrom } from 'rxjs';
getVideoDataFromUrl('https://www.youtube.com/watch?v=3vBwRfQbXkg')
async function getVideoDataFromUrl (url){
const videoId = parseYoutubeUrl(url)
if (!videoId) return false
let videoData = await firstValueFrom(getVideoData$(videoId)) // await video data
console.log({videoData})
}
function parseYoutubeUrl(url) {
var p = /^(?:https?:\/\/)?(?:m\.|www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
let urlMatch = url.match(p)
if(urlMatch) return urlMatch[1];
return false;
}