2013-02-08 17 views
29

Tutto quello che sto cercando di fare è leggere un foglio di calcolo di Google da un sito web. Ho letto e riletto i documenti dell'API di Google Drive e tutto ciò che riguarda Google Drive PHP su Stack Overflow e non riesco ancora a raggiungere la zona finale.Come faccio a leggere un foglio di calcolo di Google Drive in PHP?

Ecco che cosa ho fatto:

  1. Conosci l'API Console di Google e:
    1. Enabled "Unità API" e "Unità SDK" sotto 'Servizi';
    2. Creato un ID client OAuth 2.0 in "Accesso API". Sotto "Client ID per applicazioni web", la console mi ha fornito "ID client", "Indirizzo email", "Segreto client", "URI di reindirizzamento" e "Origini JavaScript";
  2. Scaricato la "Libreria client PHP API di Google";
  3. Aperto il documento Google Drive (foglio di calcolo) e fatto clic su "Condividi" per ottenere la "chiave" del documento;
  4. impostare il codice seguente:
<?php 
session_start(); 
require_once 'lib/gapi/Google_Client.php'; 
require_once 'lib/gapi/contrib/Google_DriveService.php'; 

define('GDRIVE_CLIENT_ID', '<API Console - API Access - Client ID>'); 
define('GDRIVE_CLIENT_SECRET', '<API Console - API Access - Client secret>'); 
define('GDRIVE_REDIRECT_URIS', '<API Console - API Access - Redirect URIs>'); 

define('GDRIVE_SCOPE_01', 'h t t p s://www.googleapis.com/auth/drive'); 
define('GDRIVE_SCOPE_02', 'h t t p s://www.googleapis.com/auth/drive.apps.readonly'); 
define('GDRIVE_SCOPE_03', 'h t t p s://www.googleapis.com/auth/drive.file'); 
define('GDRIVE_SCOPE_04', 'h t t p s://www.googleapis.com/auth/drive.metadata.readonly'); 
define('GDRIVE_SCOPE_05', 'h t t p s://www.googleapis.com/auth/drive.readonly'); 
define('GDRIVE_FILE_KEY', '<'key' given from 'sharing' document>'); 

$client = new Google_Client(); 
$client->setClientId(GDRIVE_CLIENT_ID); 
$client->setClientSecret(GDRIVE_CLIENT_SECRET); 
$client->setRedirectUri(GDRIVE_REDIRECT_URIS); 
$client->setScopes(array(GDRIVE_SCOPE_01, GDRIVE_SCOPE_02, GDRIVE_SCOPE_03, GDRIVE_SCOPE_04, GDRIVE_SCOPE_05)); 

try { 
    $file = $service->files->get(GDRIVE_FILE_KEY); 
    echo "Title: ", $file->getTitle(); 
    echo "Description: ", $file->getDescription(); 
    echo "MIME type: ", $file->getMimeType(); 
} catch (Exception $e) { 
    echo "An error occurred: ", $e->getMessage(); 
} 
?> 

Tutto funziona bene (nessun errore in ogni caso) fino a quando la $service->files->get(GDRIVE_FILE_KEY) chiamata che fa scattare l'eccezione:

Si è verificato un errore: Errore chiama GET https://www.googleapis.com/drive/v2/files: (403) Limite giornaliero per l'utilizzo non autenticato superato. L'uso continuato richiede l'iscrizione.

Cosa sto sbagliando? Mi sono tirato fuori i capelli (beh, quello che era rimasto).

+0

Ovviamente, i riferimenti a "h t t p s: //" sono in realtà "https: //", ma StackOverflow si è lamentato della pubblicazione dei collegamenti. – Kiser

+0

Utilizzare il ** "{}" pulsante della barra degli strumenti ** per formattare il codice come codice. –

+0

Invece di fare pazzesco HTML nella tua risposta, dovresti usare 4 spazi per indentare il tuo codice. La colorazione e l'evidenziazione saranno automaticamente applicati. – j0k

