Следующий код отлично работает, когда я ищу видео с помощью Google YouTube API (версия 3), но при попытке:
Playlist youTubePlaylist = new Playlist();
youTubePlaylist.setSnippet(playlistSnippet);
youTubePlaylist.setStatus(playlistStatus);
YouTube.Playlists.Insert command = youTube.playlists().insert("snippet,status", youTubePlaylist);
youTubePlaylist.setKey("AI...1IU");
youTubePlaylist.execute();
На этапе учетных данных я получаю accessToken, но происходит сбой на youTubePlaylist.execute():
{
"access_token" : "ya29...DSoQ",
"expires_in" : 3600,
"token_type" : "Bearer"
}
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:312)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1049)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
at ...publication.youtube.YouTubeAPIVersion3Connector.execute(YouTubeAPIVersion3Connector.java:107)
at ...publication.youtube.YouTubeAPIVersion3ServiceImpl.createPlaylist(YouTubeAPIVersion3ServiceImpl.java:119)
Аутентификация выполняется следующим образом:
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
File privateKeyP12 = new File(getYouTubeConfigDirectory(), "/private-key-youtube-v3.p12");
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId("[email protected]")
.setServiceAccountScopes(Collections.list(YouTubeScopes.YOUTUBE_READONLY, YouTubeScopes.YOUTUBE_UPLOAD))
.setServiceAccountPrivateKeyFromP12File(privateKeyP12)
.setClientSecrets("9...42.apps.googleusercontent.com", "DH...w8")
.setRefreshListeners(getRefreshListeners())
.build();
}
return new YouTube.Builder(httpTransport, jsonFactory, credential).setApplicationName(googleAppAccountName).build();
Имейте в виду, что я НЕ выполняю операции YouTube от имени другого пользователя. Мое веб-приложение управляет видео на собственном канале YouTube. Что я уже сделал:
- через Google Cloud Console я включил YouTube v3 API, создал приложение с разрешением на редактирование
- Я сгенерировал файл закрытого ключа p12, который загружается кодом выше
- Я использую ключ API для всех операций
Что мне не хватает? Например: - что я должен делать с отпечатком открытого ключа, предоставленным Google Cloud Console? - правильно ли я устанавливаю setServiceAccountScopes() только с YouTubeScopes.YOUTUBE_READONLY и YouTubeScopes.YOUTUBE_UPLOAD? - Можно ли каким-то образом контролировать разрешения, помимо настройки «Может редактировать» в Cloud Console для электронной почты: [email protected]?
Часть моего разочарования заключается в том, что все примеры кода, предоставленные сайтом API YouTube v3, включают в себя запуск «безголового» набора инструментов AWT. Все, что хочет сделать мое приложение, — это аутентифицироваться с использованием собственной учетной записи YouTube.
Спасибо за ваше предложение.