尝试使用 YouTube Analytics API 检索指标时被禁止访问 403
Getting 403 forbidden when trying to retrieve metrics using YouTube Analytics API
我是 Google Analytics api 的新手,正在关注此 tutorial 以获取 estimatedMinutesWatched
和 averageViewDuration
,但我总是遇到 403 forbidden代码作为响应。
我想先问一下,如何解决这个问题,我们只能从我们自己的频道中检索数据吗?其次,有没有一种方法可以在不指定频道 ID 的情况下检索指标?我可能想从不同频道的许多视频中检索指标,但我觉得没有必要指定频道。谢谢!
下面是我目前拥有的代码:
const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');
const { GoogleSpreadsheet } = require('google-spreadsheet');
const scope = ['https://www.googleapis.com/auth/youtube.readonly'];
const creds = require('./client_secret.json');
const doc = new GoogleSpreadsheet('1YNzey4giSw-29oFGPCfGLBkMHCFB1o2oLr3qLIQZTVQ');
(async () => {
await doc.useServiceAccountAuth(creds);
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0];
const rows = await sheet.getRows();
// const ids = rows.map(r => r.id).join(',');
const ids = 'IKiAiD3SONw';
fs.readFile("oauth_client_creds.json", (err, content) => {
if (err) {
return console.log("Cannot load client secret file:", err);
}
// Authorize a client with credentials, then make API call.
const credentials = JSON.parse(content);
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id,
client_secret,
redirect_uris[0]
);
const authUrl = oAuth2Client.generateAuthUrl({
access_type: "offline",
scope: scope
});
console.log("Visit this URL to authorize this app:", authUrl);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Enter the auth code from that URL: ", code => {
rl.close();
oAuth2Client.getToken(code, (err, token) => {
oAuth2Client.setCredentials(token);
callApi(oAuth2Client);
});
});
});
let callApi = auth => {
const youtubeAnalytics = google.youtubeAnalytics({ version: "v2", auth });
youtubeAnalytics.reports
.query({
startDate: "2019-01-01",
endDate: "2021-12-31",
ids: "channel==UCbXm_tde_rLHG8gv48wSULw",
filters: `video==${ids}`,
dimensions: "video",
metrics: "estimatedMinutesWatched,averageViewDuration"
})
.then(async response => {
console.log(response);
console.log(response.data.rows);
response.data.rows.forEach(async (row, index) => {
rows[index].minutes_watched = row[1];
rows[index].avd = row[2];
await rows[index].save();
});
})
.catch(error => console.log("The API returned an error: ", error.message));
};
})();
由于您总是收到 403 错误,听起来您没有正确传递您的 API 凭据,或者您正在请求其他人的频道信息n。
要回答您的问题,您只能检索自己频道的指标,或者如果其他用户已授权您的应用程序。
您查询的频道似乎格式不正确,或者尚未完成设置。我认为 UCbXm_tde_rLHG8gv48wSULw 不应该有下划线。在您的 Youtube 帐户上创建一个测试频道并复制 ID。
解决 403 错误:
- 确保您已创建 API 密钥
- 确保您已将凭据正确保存在 json 文件中
- 确保文件的扩展名为 .json
- 确保您请求的是自己的频道 ID
我还会查看以下内容:
我是 Google Analytics api 的新手,正在关注此 tutorial 以获取 estimatedMinutesWatched
和 averageViewDuration
,但我总是遇到 403 forbidden代码作为响应。
我想先问一下,如何解决这个问题,我们只能从我们自己的频道中检索数据吗?其次,有没有一种方法可以在不指定频道 ID 的情况下检索指标?我可能想从不同频道的许多视频中检索指标,但我觉得没有必要指定频道。谢谢!
下面是我目前拥有的代码:
const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');
const { GoogleSpreadsheet } = require('google-spreadsheet');
const scope = ['https://www.googleapis.com/auth/youtube.readonly'];
const creds = require('./client_secret.json');
const doc = new GoogleSpreadsheet('1YNzey4giSw-29oFGPCfGLBkMHCFB1o2oLr3qLIQZTVQ');
(async () => {
await doc.useServiceAccountAuth(creds);
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0];
const rows = await sheet.getRows();
// const ids = rows.map(r => r.id).join(',');
const ids = 'IKiAiD3SONw';
fs.readFile("oauth_client_creds.json", (err, content) => {
if (err) {
return console.log("Cannot load client secret file:", err);
}
// Authorize a client with credentials, then make API call.
const credentials = JSON.parse(content);
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id,
client_secret,
redirect_uris[0]
);
const authUrl = oAuth2Client.generateAuthUrl({
access_type: "offline",
scope: scope
});
console.log("Visit this URL to authorize this app:", authUrl);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Enter the auth code from that URL: ", code => {
rl.close();
oAuth2Client.getToken(code, (err, token) => {
oAuth2Client.setCredentials(token);
callApi(oAuth2Client);
});
});
});
let callApi = auth => {
const youtubeAnalytics = google.youtubeAnalytics({ version: "v2", auth });
youtubeAnalytics.reports
.query({
startDate: "2019-01-01",
endDate: "2021-12-31",
ids: "channel==UCbXm_tde_rLHG8gv48wSULw",
filters: `video==${ids}`,
dimensions: "video",
metrics: "estimatedMinutesWatched,averageViewDuration"
})
.then(async response => {
console.log(response);
console.log(response.data.rows);
response.data.rows.forEach(async (row, index) => {
rows[index].minutes_watched = row[1];
rows[index].avd = row[2];
await rows[index].save();
});
})
.catch(error => console.log("The API returned an error: ", error.message));
};
})();
由于您总是收到 403 错误,听起来您没有正确传递您的 API 凭据,或者您正在请求其他人的频道信息n。
要回答您的问题,您只能检索自己频道的指标,或者如果其他用户已授权您的应用程序。
您查询的频道似乎格式不正确,或者尚未完成设置。我认为 UCbXm_tde_rLHG8gv48wSULw 不应该有下划线。在您的 Youtube 帐户上创建一个测试频道并复制 ID。
解决 403 错误:
- 确保您已创建 API 密钥
- 确保您已将凭据正确保存在 json 文件中
- 确保文件的扩展名为 .json
- 确保您请求的是自己的频道 ID
我还会查看以下内容: