当前位置: 首页 > 知识库问答 >
问题:

使用Google的API创建带有React的YouTube播放列表

宰父跃
2023-03-14

我想在一个用户帐户上创建一个YouTube播放列表,但我一直在努力通过YouTubeV3 API验证一个帖子。

我将首先说明我在这个问题上取得了多大的进展。

Youtube API文档提供了关于创建播放列表的详细信息,并在API Explorer中提供了一个工作示例

我在请求正文中输入了以下代码:

{
  "snippet":
  {
    "title":"Test Playlist"
  }
}

这成功地在我的YouTube帐户上创建了一个具有相同标题的播放列表。因此,从这一点我可以看出,在正文中需要一个标题,并且它将需要OAuth 2.0身份验证(如果未启用,则显示错误),使用一个作用域:youtube、youtube.force-ssl、YouTubePartner。

我尝试的第一件事与此类似:

fetch('/youtube/v3/playlists', {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'Authorization': 'Bearer' + api.youtube,
    },
    body: JSON.stringify({
      "snippet":
      {
      "title":"Test"
      }
    })
  }).then(response => response.json()).then(data => {
    console.log(data)
  })

包含我的YouTube api密钥。大部分的格式设置来自我在同一程序中的另一个API,它可以从spotify获取数据。我得到的响应是“登录失败”或“身份验证错误”(类似的)

无论如何,这是相关的,因为我知道我的第一个障碍是获得身份验证。

YouTube API文档包含一个名为Implementing OAuth2.0 Authorization I followed The guide for client side web Apps的指南。我注意到的第一件事是他们正在使用一个库,我在GoogleAPI下的npm上找到了这个,并安装了它。当我尝试在React中使用

const {google} = require('googleapis');

我不会深入探讨这个错误,但react说“不能将未定义转换为对象”,并且发现了一个问题,即GoogleAPI是用于服务器端而不是客户端的,我尝试构建react应用程序并将其放在herokuapp上,但得到了同样的错误。其他人建议在npm上使用gapi-client,这是GoogleAPI的节点包装器。

我做的下一件事是尝试npm页面上的示例,它与配置客户端对象的google示例非常相似。我有它,所以导入部分和函数在我的app.js的顶部,然后gapi.load部分在按下一个按钮后激活(这可能是无用的信息,但不是这样)

import gapi from 'gapi-client';

//On load, called to load the auth2 library and API client library.
gapi.load('client:auth2', initClient);

function initClient() {
  gapi.client.init({
    discoveryDocs: ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"],
    clientId: 'YOUR_CLIENT_ID',
    scope: 'https://www.googleapis.com/auth/drive.metadata.readonly'
  }).then(function () {
    // do stuff with loaded APIs
    console.log('it worked');
  });
}

我从API控制台复制了我的客户端ID,这是我得到的确切响应:

火狐

为来源为“https://apis.google.com//scs/apps-static//js/k=oz.gapi.en.wcpmzqgmjzu.o/m=auth2,client/rt=j/sv=1/d=1/ed=1/am=aq/rs=agltccnsts1p4dx0imhlrwepiaxw4imjog/cb=gapi.loaded_0”的文件加载失败。

获取https://apis.google.com//scs/apps-static//js/k=oz.gapi.en.wcpmzqgmjzu.o/m=auth2,client/rt=j/sv=1/d=1/ed=1/am=aq/rs=agltccnsts1p4dx0imhlrwepiaxw4imjog/cb=gapi.loaded_0 net::err_aborted 404

这是大约我所得到的,我不确定从这里做什么,所以任何帮助是非常感谢的。我希望这件事不会太复杂,但我已经尽可能清楚地表达了我的问题。

共有1个答案

屠坚壁
2023-03-14

所以我能够授权YouTube API并创建一个播放列表。我有一个托管在localhost上的后端:8888(并不重要,只是react托管在什么上)。

下面是我放在server.js文件中的示例代码(用于后端)

var express = require('express');
var app = express();
var passport = require('passport');
app.use(passport.initialize());
var YoutubeV3Strategy = require('passport-youtube-v3').Strategy;

