2012-12-13 29 views
8

Ho cercato disperatamente di capirlo da solo, e non volevo venire a SO con questa domanda, ma sono alla fine (no grazie all'api/oauth docs).API di Google Analytics V3/OAuth 2

Sto lavorando in PHP e sto cercando di evitare di utilizzare le classi Google_Client e AnalyticsService utilizzando REST nel metodo analytics.data.ga.get.

STEP #1: Create an API Project for a Web Application

vado al api console e creare un progetto con servizi di analisi e ottenere un ID client OAuth e segreto.

Ho l'impressione di poter creare un ID cliente per un Installed Application o un Web Application perché sto eseguendo manualmente l'handshaking token iniziale. Per favore correggimi se sbaglio.

ho creare un ID client per le applicazioni web e ottenere il mio ID cliente xxxxxxxxxxxxxx.apps.googleusercontent.com, client segreto yyyyyyyyyyyyyyy, e il mio Redirect URI è http://localhost:9002

STEP #2: Request initial API access

entro in questo link; https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:9002&scope=https://www.googleapis.com/auth/analytics.readonly&access_type=offline

Il access_type=offline è perché sto utilizzando REST, e non si aspettano "l'utente" (io) per affrontare manualmente con reindirizzamenti/popup ogni volta che ho bisogno di un token rinfrescato.

La richiesta di cui sopra torna http://localhost:9002?code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI

Codice 4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI è il mio permesso di richiedere l'API Token.

STEP #3: Request First Token

A causa di problemi informatici della mia azienda, sono costretto a utilizzare PHP 5.2.17 e io non avere accesso a PHP cURL, quindi sto usando file_get_contents e stream_context_create.

Il primo token è richiesto con un PHP file_get_contents();

$opts = array(
    'http' => array(
     'method' => 'POST', 
     'header' => 'Content-Type: application/x-www-form-urlencoded', 
     'content' => 'code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&client_secret=yyyyyyyyyyyyyyy&redirect_uri=http://localhost:9002&grant_type=authorization_code' 
    ) 
); 

$context = stream_context_create($opts); 

$result = file_get_contents('https://accounts.google.com/o/oauth2/token', false, $context); 
var_dump($result); 

I parametri del contenuto devono essere in un'unica riga.

Il codice di cui sopra restituisce la mia access_token e refresh_token in formato JSON

string(195) "{ "access_token" : "ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro", "token_type" : "Bearer", "expires_in" : 3600, "refresh_token" : "1/8tXvdUKcSEcaaxVqqqqqqqqqqqqqoYpj2KSS9qwWI" }"

Il token di aggiornamento devo conservare in un luogo sicuro, come un DB o file txt protetta, che viene chiamato quando il mio access_token è scaduto.

STEP #4: Request Analytics Data

Ora da quanto ho capito, sono pronto a rotolare e dovrebbe essere in grado di usare i miei access_token per effettuare richieste a https://www.googleapis.com/analytics/v3/data/ga.

Faccio questo inviando questa richiesta;

$request = 'https://www.googleapis.com/analytics/v3/data/ga' . 
    '?ids=ga%3Aaaaaaaaa' . 
    '&start-date=2012-12-07' . 
    '&end-date=2012-12-09' . 
    '&metrics=ga%3Avisits'; 

$opts = array(
    'http' => array(
     'method' => 'GET', 
     'header' => 'Content-Type: application/x-www-form-urlencoded\r\n' . 
        'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro \r\n' 
     ) 
); 

$context = stream_context_create($opts); 

$result = file_get_contents($request, FALSE, $context); 
var_dump($result); 

Questa richiesta restituisce un errore 401 Unauthorized. Prendo questo nel senso che la mia richiesta è correttamente formata e che effettua la connessione a https://www.googleapis.com/analytics/v3/data/ga.

Inoltre, in base a questo documento Getting Full Quota, posso effettuare la richiesta con l'access_token nell'URL come questo;

$request = 'https://www.googleapis.com/analytics/v3/data/ga' . 
    '?ids=ga%3A48564799' . 
    '&access_token=ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro' . 
    '&start-date=2012-12-07' . 
    '&end-date=2012-12-09' . 
    '&metrics=ga%3Avisits'; 

$result = file_get_contents($request, FALSE); 

$result = json_decode($result); 

var_dump($result); 

Questa volta che ricevo 403 error, in cui Google include la risposta User does not have sufficient permissions for this profile.

QUESTION #1

Am che mi manca qualcosa nella console API o un processo per l'acquisizione gettone? Suppongo di non esserlo, perché in definitiva sto acquistando lo access_token=ya29 e il token di aggiornamento.

QUESTION #2 Forse sono completamente fuori di testa nel presupporre che posso farlo con semplice https reqests? Devo utilizzare le classi Google_Client e AnalyticsService? Non penso che sia così, ma forse mi sbaglio.

QUESTION #3 Devo utilizzare una "chiave" nella richiesta? &key=bbbbbbbbbbbbbbbb

QUESTION #4

Utilizzando PHP 5.2.17 mi sto perdendo qualcosa? (oltre a 5.3 o 5.4 stessi)

Ad esempio, in alcune versioni di PHP, in stream_context_create, l'intestazione deve essere in una matrice e non in una stringa, come questa;

$opts = array(
    'http' => array(
     'method' => 'GET', 
     'header' => array(
      'Content-Type: application/x-www-form-urlencoded', 
      'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro ' 
     ) 
    ) 
); 

Ma non penso che sia un problema nel mio caso. Sono solo curioso di sapere se queste richieste HTTP devono essere formate in modo diverso (senza usare il ricciolo).

Qualsiasi intuizione e opinione sarebbe molto apprezzata
+0

Forse si guarda nel 403 - errore di autorizzazioni insufficienti e assicurarsi che l'ONU/pw combo che si sta utilizzando ha accesso al profilo? –

+0

I token di accesso durano un'ora prima che debbano essere aggiornati. Stai ricevendo un nuovo token di accesso con il token di aggiornamento? –

+0

@jk Non sono sicuro di cosa intendi per nome utente e password combo. Il 'access_token' non rappresenta le credenziali? Non ho visto da nessuna parte nei documenti (oltre forse quando si usano le classi) che un/pw è necessario. Non ho assolutamente visto alcun parametro per richieste di ottenere semplici. – bmorenate

risposta

13

Ecco il mio oscuro errore che quasi mi ha dato un infarto.

In genere eseguo il lavoro di sviluppo in Chrome. E il mio browser Chrome è stato firmato nel mio account Gmail [email protected]. Tuttavia, il mio account di analisi, che è sotto il mio [email protected], era aperto in FireFox (prova a non ridere a fondo).

Non sono sicuro al 100% che sia corretto, ma penso che questo sia il flusso generale. Quando ho fatto STEP #2: Request initial API access, l'ho fatto nel mio browser Chrome. L'endpoint https://accounts.google.com/o/oauth2/auth stava autorizzando il mio account [email protected] E la mia richiesta API STEP # 4 https://www.googleapis.com/analytics/v3/data/ga stava cercando un profilo di analisi sotto il mio account [email protected] Che ovviamente non esiste.

Ho letteralmente sprecato 15 ore su questo. Questo è più stupido che provare a risolvere un aggiornamento ... e dimenticando di svuotare la cache.

Scusa per aver perso tempo.

EDIT GETTONI DI AGGIORNAMENTO

ho ancora una volta incorrere in problemi con questa API e ha trovato il modo duro che GA revocherà Aggiorna Gettoni se troppi clienti differenti utilizzano il token, almeno credo che era il problema

Ulteriori letture possono essere found here.

+0

Più uno sulla condivisione di questo. Lo terrò sempre a mente;). –

+0

Grazie. Ho dovuto tornare a questo post di nuovo per capire i miei errori con questa API. Non è mai facile – bmorenate

+0

Questi tipi di problemi sono silenziosi in comune con l'autenticazione, credo. Forse dovrebbe esserci un modo migliore per eseguirne il debug. – elif

10

Ho ottenuto un 403 oggi e ho trovato la causa: nella funzione get stavo usando l'ID account al posto dell'ID profilo. Passare all'ID profilo l'ha risolto per me.

+3

Sì, è corretto, è sempre "ID profilo" e non l'ID account o proprietà (che assomiglia a "UA-xxx"). L'ID profilo è per una proprietà web specifica e può essere trovato nella scheda Ammin-> Profili-> Impostazioni profilo, è un numero intero senza trattini. – bmorenate

+0

Qual è la differenza tra profilo e viste? – nbro

0

Potrebbe essere un problema con la richiesta CURL. Nel GoogleAnalyticsAPI.class.php > class Http > function curl (around line 720) aggiungere un'opzione di più per fermare CURL dal verificare i certificati dei peer:

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);