1

当我使用 Google 的 YouTube API(版本 3)搜索视频时,以下代码运行良好,但尝试时失败:

Playlist youTubePlaylist = new Playlist();
youTubePlaylist.setSnippet(playlistSnippet);
youTubePlaylist.setStatus(playlistStatus);
YouTube.Playlists.Insert command = youTube.playlists().insert("snippet,status", youTubePlaylist);
youTubePlaylist.setKey("AI...1IU");
youTubePlaylist.execute();

在凭证步骤中,我确实得到了一个 accessToken,但在 youTubePlaylist.execute() 上发生了故障:

{
  "access_token" : "ya29...DSoQ",
  "expires_in" : 3600,
  "token_type" : "Bearer"
}

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Insufficient Permission"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1049)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
    at ...publication.youtube.YouTubeAPIVersion3Connector.execute(YouTubeAPIVersion3Connector.java:107)
    at ...publication.youtube.YouTubeAPIVersion3ServiceImpl.createPlaylist(YouTubeAPIVersion3ServiceImpl.java:119)

身份验证按如下方式完成:

HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
File privateKeyP12 = new File(getYouTubeConfigDirectory(), "/private-key-youtube-v3.p12");
GoogleCredential credential = new GoogleCredential.Builder()
 .setTransport(httpTransport)
 .setJsonFactory(jsonFactory)
 .setServiceAccountId("99...@developer.gserviceaccount.com")
 .setServiceAccountScopes(Collections.list(YouTubeScopes.YOUTUBE_READONLY, YouTubeScopes.YOUTUBE_UPLOAD))
 .setServiceAccountPrivateKeyFromP12File(privateKeyP12)
 .setClientSecrets("9...42.apps.googleusercontent.com", "DH...w8")
 .setRefreshListeners(getRefreshListeners())
 .build();
}
return new YouTube.Builder(httpTransport, jsonFactory, credential).setApplicationName(googleAppAccountName).build();

请记住,我不是代表其他用户执行 YouTube 操作。我的 Web 应用程序正在其自己的 YouTube 频道上管理视频。我已经做了什么:

  • 通过 Google Cloud Console,我启用了 YouTube v3 API,创建了一个具有编辑权限的应用
  • 我生成了由上面的代码加载的 p12 私钥文件
  • 我在所有操作中使用 API 密钥

我错过了什么?例如: - 我应该如何处理 Google Cloud Console 提供的公钥指纹?- 我是否仅使用 YouTubeScopes.YOUTUBE_READONLY 和 YouTubeScopes.YOUTUBE_UPLOAD 正确设置 setServiceAccountScopes()?- 除了在 Cloud Console 上为电子邮件设置“可以编辑”之外,还有什么方法可以控制权限:99...91i@developer.gserviceaccount.com?

我感到沮丧的部分原因是 YouTube v3 API 站点提供的所有代码示例都涉及构建一个“无头”AWT 工具包。我的应用要做的就是使用自己的 YouTube 帐户进行身份验证。

谢谢你的建议。

4

1 回答 1

0

Data API v3 不支持服务帐号。请在云控制台中创建一个项目 ID并使用您的客户端密码和 ID。

尽管我们知道有这种需求,但目前我们还没有关于此可用性的消息。

这是我们的 Java 示例,可以为您提供指导

于 2013-10-23T23:40:27.720 回答