2014-04-10 18 views
8

Sto creando un dashboard utilizzando Atlasboard.Accesso a Google Analytics senza la pagina di consenso tramite JavaScript

Ho bisogno di accedere ai dati di analisi di Google come le visualizzazioni di pagina ecc. Dove eseguirò alcune domande mostrate here.

C'è un modo per accedere ai miei dati di Google Analytics senza che venga visualizzata questa pagina di consenso? enter image description here

Sto usando l'api google-api-nodejs-client.

Ho trovato this post dove qualcuno menziona utilizzando un account di servizio. Ma non riesco a trovare comunque per farlo funzionare in JavaScript.

Qualsiasi aiuto sarebbe fantastico!

+1

A mia conoscenza non è possibile utilizzare un account di servizio con JavaScript. Questo è molto probabilmente dovuto a problemi di sicurezza. Suggerisco di passare a un linguaggio di scripting lato server – DaImTo

+0

Ok, evviva! Farò un po 'più di ricerca e pubblicherò i miei risultati qui! – smj2393

risposta

10

Sono finalmente riuscito a trovare una soluzione a questo problema !!! Ecco la soluzione :)

Ciò presuppone che si dispone già di un account Google Analytics, che ha i dati del sito, quali punti di vista e avere i moduli request e googleapis installati.

Per prima cosa è necessario creare un account di console Google allo console.developers.google.com.

Alla console Google:

  • creare un progetto con un nome adatto per esempio dashboard1.
  • Apri API & dal menu a sinistra -> apri scheda API -> attiva l'API di analisi.
  • Apri la scheda credenziali -> crea nuovo id client -> seleziona account servizio
  • Una chiave dovrebbe automaticamente scaricare -> fare clic sulla chiave e seguire le istruzioni -> la password predefinita è "notasecret" -> sarà quindi emettere un file .pem
  • L'account di servizio avrà un indirizzo e-mail es. [email protected]

Passare al tuo account Google Analytics a www.google.com/analytics:

Nel lavoro cruscotto (lato server utilizzando nodejs):

di questo codice:

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); 
      }); 
     } 
    }); 

ricordarsi di INPUT SEI PROPRIO CONTO servizio e-mail, GA_KEY_PATH e IDS

È possibile dati di analisi Google modificando la richiesta stConfig. Ho utilizzato questo strumento di query di Google Analytics per aiutarmi: http://ga-dev-tools.appspot.com/explorer/

I dati devono quindi essere emessi nella console.

Spero che questo aiuti :)

4

Oltre alla risposta di smj2393, e per chi vuole creare un URL specifico per recuperare il JSON fornita dalle API di Google Analytics, ecco un esempio di un nodo espresso itinerario. Devi installare il pacchetto Node NPM API ufficiale di Google (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(); 
     } 
    }); 
    }); 
} 

Questo percorso mostrerà un JSON che rappresenta il numero di sessioni e pagine visualizzate per dispositivo (desktop, cellulare e tablet). Puoi passare la data_inizio o la fine_data con i parametri GET.

Spero che questo aiuto.