34

我现在正在玩 Youtube API,我开始了一个小项目(为了好玩)。

问题是我找不到从 ID 获取视频标题的方法。(例如:ylLzyHk54Z0)

我查看了 DATA 和 PLAYER api 文档,但找不到。

如果有人知道如何做到这一点,或者如果有人可以帮助我找到做到这一点的方法,请帮助我。

注意:我使用的是 javascript。这将是一个网络应用程序。

编辑:我有一个想法。也许使用正则表达式从页面标题中解析出标题。我正在做这件事。

4

11 回答 11

35

由于您试图从不同的域获取文档,因此在 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>
于 2009-11-19T01:22:15.573 回答
32

这就是您可以使用 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);
});
于 2015-05-25T18:38:32.700 回答
16

您可以使用 JSON 请求来:http://gdata.youtube.com/feeds/api/videos/ylLzyHk54Z0?v=2&alt=jsonc

于 2012-05-31T11:50:01.280 回答
14

打电话http://gdata.youtube.com/feeds/api/videos/ylLzyHk54Z0

在此 XML 文件中,读取<title>标记的值。

YouTube API 文档

于 2009-11-19T01:04:56.830 回答
5

截至 2015 年 12 月,此答案是准确的。

要从 YouTube 视频 ID 获取视频标题,您必须使用 YouTube 数据 API 构建以下 URL(您需要使用 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"
            }
         }
      }
   ]
}

有关更多信息,请访问API 文档页面

于 2015-12-08T03:30:39.750 回答
3

视频标题在 API 中,并且可以使用点符号在 JavaScript 中访问:

the_name_of_your_video_object.A.videoData.title
于 2014-10-07T04:45:53.693 回答
3

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要在一个请求中获取更多视频,请替换{YOUTUBE_VIDEO_ID}为逗号分隔的 ID(例如123456,234567,345678,456789:)

这将被视为配额中的单个请求,这样您只需 1 个配额/请求成本即可获得大量视频详细信息。

于 2016-04-12T11:11:15.443 回答
2

而不是使用http://gdata.youtube.com/feeds/api/videos/ ....

如果您已加载视频,则可以使用播放器对象的 getVideoData() 方法来检索有关视频的信息,包括标题。它将返回一个对象,其中包含:video_id、作者、标题。

于 2015-08-14T00:14:51.710 回答
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); }

这将获得视频的标题。

于 2013-12-20T10:54:28.087 回答
1

我编写了一个函数来获取给定 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,然后再发送到我们设置的消息处理程序。可以在这里使用 Promise,但我发现 Promise 会在消息侦听器被删除之前多次解析。所以我用 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;
}
于 2021-07-29T06:01:52.720 回答
0

使用 PHP

<?php
echo explode(' - YouTube',explode('</title>',explode('<title>',file_get_contents("https://www.youtube.com/watch?v=$youtube_id"))[1])[0])[0];
?>
于 2021-07-02T06:52:40.237 回答