【问题标题】:Access Google analytics without consent page using JavaScript使用 JavaScript 访问未经同意页面的谷歌分析
【发布时间】:2014-05-24 07:00:15
【问题描述】:

我正在使用Atlasboard 创建仪表板。

我需要访问 Google 分析数据,例如页面浏览量等。我将在其中运行一些显示为 here 的查询。

有没有办法在不显示此同意页面的情况下访问我的 Google 分析数据?

我正在使用google-api-nodejs-client api。

我发现this post 有人提到使用服务帐户。但我无论如何都找不到在 JavaScript 中使用它。

任何帮助都会很棒!

【问题讨论】:

  • 据我所知,您不能将服务帐户与 JavaScript 一起使用。这很可能是由于安全问题。我建议切换到服务器端脚本语言
  • 好的,干杯!我将进行更多研究并在这里发布我的发现!

标签: javascript node.js google-analytics dashboard atlasboard


【解决方案1】:

我终于找到了解决这个问题的方法!!!这是解决方案:)

这是假设您已经拥有一个 Google 分析帐户,该帐户拥有网站数据(例如浏览量)并安装了 requestgoogleapis 模块。

首先,您需要在 console.developers.google.com 创建一个 Google 控制台帐户。

在 Google 控制台中:

  • 使用合适的名称创建项目,例如仪表板1.
  • 从左侧菜单打开 API 和身份验证 -> 打开 API 选项卡 -> 打开分析 API。
  • 打开凭据选项卡 -> 创建新的客户端 ID -> 选择服务帐户
  • 应自动下载密钥 -> 单击密钥并按照说明进行操作 -> 默认密码为“notasecret” -> 然后它将输出一个 .pem 文件
  • 服务帐户将有一个电子邮件地址,例如123434234324f34f5fd4ww5f@developer.gserviceaccount.com

现在转到您的 Google 分析帐户www.google.com/analytics

在仪表板作业中(使用 nodejs 的服务器端):

使用此代码:

    var fs = require('fs'),
        crypto = require('crypto'),
        request = require('request'); // This is an external module (https://github.com/mikeal/request)

    var authHeader = {
            'alg': 'RS256',
            'typ': 'JWT'
        },
        authClaimSet = {
            'iss': '#######SERVICE ACCOUNT EMAIL GOES HERE#######', // Service account email
            'scope': 'https://www.googleapis.com/auth/analytics.readonly', // We MUST tell them we just want to read data
            'aud': 'https://accounts.google.com/o/oauth2/token'
        },
        SIGNATURE_ALGORITHM = 'RSA-SHA256',
        SIGNATURE_ENCODE_METHOD = 'base64',
        GA_KEY_PATH = '#######DIRECTORY TO YOUR .PEM KEY#######', //finds current directory then appends private key to the directory
        gaKey;

    function urlEscape(source) {
        return source.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');
    }

    function base64Encode(obj) {
        var encoded = new Buffer(JSON.stringify(obj), 'utf8').toString('base64');
        return urlEscape(encoded);
    }

    function readPrivateKey() {
        if (!gaKey) {
            gaKey = fs.readFileSync(GA_KEY_PATH, 'utf8');
        }
        return gaKey;
    }

    var authorize = function(callback) {

        var self = this,
            now = parseInt(Date.now() / 1000, 10), // Google wants us to use seconds
            cipher,
            signatureInput,
            signatureKey = readPrivateKey(),
            signature,
            jwt;

        // Setup time values
        authClaimSet.iat = now;
        authClaimSet.exp = now + 60; // Token valid for one minute

        // Setup JWT source
        signatureInput = base64Encode(authHeader) + '.' + base64Encode(authClaimSet);

        // Generate JWT
        cipher = crypto.createSign('RSA-SHA256');
        cipher.update(signatureInput);
        signature = cipher.sign(signatureKey, 'base64');
        jwt = signatureInput + '.' + urlEscape(signature);

        // Send request to authorize this application
        request({
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            uri: 'https://accounts.google.com/o/oauth2/token',
            body: 'grant_type=' + escape('urn:ietf:params:oauth:grant-type:jwt-bearer') +
                '&assertion=' + jwt
        }, function(error, response, body) {
            if (error) {
                console.log(error);
                callback(new Error(error));
            } else {
                var gaResult = JSON.parse(body);
                if (gaResult.error) {
                    callback(new Error(gaResult.error));
                } else {
                    callback(null, gaResult.access_token);
                    console.log(gaResult);
                    console.log("Authorized");
                    ###########IF IT REACHES THIS STAGE THE ACCOUNT HAS BEEN AUTHORIZED##############
                }
            }
        });

    };



    var request = require('request'),
        qs = require('querystring');

    authorize(function(err, token) {
        if (!err) {
            // Query the number of total visits for a month
            ############requestConfig################
            var requestConfig = {
                'ids': 'ga:#######PROJECT ID GOES HERE#######',
                'dimensions': 'ga:country',
                'metrics': 'ga:users',
                'sort': '-ga:users',
                'start-date': '2014-04-08',
                'end-date': '2014-04-22',
                'max-results': '10'
            };

            request({
                method: 'GET',
                headers: {
                    'Authorization': 'Bearer ' + token // Here is where we use the auth token
                },
                uri: 'https://www.googleapis.com/analytics/v3/data/ga?' + qs.stringify(requestConfig)
            }, function(error, resp, body) {
                console.log(body);
                var data = JSON.parse(body);
                console.log(data);
            });
        }
    });

