У меня проблемы с использованием API YouTube с аутентификацией OAuth 2.0. Я использую следующую слегка отредактированную версию примера кода, предоставленного YouTube / Google (также пробовал другой пример):
<!DOCTYPE html>
<html>
<head>
<script src="https://apis.google.com/js/api.js"></script>
</head>
<body>
<script>
/**
* Sample JavaScript code for youtubeAnalytics.reports.query
* See instructions for running APIs Explorer code samples locally:
* https://developers.google.com/explorer-help/guides/code_samples#javascript
*/
function authenticate() {
return gapi.auth2.getAuthInstance()
.signIn({scope: "https://www.googleapis.com/auth/youtube.readonly"})
.then(function() { console.log("Sign-in successful"); },
function(err) { console.error("Error signing in", err); });
}
function loadClient() {
gapi.client.setApiKey("my key edited out");
return gapi.client.load("https://youtubeanalytics.googleapis.com/$discovery/rest?version=v2")
.then(function() { console.log("GAPI client loaded for API"); },
function(err) { console.error("Error loading GAPI client for API", err); });
}
// Make sure the client is loaded and sign-in is complete before calling this method.
function execute() {
return gapi.client.youtubeAnalytics.reports.query({
"endDate": "2020-05-25",
"ids": "channel==MINE",
"metrics": "views,redViews,comments,likes,dislikes,videosAddedToPlaylists,videosRemovedFromPlaylists,shares,estimatedMinutesWatched,estimatedRedMinutesWatched,averageViewDuration,averageViewPercentage,subscribersGained,subscribersLost",
"startDate": "2020-05-01"
})
.then(function(response) {
// Handle the results here (response.result has the parsed body).
console.log("Response", response);
},
function(err) { console.error("Execute error", err); });
}
gapi.load("client:auth2", function() {
gapi.auth2.init({client_id: "my id edited out.apps.googleusercontent.com"});
});
</script>
<button onclick="authenticate().then(loadClient)">authorize and load</button>
<button onclick="execute()">execute</button>
</body>
</html>
Используя Linux, я пробовал это с простым веб-сервером: python -m SimpleHTTPServer 8000, а также веб-сервер apache2 (даже попытался включить https :)
В запросе «Войти с помощью учетной записи Google» я ввожу свой пароль, затем он просит «Выбрать учетную запись» (Выберите, как использовать Google :). Если я выберу адрес электронной почты, он не выдаст мне никаких ошибок, но все возвращаемые данные - это все 0 (в части результатов ответа JSON), вероятно, потому что это не канал youtube. Если я выберу канал youtube, он выйдет из строя со следующим журналом (но он действительно войдет в меня в Google):
mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create cb=gapi.loaded_0:250:89
mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create 1894056769-idpiframe.js:8:88
GET
XHR
https://accounts.google.com/o/oauth2/iframerpc [HTTP/2.0 403 Forbidden 65ms]
Error signing in Object { type: "tokenFailed", idpId: "google", error: "server_error" } localhost:8000:18:31
authenticate/<() localhost:8000:18
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200
Content Security Policy: Couldn't parse invalid host 'strict-dynamic' <unknown>
Content Security Policy: Couldn't parse invalid host 'report-sample' <unknown>
Content Security Policy: Ignoring "'unsafe-inline'" within script-src: nonce-source or hash-source specified <unknown>
GAPI client loaded for API localhost:8000:23:28
Execute error Object { result: Object, body: "{ "error": { "code": 401, …", headers: Object, status: 401, statusText: "Unauthorized" } localhost:8000:38:31
execute/<() localhost:8000:38
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200
Использование другой версии браузера дает аналогичную ошибку:
"Error signing in" Object { type: "tokenFailed", idpId: "google", error: "server_error" } localhost:8000:18
authenticate/<() localhost:8000:18
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200
"GAPI client loaded for API" localhost:8000:23
"Execute error" Object { result: Object, body: "{
"error": {
"code": 401,
"message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Login Required.",
"domain": "global",
"reason": "required",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED"
}
}
", headers: Object, status: 401, statusText: "Unauthorized" } localhost:8000:38
execute/<() localhost:8000:38
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200
Есть идеи?