passport.use(new YoutubeV3Strategy({
    clientID: YOUR_CLIENT_ID,
    clientSecret: YOUR_CLIENT_SECRET,
    callbackURL: 'http://localhost:8888/redirect',
    scope: ['https://www.googleapis.com/auth/youtube']
},
function (accessToken, refreshToken, profile, cb) {
    var user = {
        accessToken: accessToken,
        refreshToken: refreshToken
    };
    return cb(null, user)
}
));

passport.serializeUser(function(user, cb) {
    cb(null, user);
});

passport.deserializeUser(function(obj, cb) {
    cb(null, obj);
});

app.get('/authenticate', passport.authenticate('youtube'))
app.get('/redirect', passport.authenticate('youtube', { failureRedirect: '/login' }),
function(req, res) {
    res.redirect('http://localhost:3000' + '?access_token=' + req.user.accessToken)
})

app.listen(8888)

这是使用passport.js为我做oauth,很多文档可以在站点上找到。

在react中,我有一个按钮将打开localhost:8888/authenticate,然后它将重定向回我的应用程序。如果您正在使用这种方法,则需要确保在google API凭据上javascript源为http://localhost:8888,重定向URI为http://localhost:8888/redirect以及正确的作用域和应用程序类型。

这是我在app.js(react)中用来发布帖子的函数

getAPIdata() {
    let parsed = queryString.parse(window.location.search);
    let accessToken = parsed.access_token
    fetch('https://www.googleapis.com/youtube/v3/playlists?part=snippet', {
        method: 'POST',
        headers: {
            'Content-type': 'application/json',
            'Authorization': 'Bearer ' + accessToken,
        },
        body: JSON.stringify({
            'snippet':
            {
                'title':this.state.inputTitle
            }
        })
    }).then(response => response.json()).then(data => {
        console.log(data)
        window.alert('https://www.youtube.com/playlist?list=' + data.id)
    })
}

我实际上基本上是正确的,第一次尝试,我只是有授权不正确。

以下几个消息来源帮助我制定了解决方案:

  • passport.js oauth教程
  • 谷歌OAuth 2.0游乐场
  • passport.js文档
  • passport.js facebook oauth示例

希望这对某人有帮助,您可以使用我在server.js中使用的相同代码来验证大多数服务,只需更改策略。

我的应用程序的实时版本可以在这里找到。在控制台中,它显示了来自POST请求的响应,如果您有任何问题,这将会有所帮助。我知道警报是错误的用户界面,但这不是预期的用途。

感谢阅读:)

 类似资料:
  • 我正在使用youtube v3 API检索播放列表的视频,并通过此链接获得50个项目,没有任何问题:- https://www.googleapis.com/youtube/v3/playlistItems?part=snippet 但是视频数是100,我只有50个。我如何获得接下来的50个项目?我尝试了start index,但它不适用于v3 API。感谢任何帮助。

  • 我已经设法使用YouTubePlayer播放YouTube视频。然而,当我尝试使用YouTubePlayer播放直播流时,什么也没有发生。API支持播放实时流吗?如果是,我该怎么做?

  • 我正试图找出在给定频道频道ID的情况下获取频道上传播放列表ID的最佳方法。E、 g.对于具有channelID的信道 UC9CuvdOVfMPvKCiwdGKL3cQ 对应的上传playlistID为 UU9CuvdOVfMPvKCiwdGKL3cQ 请注意,第二个字符已从“C”更改为“U” 我可以通过字符串操作进行此转换,但我很好奇是否有更好,更不麻烦的方式通过官方youtube api找到上传

  • 我收到这个错误“无法加载现代控件UI。升级到Android YouTube API的最新版本。”我使用了youtubePlayer。addFullscreenControlFlag(YouTubePlayer.FULLSCREEN\u FLAG\u CONTROL\u SYSTEM\u UI) 但仍然得到同样的错误也我去无法播放一些YouTube视频使用YouTubeAndroid Player

  • 我正在尝试从播放列表中下载所有视频: 我使用youtube-dl进行此操作,命令如下: 但这只下载第一个视频。不知道我做错了什么。

  • 我试图使用下面的json url显示我的youtube频道中的所有视频。但它只有25个视频显示从这个网址。 https://gdata.youtube.com/feeds/api/videos?author=Anklespankin 实际上,用户已经上传了500多个视频 https://www.youtube.com/user/Anklespankin 如何获取所有视频。给我一个json解决方案。