Java youtube服务api返回的通道Id无效

Java youtube服务api返回的通道Id无效,java,api,youtube,oauth-2.0,youtube-analytics,Java,Api,Youtube,Oauth 2.0,Youtube Analytics,我正在尝试使用com.google.api.services.youtube.youtube类从java应用程序获取我的youtube频道列表 首先,我启用了服务帐户凭据(>凭据),并启用了以下API: -YouTube分析API -YouTube数据API -分析API 为了调用Youtube服务,我使用以下代码创建了一个凭证对象 /**HTTP传输的全局实例*/ 私有静态最终HttpTransport HTTP_TRANSPORT=new NetHttpTransport(); 私有静态凭

我正在尝试使用com.google.api.services.youtube.youtube类从java应用程序获取我的youtube频道列表

首先,我启用了服务帐户凭据(>凭据),并启用了以下API: -YouTube分析API -YouTube数据API -分析API

为了调用Youtube服务,我使用以下代码创建了一个凭证对象


/**HTTP传输的全局实例*/
私有静态最终HttpTransport HTTP_TRANSPORT=new NetHttpTransport();
私有静态凭据授权()引发异常
{
列表范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/youtube");  
作用域。添加(“https://www.googleapis.com/auth/yt-analytics.readonly");
作用域。添加(“https://www.googleapis.com/auth/youtube.readonly");
作用域。添加(“https://www.googleapis.com/auth/youtubepartner-channel-audit");
GoogleCredential credential=新建GoogleCredential.Builder().setTransport(HTTP_传输)
.setJsonFactory(JSON_工厂)
.SetServiceAccountPrivateKeyFromp12文件(新文件(“C://File.privatekey.p12”))
.setServiceAccountId(“xxxx-yyyyyyyyyyyyyy@developer.gserviceaccount.com")
.setServiceAccountScopes(范围)
.build();
返回凭证;
}

之后,我打电话给Youtube服务获取我的频道


/**HTTP传输的全局实例*/
私有静态最终HttpTransport HTTP_TRANSPORT=new NetHttpTransport();
/**JSON工厂的全局实例*/
私有静态最终JsonFactory JSON_FACTORY=new JacksonFactory();
/**用于发出常规Youtube API请求的Youtube对象的全局实例*/
私有静态YouTube YouTube;
/**用于发出分析API请求的YoutubeAnalytics对象的全局实例*/
私有静态YouTubeanAnalytics分析;
公共字符串getDefaultChannelId(){
试一试{
凭证=授权();
//用于发出所有非分析API请求的YouTube对象。
youtube=new youtube.Builder(HTTP_传输、JSON_工厂、凭证)
.setApplicationName(“API项目”)
.build();
YouTube.Channels.List channelRequest=YouTube.Channels().List(“id,snippet”);
channelRequest.setMine(true);
channelRequest.setMaxResults(50L);
设置字段(“项目(id、代码段/标题、contentDetails、状态、种类、etag、auditDetails)”;
ChannelListResponse channels=channelRequest.execute();
System.out.println(channels.getItems());
//与用户关联的频道列表。
List ListofChannel=channels.getItems();
//抓取默认频道,它始终是列表中的第一项。
Channel defaultChannel=ListofChannel.get(0);
字符串channelId=defaultChannel.getId();
返回信道ID;
}捕获(例外情况除外){
例如printStacktrace();
}
}

授权代码似乎可以正常工作。问题在于getDefaultChannelId()方法,该方法返回id为UC9i22sTxrX0IQk4AkT_Og3w的通道。 我试图使用浏览器通过url导航到我的youtube频道,但该频道不存在

我用来打印通道结果的行“System.out.println(channels.getItems());”显示以下json字符串

[{“etag”:“BDC7VThyM9nfoSQm1\u koyhtjtw/yjvlzly7dmctrvvv5drotgksadm\,“id”:“UC9i22sTxrX0IQk4AkT\u Og3w”,“种类”:“youtube#频道”,“片段”:{“标题”:}
由于某些原因,youtube服务不会返回特定凭据对象的正确频道列表。
但为什么???

您不能将服务帐户与Youtube API一起使用:。Youtube API应该会在服务帐户中引发错误,但显然不会

相反,您应该创建类型为Installed Application的客户端ID,然后检索用户()的刷新令牌,并使用此令牌创建凭据

下面是一个示例(将clientId、clientSecret、refreshToken和accessToken存储在您喜欢的任何位置,一旦您将其保密,令牌响应应该被缓存):


您不能将服务帐户与Youtube API一起使用:。Youtube API应该会引发服务帐户错误,但显然不会

相反,您应该创建类型为Installed Application的客户端ID,然后检索用户()的刷新令牌,并使用此令牌创建凭据

下面是一个示例(将clientId、clientSecret、refreshToken和accessToken存储在您喜欢的任何位置,一旦您将其保密,令牌响应应该被缓存):


您不能将服务帐户与Youtube API一起使用:。Youtube API应该会引发服务帐户错误,但显然不会

相反,您应该创建类型为Installed Application的客户端ID,然后检索用户()的刷新令牌,并使用此令牌创建凭据

下面是一个示例(将clientId、clientSecret、refreshToken和accessToken存储在您喜欢的任何位置,一旦您将其保密,令牌响应应该被缓存):


您不能将服务帐户与Youtube API一起使用:。Youtube API应该会引发服务帐户错误,但显然不会

相反,您应该创建类型为Installed Application的客户端ID,然后检索用户()的刷新令牌,并使用此令牌创建凭据

下面是一个示例(将clientId、clientSecret、refreshToken和accessToken存储在您喜欢的任何位置,一旦您将其保密,令牌响应应该被缓存):

private String clientId;
private String clientSecret;
private String refreshToken;
private String accessToken;
private TokenResponse tokenResponse;

private Credential createCredential() {
    final GoogleCredential.Builder builder = new GoogleCredential.Builder();
    builder.setTransport(HTTP_TRANSPORT);
    builder.setJsonFactory(JSON_FACTORY);
    builder.setClientSecrets(clientId, clientSecret);
    builder.addRefreshListener(new CredentialRefreshListener() {
        @Override
        public void onTokenResponse(final Credential credential,
                final TokenResponse tokenResponse) throws IOException {
            this.tokenResponse = tokenResponse;
        }

        @Override
        public void onTokenErrorResponse(final Credential credential,
                final TokenErrorResponse tokenErrorResponse)
                throws IOException {
            this.tokenResponse = null;
            // trace error
        }
    });
    return builder.build();
}

private YouTube getYoutube() {
    final Credential credential = createCredential();
    if (this.tokenResponse == null) {
        credential.setAccessToken(this.accessToken);
        credential.setRefreshToken(this.refreshToken);
    } else {
        credential.setFromTokenResponse(this.tokenResponse);
    }

    final YouTube youtube = new YouTube.Builder(HTTP_TRANSPORT,
            JSON_FACTORY, credential).setApplicationName("*****").build();
    return youtube;
}