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

时间:2015-05-21 22:31:50

标签: java youtube-api

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

我试图解决这个问题,发现问题是youtube .commentThreads().list("snippet").setVideoId("tLTm_POao1c") .setTextFormat("plainText").execute();。具体来说,此行中的execute()称为“权限不足”。 这是为什么?

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<String> 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<CommentThread> 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)

4 个答案:

答案 0 :(得分:6)

此部分缺少文档,但您需要使用范围ff fe 06 00从YouTube API检索评论。花了我太多时间来解决这个问题。

答案 1 :(得分:1)

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数组

答案 2 :(得分:0)

如错误消息所示,您的请求没有足够的权限。如果您查看API Reference Overview,您会看到:

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请求来查看视频的评论线程列表: https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&key=YOUR_KEY&videoId=tLTm_POao1c。您需要将YOUR_KEY替换为您可以在Google developer console中找到的应用密钥。

我不知道为什么注释线程的代码示例没有提到包含API密钥的需要(可能是因为假设您首先阅读了API概述)。但 如果查看this other code sample,您将看到可以在本地文件中包含开发人员密钥,您可以将其加载到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密钥。

答案 3 :(得分:0)

您只需要一个密钥即可检索评论。像这样:

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

然后处理Json响应。