gpt4 book ai didi

java - youtube 服务 api 返回无效 channel ID

转载 作者:行者123 更新时间:2023-12-02 06:07:17 25 4
gpt4 key购买 nike

我正在尝试使用 com.google.api.services.youtube.YouTube 类从 Java 应用程序获取我的 YouTube channel 列表。 。

首先,我启用了服务帐户凭据 ( https://console.developers.google.com > Credentials ),并且启用了以下 api:-YouTube 分析 API-YouTube数据API-分析API

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

<小时/>
/** Global instance of the HTTP transport. */
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

private static Credential authorize() throws Exception
{

List<String> scopes = new ArrayList<String>();
scopes.add("https://www.googleapis.com/auth/youtube");
scopes.add("https://www.googleapis.com/auth/yt-analytics.readonly");
scopes.add("https://www.googleapis.com/auth/youtube.readonly");
scopes.add("https://www.googleapis.com/auth/youtubepartner-channel-audit");

GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountPrivateKeyFromP12File(new File("C://file.privatekey.p12"))
.setServiceAccountId("xxxx-yyyyyyyyyyyyyy@developer.gserviceaccount.com")
.setServiceAccountScopes(scopes)
.build();
return credential;
}
<小时/>

之后,我调用 Youtube 服务来获取我的 channel

<小时/>
/** 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 general YouTube API requests. */
private static YouTube youtube;

/** Global instance of YoutubeAnalytics object to make analytic API requests. */
private static YouTubeAnalytics analytics;


public String getDefaultChannelId(){
try{
Credential credential = authorize();
// YouTube object used to make all non-analytic API requests.
youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName("API Project")
.build();

YouTube.Channels.List channelRequest = youtube.channels().list("id,snippet");
channelRequest.setMine(true);
channelRequest.setMaxResults(50L);
channelRequest.setFields("items(id,snippet/title,contentDetails,status,kind,etag,auditDetails)");
ChannelListResponse channels = channelRequest.execute();

System.out.println(channels.getItems());

// List of channels associated with user.
List<Channel> listOfChannels = channels.getItems();

// Grab default channel which is always the first item in the list.
Channel defaultChannel = listOfChannels.get(0);
String channelId = defaultChannel.getId();
return channelId;
}catch(Exception ex){
ex.printStacktrace();
}
}
<小时/>

授权码似乎工作没有任何问题。问题在于 getDefaultChannelId() 方法,该方法返回 id 为 UC9i22sTxrX0IQk4AkT_Og3w 的 channel 。我尝试使用浏览器导航到我的 YouTube channel ,网址为:http://www.youtube.com/channel/UC9i22sTxrX0IQk4AkT_Og3w但该 channel 不存在..

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

[{"etag":"\"BDC7VThyM9nfoSQm1_kOyhtJTEw/yJvLzly7DMctrvFV5drOtgksadM\"","id":"UC9i22sTxrX0IQk4AkT_Og3w","kind":"youtube#channel","snippet":{"title":""}}

出于某种原因,youtube 服务不会返回特定凭据对象的正确 channel 列表。但为什么????

最佳答案

您无法将服务帐户与 Youtube API 一起使用:https://developers.google.com/youtube/v3/guides/moving_to_oauth#service_accounts 。 Youtube API 应该会引发服务帐户错误,但显然没有。

您应该创建类型为“已安装应用程序”的客户端 ID,然后检索您的用户的刷新 token ( https://developers.google.com/accounts/docs/OAuth2InstalledApp ) 并使用此 token 创建凭据。

这是一个示例(将 clientId、clientSecret、refreshToken 和 accessToken 存储在任何您喜欢的地方,一旦您保密, token 响应就应该被缓存):

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;
}

关于java - youtube 服务 api 返回无效 channel ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22172922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com