Node.js:Google Analytics API:如何使用 "service account" 发出授权的只读管理 API 请求?
Node.js: Google Analytics API: How do I make authorized read-only Management API requests with a "service account"?
我正在 Raspberry Pi 上创建一个 LED 网格自动收报机 运行,它将通过 Google 分析 API 使用 Node.js。它将统计来自多个网站的计数,然后在网格中滚动统计数据。
我可以使用帮助通过 Management API 列出帐户项目,特别是帐户 ID、属性 ID 和视图 ID,以节省手动工作。我在这方面遇到错误(见下文)。
这似乎是 Service Account
的工作。设置 Google 云项目 here, then setting up a service account here 后,我将下载授权中包含的电子邮件地址添加为 属性 用户(read/analyze 权限),适用于 Google ] 分析管理设置。有了这个,我可以成功检索已知视图 ID 的 Analytics 数据(在 Google Analytics 管理员中手动查找,ID 显示在视图设置页面上),用这个:
'use strict';
//////////////
// includes //
//////////////
var google = require('googleapis');
var fs = require('fs');
var Promise = require('promise');
//////////////
// settings //
//////////////
//the service account auth file downloaded from Google Cloud
var serviceAccountInfoPath = './secrets.json';
//view id with 'ga:' prefix
//I want this to soon be an array of ids looked up by an authenticated API requested
var viewID = 'ga:999999999';
////////
// go //
////////
// go get it all
var go = function() {
loadServiceAccountInfo()
.then(function(serviceAccountInfo) {
return getJwtClient(serviceAccountInfo);
})
.then(function(jwtClient) {
var client = jwtClient;
var analytics = google.analytics('v3');
return getThisYearViewAnalytics(client, analytics, viewID);
})
.then(function(result) {
console.log('total users: ' + result.totalsForAllResults["ga:users"]);
console.log('total sessions: ' + result.totalsForAllResults["ga:pageviews"]);
console.log('total pageviews: ' + result.totalsForAllResults["ga:sessions"]);
})
.catch(function(error) {
console.log("go promise chain failed", error);
});
};
// load the Google service account login details
var loadServiceAccountInfo = function() {
return new Promise(function(resolve, reject) {
fs.readFile(serviceAccountInfoPath, 'utf8', function(error, serviceAccountInfoData) {
if(error) {
console.log('loadServiceAccountInfo failed: ' + error);
reject(error);
} else {
var serviceAccountInfo = JSON.parse(serviceAccountInfoData);
resolve(serviceAccountInfo);
}
});
});
};
//return a an authenticated Google API client
var getJwtClient = function(serviceAccountInfo) {
return new Promise(function(resolve, reject) {
var jwtClient = new google.auth.JWT(serviceAccountInfo.client_email, null, serviceAccountInfo.private_key, ['https://www.googleapis.com/auth/analytics.readonly'], null);
jwtClient.authorize(function (error, tokens) {
if (error) {
console.log('getJwtClient failed: ' + error);
reject(error);
} else {
resolve(jwtClient);
}
});
});
};
//this is a test query to get the last year of data for a single view id
var getThisYearViewAnalytics = function(client, analytics, viewID) {
return new Promise(function(resolve, reject) {
analytics.data.ga.get({
'auth': client,
'ids': viewID,
'metrics': 'ga:sessions,ga:pageviews,ga:users',
'start-date': '365daysAgo',
'end-date': 'today',
},
function (error, response) {
if (error) {
console.log('getThisYearViewAnalytics failed: ' + error);
reject(error);
} else {
resolve(response);
}
});
});
};
//ready, set, go!
go();
这是一个很好的进展,但我开始 运行 在尝试 list accounts 时遇到身份验证错误,其中需要 id 来列出视图(如果您知道,这也会给出相同的错误帐户 ID)。
我猜答案是我需要使用 OAuth,但如果需要,怎么办?服务帐户不再是一种选择吗?当服务帐户和硬件设备没有通常的 OAuth 来回用户交互时,我不确定我将如何处理这个问题。也许我只是在上面使用的 JWT 客户端中设置了错误?
更新:
为将来阅读本文的人添加信息:确保正确设置了阅读权限后,我能够使用以下内容列出 Google 个分析帐户:
analytics.management.accounts.list({'auth': client}, function(error, response) {
console.log(error);
console.log(response);
});
注意:这不遵循我在上面使用的承诺模式,但给出了 node.js googleapis 模块如何工作的想法。
将服务帐户与 Google Analytics api 一起使用时。您需要确保在帐户级别添加权限。我不知道为什么它需要是帐户级别我只知道它不能以任何其他方式正常工作。
我正在 Raspberry Pi 上创建一个 LED 网格自动收报机 运行,它将通过 Google 分析 API 使用 Node.js。它将统计来自多个网站的计数,然后在网格中滚动统计数据。
我可以使用帮助通过 Management API 列出帐户项目,特别是帐户 ID、属性 ID 和视图 ID,以节省手动工作。我在这方面遇到错误(见下文)。
这似乎是 Service Account
的工作。设置 Google 云项目 here, then setting up a service account here 后,我将下载授权中包含的电子邮件地址添加为 属性 用户(read/analyze 权限),适用于 Google ] 分析管理设置。有了这个,我可以成功检索已知视图 ID 的 Analytics 数据(在 Google Analytics 管理员中手动查找,ID 显示在视图设置页面上),用这个:
'use strict';
//////////////
// includes //
//////////////
var google = require('googleapis');
var fs = require('fs');
var Promise = require('promise');
//////////////
// settings //
//////////////
//the service account auth file downloaded from Google Cloud
var serviceAccountInfoPath = './secrets.json';
//view id with 'ga:' prefix
//I want this to soon be an array of ids looked up by an authenticated API requested
var viewID = 'ga:999999999';
////////
// go //
////////
// go get it all
var go = function() {
loadServiceAccountInfo()
.then(function(serviceAccountInfo) {
return getJwtClient(serviceAccountInfo);
})
.then(function(jwtClient) {
var client = jwtClient;
var analytics = google.analytics('v3');
return getThisYearViewAnalytics(client, analytics, viewID);
})
.then(function(result) {
console.log('total users: ' + result.totalsForAllResults["ga:users"]);
console.log('total sessions: ' + result.totalsForAllResults["ga:pageviews"]);
console.log('total pageviews: ' + result.totalsForAllResults["ga:sessions"]);
})
.catch(function(error) {
console.log("go promise chain failed", error);
});
};
// load the Google service account login details
var loadServiceAccountInfo = function() {
return new Promise(function(resolve, reject) {
fs.readFile(serviceAccountInfoPath, 'utf8', function(error, serviceAccountInfoData) {
if(error) {
console.log('loadServiceAccountInfo failed: ' + error);
reject(error);
} else {
var serviceAccountInfo = JSON.parse(serviceAccountInfoData);
resolve(serviceAccountInfo);
}
});
});
};
//return a an authenticated Google API client
var getJwtClient = function(serviceAccountInfo) {
return new Promise(function(resolve, reject) {
var jwtClient = new google.auth.JWT(serviceAccountInfo.client_email, null, serviceAccountInfo.private_key, ['https://www.googleapis.com/auth/analytics.readonly'], null);
jwtClient.authorize(function (error, tokens) {
if (error) {
console.log('getJwtClient failed: ' + error);
reject(error);
} else {
resolve(jwtClient);
}
});
});
};
//this is a test query to get the last year of data for a single view id
var getThisYearViewAnalytics = function(client, analytics, viewID) {
return new Promise(function(resolve, reject) {
analytics.data.ga.get({
'auth': client,
'ids': viewID,
'metrics': 'ga:sessions,ga:pageviews,ga:users',
'start-date': '365daysAgo',
'end-date': 'today',
},
function (error, response) {
if (error) {
console.log('getThisYearViewAnalytics failed: ' + error);
reject(error);
} else {
resolve(response);
}
});
});
};
//ready, set, go!
go();
这是一个很好的进展,但我开始 运行 在尝试 list accounts 时遇到身份验证错误,其中需要 id 来列出视图(如果您知道,这也会给出相同的错误帐户 ID)。
我猜答案是我需要使用 OAuth,但如果需要,怎么办?服务帐户不再是一种选择吗?当服务帐户和硬件设备没有通常的 OAuth 来回用户交互时,我不确定我将如何处理这个问题。也许我只是在上面使用的 JWT 客户端中设置了错误?
更新:
为将来阅读本文的人添加信息:确保正确设置了阅读权限后,我能够使用以下内容列出 Google 个分析帐户:
analytics.management.accounts.list({'auth': client}, function(error, response) {
console.log(error);
console.log(response);
});
注意:这不遵循我在上面使用的承诺模式,但给出了 node.js googleapis 模块如何工作的想法。
将服务帐户与 Google Analytics api 一起使用时。您需要确保在帐户级别添加权限。我不知道为什么它需要是帐户级别我只知道它不能以任何其他方式正常工作。