Node.js:Google AnalyticsAPI:如何使用“服务帐户”进行授权的只读pipe理API请求?

我正在创build在Raspberry Pi上运行的LED网格代码,它将使用Node.js通过Google Analytics API收集Google Analytics数据。 它将统计多个网站的统计数据,然后在网格中滚动统计数据。

我可以使用帮助列出帐户项目通过pipe理API ,特别是帐户ID,财产ID和查看ID保存手动工作。 我在这方面遇到了错误(见下文)。

这似乎是一个Service Account的工作。 在此处设置Google Cloud项目,然后在此处设置服务帐户后,我将在下载的授权中包含的电子邮件地址添加为属性用户(读取/分析权限),适用于Google Analyticspipe理设置。 借此,我可以成功检索Google Analytics数据以获取已知视图ID(在Google Analyticspipe理员中手动查找,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(); 

这是一个很好的进展,但是当尝试列出账户时,我开始遇到身份validation错误,需要列出视图的ID(如果您知道账户ID,也会出现相同的错误)。

我猜测答案是我需要使用OAuth,但是如果是这样的话,怎么办? 服务帐户不再是一个选项吗? 我不确定当服务帐户和硬件设备没有通常的OAuth来回用户交互时,我将如何继续处理此问题。 也许我只是在上面使用的JWT客户端中设置错误?

UDPATE:

为未来读者提供的信息:确保读取权限设置正确后,我可以使用以下方式列出Google Analytics(分析)帐户:

 analytics.management.accounts.list({'auth': client}, function(error, response) { console.log(error); console.log(response); }); 

注意:这不符合我上面使用的承诺模式,但给出了node.js googleapis模块的工作原理。

在Google Analytics API中使用服务帐户时。 您需要确保您在帐户级别添加权限。 我不知道为什么它需要是帐户级别,我只是知道它不能正常工作。