risposta

7

Controllare lo Google Drive PHP Quickstart. Non hai effettivamente autorizzato il tuo cliente. A partire da $authUrl = $client->createAuthUrl();

Tutte le richieste di Google Drive richiedono un'autorizzazione di qualche tipo.

+0

Se l'utente esegue questo script, ha già effettuato l'autenticazione Apache locale. Posso riutilizzare lo stesso GDRIVE_CLIENT_ID e GDRIVE_CLIENT_SECRET? Quando viene eseguito lo script, desidero leggere incondizionatamente il foglio di calcolo di Google Drive. Non voglio che il visitatore debba re-autenticarsi. – Kiser

+0

L'autorizzazione dell'API non è uguale all'autenticazione. L'utente deve concedere l'accesso alla tua app per leggere il file. –

+2

Tuttavia, il file Google è ** MY ** file. Lo mantengo. Voglio solo ** MY ** script PHP per leggerlo. È come se avessi un file * incluso * su Google Drive. Voglio che il mio script legga incondizionatamente questo documento con i miei codici di accesso di Google Drive. Il visitatore non ha bisogno di accedere. Lui/lei non può ancora modificare il mio documento; possono solo vederlo. – Kiser

54

C'è anche una soluzione molto più semplice, ma meno pulita, se non vuoi preoccuparti con l'API o l'autenticazione di Google.

  1. Vai al tuo foglio di calcolo in Google Drive.
  2. Vai a file -> Pubblica sul Web
  3. Seleziona il foglio di lavoro corretto e assicurati di abilitare sempre la casella di controllo.
  4. Sempre nella stessa casella è possibile ottenere un collegamento .csv al foglio di lavoro.

Ora è possibile accedere ai contenuti come qualsiasi altro file csv sul Web. Ecco alcuni esempi di codice:

$spreadsheet_url="https://docs.google.com/spreadsheet/pub?key=<somecode>&single=true&gid=0&output=csv"; 

if(!ini_set('default_socket_timeout', 15)) echo "<!-- unable to change socket timeout -->"; 

if (($handle = fopen($spreadsheet_url, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $spreadsheet_data[] = $data; 
    } 
    fclose($handle); 
} 
else 
    die("Problem reading csv"); 
+1

Stavo per tuffarmi nella scrittura del codice di scrittura HTML quando ho trovato questa risposta. Grazie! – KennethJ

+0

Sono sicuro al 99% che questo non funzioni più, a meno che mi manchi qualcosa di molto ovvio. Sembra che abbiano rimosso la funzionalità CSV dalla finestra di dialogo Condividi. –

+7

È vero, questa opzione è stata rimossa da Google. Ma c'è ancora una soluzione qui: [collegamento] http://stackoverflow.com/questions/21189665/new-google-spreadsheets-publish-limitation [/ link] file CSV: 'https://docs.google. it/spreadsheets/d//export? gid = 0 & format = csv' – Ben

2

È necessario utilizzare OAuth, se non Google solo permetterà di fare alcune richieste.

Se tutto ciò che si vuole fare è leggere i dati da un foglio di calcolo di google o scrivere dati in esso, è sufficiente utilizzare l'api del foglio di calcolo. Controlla php-google-spreadsheet-client.

1

Se si desidera che il proprio file venga letto, è necessario un account di servizio anziché un "ID client per applicazioni Web". Mi è stato segnalato questo problema me stesso per modo lungo e questo mi ha portato il sollution: https://developers.google.com/drive/web/service-accounts

+0

+1, gli account di servizio sono molto più facili –

+0

Il link è morto. –

+0

È davvero morto, ma ho trovato un articolo che potrebbe essere correlato utilizzando le informazioni sugli account di servizio. https://developers.google.com/identity/protocols/OAuth2ServiceAccount – Graph

Problemi correlati