Java youtube服务api返回的通道Id无效
我正在尝试使用com.google.api.services.youtube.youtube类从java应用程序获取我的youtube频道列表 首先,我启用了服务帐户凭据(>凭据),并启用了以下API: -YouTube分析API -YouTube数据API -分析API 为了调用Youtube服务,我使用以下代码创建了一个凭证对象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(); 私有静态凭
/**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;
}