I finally managed to find a solution to this problem !!! Here is the solution :)
It is assumed that you already have a Google Analytics account that has site data such as submissions, and request and googleapis .
First you need to create a Google console account at console.developers.google.com .
In the Google console:
- Create a project with a suitable name, for example. dashboard1.
- Open the API and Auth from the menu on the left -> Open the API API tab -> enable analytics API.
- Open the credentials tab -> create a new customer ID -> select a service account
- The key should be loaded automatically β click on the key and follow the instructions β the default password is βnotasecret" β it gives the .pem file
- The service account will have an email address, for example. 123434234324f34f5fd4ww5f@developer.gserviceaccount.com
Now go to your Google Analytics account at www.google.com/analytics :
In the control panel task (server side using nodejs):
Use this code:
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); }); } });
REMEMBER TO LOG IN TO YOUR OWN EMAIL ACCOUNT, GA_KEY_PATH AND IDS
Google Analytics data can be modified by modifying requestConfig. I used this Google Analytics query tool to help me: http://ga-dev-tools.appspot.com/explorer/
Then the data should be displayed on the console.
Hope this helps :)