记得输入您自己的服务电子邮件帐户、GA_KEY_PATH 和 IDS

您可以通过更改 requestConfig 来 Google 分析数据。我使用了这个 Google Analytics 查询工具来帮助我:http://ga-dev-tools.appspot.com/explorer/

然后应该在控制台中输出数据。

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    除了 smj2393 的回答,对于那些想要创建特定 URL 来检索 Google Analytics API 提供的 JSON 的人,这里是一个 Node Express 路由的示例。您需要安装官方的 Google API Node npm 包 (https://www.npmjs.org/package/googleapis)。

    var google = require('googleapis');
    var analytics = google.analytics('v3');
    var ENV = process.env;
    
    //get key.p12 in Google Developer console
    //Extract it with : openssl pkcs12 -in key.p12 -nodes -nocerts > key.pem
    //Get GOOGLE_API_EMAIL in Google Developer console (Service Account)
    //Get GOOGLE_ANALYTICS_VIEW_ID in Google Analytics Console : Admin -> View -> View Parameters -> View ID
    //Add GOOGLE_API_EMAIL in the Google Analytics account users
    
    var authClient = new google.auth.JWT(
        ENV.GOOGLE_API_EMAIL,
        './keys/googlekey.pem', //path to .pem
        null,
        // Scopes can be specified either as an array or as a single, space-delimited string
        ['https://www.googleapis.com/auth/analytics.readonly']);
    
    module.exports = function(req, res, next) {
      var startDate = (req.query.start_date) ? req.query.start_date : '7daysAgo';
      var endDate = (req.query.end_date) ? req.query.end_date : 'yesterday';
    
      authClient.authorize(function(err, tokens) {
        if (err) {
          console.log(err);
          return;
        }
    
        // Make an authorized request to list analytics files.
        // list of dimensions and metrics : https://developers.google.com/analytics/devguides/reporting/core/dimsmets
        analytics.data.ga.get({
          auth: authClient,
          "ids":'ga:'+ENV.GOOGLE_ANALYTICS_VIEW_ID,
          "start-date":startDate,
          "end-date":endDate,
          "metrics":"ga:sessions,ga:pageviews",
          "dimensions":"ga:deviceCategory"
    
          }, function(err, result) {
            console.log(err);
            console.log(result);
            if(!err){
              res.json(result);
            }
            else{
              next();
            }
        });
      });
    }
    

    此路由将显示一个 JSON,表示按设备(台式机、移动设备和平板电脑)的会话数和 pageViews 数。您可以使用 GET 参数传递 start_date 或 end_date。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      查看 Atlasboard Atlassian 软件包中的 google-analytics 作业。它使用Google APIs Node.js Client npm 包:

      https://bitbucket.org/atlassian/atlasboard-atlassian-package/src/master/jobs/google-analytics/google-analytics.js?at=master&fileviewer=file-view-default

      您可以使用它与实时或经典的 Google Analytics API 对话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 2015-09-28
        相关资源
        最近更新 更多