node.js - Node : Google Analytics data via service account

标签 node.js google-analytics google-oauth google-analytics-api service-accounts

更新:我已经把代码变成了 NPM module .

我已经努力创建了一个 JWT token for a service account ,并且我可以访问用户数据,但我想获取我的分析数据以使用它来驱动我网站上的内容。

注意:我不知道是否有比这更好的方法,但现有的 npm 工具似乎需要您输入密码。因此,我最终使用 REST 调用而不是 gapi 工具。

这是我得到的错误

{ error: 
   { errors: [ [Object] ],
     code: 403,
     message: 'User does not have any Google Analytics account.' } }

这是我正在使用的用于用户数据的代码。

var oauth2Client = new OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

var scopes = [
  'https://www.googleapis.com/auth/plus.me',
  'https://www.googleapis.com/auth/analytics.readonly'
];

var d = new Date();
var seconds = d.getTime() / 1000 + 60*59;

var SERVICE_CLIENT_ID = "xxxxxxx-0h21osagsg02eqk45me6ts7jn3kf0vfr.apps.googleusercontent.com";
var SERVICE_EMAIL     = "xxxxxxx-0h21osagsg02eqk45me6ts7jn3kf0vfr@developer.gserviceaccount.com"

var claim_set = {
    "iss": SERVICE_EMAIL,
    "scope": 'https://www.googleapis.com/auth/analytics.readonly',
    "aud": 'https://www.googleapis.com/oauth2/v3/token',
    "exp":seconds,
    "iat":seconds
};

var algorithm = {"alg":"RS256","typ":"JWT"};
var private_key = fs.readFileSync('privatekey.pem');

var signature = jwt.sign(claim_set, private_key, { algorithm: algorithm.alg});

var post_obj = {
    grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
    assertion: signature
};

request.post({
    url:'https://www.googleapis.com/oauth2/v3/token',
    form: post_obj
}, function(err, data) {
    if (err) throw err;
    var body = JSON.parse(data.body);
    var token = body.access_token;
    // console.log(token);
    console.log("Token: ",token);


    var auth_obj = {
        'auth': {
            'bearer': token
        }
    };
    // THIS CODE DOES RETURN INFORMATION
    // request.get('https://www.googleapis.com/plus/v1/people/me', auth_obj, function(err, data) {
    //  if (err) throw err;
    //  console.log(JSON.parse(data.body));
    // });

    var report = {
        'ids': 'ga:78624107',
        'start-date': '2014-10-01',
        'end-date': '2014-12-31',
        'metrics': 'ga:sessions,ga:bounces'
    };
    var report2 = 'metrics=ga%253Ausers&start-date=2015-02-24&end-date=2015-03-10&max-results=50'
    var report3 = 'ids=ga:78624107&start-date=2015-02-24&end-date=2015-03-10&metrics=ga:users'

    request.get('https://www.googleapis.com/analytics/v3/data/ga?'+report3, auth_obj, function(err, data) {
        if (err) throw err;
        console.log(JSON.parse(data.body));
    });
});

最佳答案

默认情况下,服务帐户没有 Google Analytics(分析)帐户。

进入 Google Analytics 网站的管理部分,将服务帐户电子邮件地址添加为 ACCOUNT 级别的用户,它必须在帐户级别。然后该服务帐户将有权读取您的 Google 分析数据。

关于node.js - Node : Google Analytics data via service account,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28960250/

相关文章:

node.js - 从动态模式获取数据

node.js - 错误: TypeError: "listener" argument must be a function in Node 7. 7.2

android - 将混淆器与谷歌分析 android 一起使用

google-chrome-extension - Google Universal Analytics - 开发和调试工具

google-chrome - 我可以使用Web App的私钥证书来签署JWT吗?

javascript - 如何在客户端(AngularJS)加密密码,将其发送到服务器(expressJS)并在服务器上解密?

node.js - 在 stdin 中写入生成的 child_process 不起作用

reactjs - 未捕获的类型错误 : Cannot read properties of undefined (reading 'location' )

ruby-on-rails - 使用 Garb 获取 Google Analytics 配置文件

google-api - 使用 OAuth2 和 nodemailer 从我的 gmail 帐户发送电子邮件