运行youtube重审评论时权限不足

这是我的整个代码。 我想提供一个来自youtube的videoID,以获取与此vedio ID相关的评论。 但总是表明我的权限不足。

我试图解决这个问题,并找到youtube .commentThreads().list("snippet").setVideoId("tLTm_POao1c") .setTextFormat("plainText").execute(); 是问题。 具体来说,此行中的execute()调用“Perufficient Permission”。 为什么是这样?

 package com.google.api.services.samples.youtube.cmdline.youtube_cmdline_addsubscription_sample; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.List; import com.google.api.client.util.Preconditions;//aiyamaya import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.java6.auth.oauth2.FileCredentialStore; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; //import com.google.api.services.youtube.YouTube; import com.google.api.services.youtube.model.ResourceId; import com.google.api.services.youtube.model.Subscription; import com.google.api.services.youtube.model.SubscriptionSnippet; import com.google.common.collect.Lists; import com.google.api.services.youtube.model.CommentThreadListResponse; import com.google.api.services.youtube.model.CommentThread; import com.google.api.services.youtube.model.CommentSnippet; import com.google.api.services.youtube.YouTube; import com.google.api.services.samples.youtube.cmdline.youtube_cmdline_addsubscription_sample.Auth; //import com.google.api.services.samples.youtube.cmdline.Auth; /** * Demo of subscribing user to a channel using the YouTube Data API (V3) with * OAuth2 for authorization. * * @author Ibrahim Ulukaya */ public class AddSubscription { /** Global instance of the HTTP transport. */ // private static final HttpTransport HTTP_TRANSPORT = new // NetHttpTransport(); /** Global instance of the JSON factory. */ // private static final JsonFactory JSON_FACTORY = new JacksonFactory(); /** Global instance of Youtube object to make all API requests. */ private static YouTube youtube; public static void main(String[] args) { System.setProperty("proxySet", "true"); System.setProperty("proxyHost", "bproxy.rmit.edu.au"); System.setProperty("proxyPort", "8080"); List scopes = Lists .newArrayList("https://www.googleapis.com/auth/youtube"); try { // Authorization. Credential credential = Auth.authorize(scopes, "commentthreads"); // This object is used to make YouTube Data API requests. youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential).setApplicationName( "youtube-cmdline-commentthreads-sample").build(); // YouTube object used to make all API requests. CommentThreadListResponse videoCommentsListResponse = youtube .commentThreads().list("snippet").setVideoId("tLTm_POao1c") .setTextFormat("plainText").execute(); List videoComments = videoCommentsListResponse .getItems(); } catch (GoogleJsonResponseException e) { System.err.println("GoogleJsonResponseException code: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println("IOException: " + e.getMessage()); e.printStackTrace(); } catch (Throwable t) { System.err.println("Throwable: " + t.getMessage()); t.printStackTrace(); } } /* * Returns a channel id (String) from user via the terminal. */ } 

这是错误信息:

  May 22, 2015 8:19:15 AM com.google.api.client.util.store.FileDataStoreFactory setPermissionsToOwnerOnly WARNING: unable to change permissions for everybody: C:\Users\E18300\.oauth-credentials May 22, 2015 8:19:15 AM com.google.api.client.util.store.FileDataStoreFactory setPermissionsToOwnerOnly WARNING: unable to change permissions for owner: C:\Users\E18300\.oauth-credentials 2015-05-22 08:19:15.192:INFO::Logging to STDERR via org.mortbay.log.StdErrLog 2015-05-22 08:19:15.193:INFO::jetty-6.1.26 2015-05-22 08:19:15.212:INFO::Started SocketConnector@localhost:8080 2015-05-22 08:19:20.433:INFO::Stopped SocketConnector@localhost:8080 GoogleJsonResponseException code: 403 : Insufficient Permission 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:321) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1045) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) at com.google.api.services.samples.youtube.cmdline.youtube_cmdline_addsubscription_sample.AddSubscription.main(AddSubscription.java:86) 

文档缺少此部分,但您需要使用范围https://www.googleapis.com/auth/youtube.force-ssl从YouTube API检索评论。 花了我太多时间来解决这个问题。

 var OAUTH2_SCOPES = [ 'https://www.googleapis.com/auth/youtube', 'https://www.googleapis.com/auth/youtube.force-ssl' ]; 

从YouTube API添加中检索评论
https://www.googleapis.com/auth/youtube.force-ssl
这进入OAUTH2_SCOPES数组

如错误消息所示,您的请求没有足够的权限。 如果您查看API参考概述,您将看到:

 Every request must either specify an API key (with the key parameter) or provide an OAuth 2.0 token. Your API key is available in the API console's API Access pane for your project. 

例如,我可以通过直接在浏览器中向此链接发出GET请求来查看video的评论主题列表: https : //www.googleapis.com/youtube/v3/commentThreads?part = snippet&key = YOUR_KEY&videoId = tLTm_POao1c 。 您需要将YOUR_KEY替换为您可以在Google开发者控制台中找到的应用密钥。

我不知道为什么注释线程的代码示例没有提到包含API密钥的必要性(可能是因为假设您首先阅读API概述)。 但是,如果您查看其他代码示例 ,您将看到可以在本地文件中包含开发人员密钥,您可以将其加载到Properties对象中:

  // Read the developer key from the properties file. Properties properties = new Properties(); try { InputStream in = Search.class.getResourceAsStream("/" + PROPERTIES_FILENAME); properties.load(in); } catch (IOException e) { System.err.println("There was an error reading " + PROPERTIES_FILENAME + ": " + e.getCause() + " : " + e.getMessage()); System.exit(1); } 

接下来,api键从Properties对象中提取并用于搜索API调用:

  // Set your developer key from the Google Developers Console for // non-authenticated requests. See: // https://console.developers.google.com/ String apiKey = properties.getProperty("youtube.apikey"); search.setKey(apiKey); search.setQ(queryTerm); 

以类似的方式,您可以在代码上调用setKey(),如JavaDocs所述: https : //developers.google.com/resources/api-libraries/documentation/youtube/v3/java/latest/com/google /api/services/youtube/YouTube.CommentThreads.List.html#setKey(java.lang.String)

所以,你可能需要添加这样的东西:

  CommentThreadListResponse videoCommentsListResponse = youtube.commentThreads() .list("snippet") .setKey(YOUR_KEY) .setVideoId("tLTm_POao1c") .setTextFormat("plainText") .execute(); 

您甚至不需要属性文件,除非您计划在编写代码并部署代码后更改API密钥。

您只需要一个密钥来检索评论。 像这样的东西:

 String apiUrl = "https://www.googleapis.com/youtube/v3/commentThreads?part=snippet%2Creplies&videoId=" + ytId + "&moderationStatus=published&order=relevance&maxResults=5&key=" + apiKey; 

然后处理Json响应。