2015-05-27 19 views
17

Avevo creato uno strumento che stava compilando il foglio di calcolo di Google. E 'stato lavorando bene per 1 anno, dal momento che oggi ho l'erroreCrea foglio di calcolo utilizzando l'API Google Spreadsheet nell'unità Google in Java

Exception in thread "main" com.google.gdata.util.AuthenticationException: Error authenticating (check service name) 
at com.google.gdata.client.GoogleAuthTokenFactory.getAuthException(GoogleAuthTokenFactory.java:688) 
at com.google.gdata.client.GoogleAuthTokenFactory.getAuthToken(GoogleAuthTokenFactory.java:560) 
at com.google.gdata.client.GoogleAuthTokenFactory.setUserCredentials(GoogleAuthTokenFactory.java:397) 
at com.google.gdata.client.GoogleService.setUserCredentials(GoogleService.java:364) 
at com.google.gdata.client.GoogleService.setUserCredentials(GoogleService.java:319) 
at com.google.gdata.client.GoogleService.setUserCredentials(GoogleService.java:303) 

Questa è la parte di codice per collegarsi con gmail:

String USERNAME = "[email protected]"; ->of course I'm using proper username and password 
    String PASSWORD = "*******"; 
    SpreadsheetService service 
      = new SpreadsheetService("SandboxCheck"); 
    service.setUserCredentials(USERNAME, PASSWORD); 

non so come collegare con Gmail , Stavo cercando di farlo tramite oAuth ma non so come farlo. Negli esempi su https://developers.google.com/google-apps/spreadsheets/authorize c'è solo il codice per .net.

+0

Ho il sospetto che tu stia colpendo due numeri.1) OpenAuth 1/Accesso client non è più supportato e 2) L'API Elenco documenti è ammortizzata, pertanto è necessario eseguire la migrazione all'API di Drive per creare un foglio di calcolo. Sfortunatamente, non ho esempi per te su come farlo in Java. – daryl

+0

Sembra che in questo modo l'accesso client non sia supportato. Spero che aggiorneranno la pagina API Spreed e daranno un esempio su come usarlo in Java. – Skwarosz

+0

Lo stesso problema qui, da ieri! Hanno abbandonato il supporto per l'autenticazione della password app? –

risposta

18

Finalmente con l'aiuto from here è riuscito a creare tale connessione. Tutto funziona come prima. passaggi che dovete fare è:

  1. Registrati a https://console.developers.google.com
  2. Crea nuovo progetto
  3. Sotto API & Auth -> credenziali -> Crea nuovo client ID per account di servizio
  4. Quando l'ID cliente è generato Devi generare la chiave P12.
  5. ID client saranno necessari nel codice qui sotto, addres posta elettronica è l'addres si devono condividere il tuo foglio di calcolo

seguito è riportato il codice di lavoro

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.jackson.JacksonFactory; 
import com.google.gdata.client.spreadsheet.SpreadsheetService; 
import com.google.gdata.data.spreadsheet.SpreadsheetEntry; 
import com.google.gdata.data.spreadsheet.SpreadsheetFeed; 
import com.google.gdata.util.ServiceException; 
import java.io.File; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.GeneralSecurityException; 
import java.util.Arrays; 
import java.util.List; 
public class OAuthIntegration{ 
    public static void main(String[] args) throws MalformedURLException, GeneralSecurityException, IOException, ServiceException { 
     URL SPREADSHEET_FEED_URL; 
     SPREADSHEET_FEED_URL = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"); 

     File p12 = new File("./key.p12"); 

     HttpTransport httpTransport = new NetHttpTransport(); 
     JacksonFactory jsonFactory = new JacksonFactory(); 
     String[] SCOPESArray = {"https://spreadsheets.google.com/feeds", "https://spreadsheets.google.com/feeds/spreadsheets/private/full", "https://docs.google.com/feeds"}; 
     final List SCOPES = Arrays.asList(SCOPESArray); 
     GoogleCredential credential = new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(jsonFactory) 
       .setServiceAccountId("cliend_ID") 
       .setServiceAccountScopes(SCOPES) 
       .setServiceAccountPrivateKeyFromP12File(p12) 
       .build(); 

     SpreadsheetService service = new SpreadsheetService("Test"); 

     service.setOAuth2Credentials(credential); 
     SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class); 
     List<SpreadsheetEntry> spreadsheets = feed.getEntries(); 

     if (spreadsheets.size() == 0) { 
      System.out.println("No spreadsheets found."); 
     } 

     SpreadsheetEntry spreadsheet = null; 
     for (int i = 0; i < spreadsheets.size(); i++) { 
      if (spreadsheets.get(i).getTitle().getPlainText().startsWith("ListOfSandboxes")) { 
       spreadsheet = spreadsheets.get(i); 
       System.out.println("Name of editing spreadsheet: " + spreadsheets.get(i).getTitle().getPlainText()); 
       System.out.println("ID of SpreadSheet: " + i); 
      } 
     } 

    } 

} 

Spero che questo vi aiuterà con problemi che ho' ho affrontato. Questa è la lista di jar che ho usato:

guava-11.0.2.jar 
gdata-spreadsheet-3.0.jar 
gdata-maps-2.0.jar 
gdata-core-1.0.jar 
jackson-core-asl-1.9.11.jar 
jackson-core-2.1.3.jar 
google-oauth-client-1.20.0.jar 
google-http-client-jackson2-1.20.0.jar 
google-http-client-jackson-1.20.0.jar 
google-http-client-1.20.0.jar 
google-api-client-1.20.0.jar 
+2

Grazie a voi Skwarsz. Un piccolo chiarimento per gli altri. Al punto 4 la console ti offrirà "ID cliente" e "Indirizzo email". (a) è necessario "l'indirizzo email" da utilizzare nella chiamata al metodo setServiceAccountId() (non l'ID nonostante il nome del metodo). (b) è necessario condividere il foglio di calcolo con lo stesso indirizzo email – AndrewL

+0

La variabile '' SCOPES'' definita nel codice per i fogli di calcolo deve essere: '' Elenco statico finale SCOPES_ARRAY = Arrays.asList ("https: // spreadsheet .google.com/feed "," https://spreadsheets.google.com/feeds/spreadsheets/private/full "," https://docs.google.com/feeds ")' ' – Mrdev

+2

Grazie Skwarsz. Un piccolo punto: penso che tu abbia bisogno di *** gdata-core-1.47.1.jar *** invece di gdata-core-1.0.jar che stai usando. La versione 1.0 non riconosce il metodo setOAuth2Credentials() della classe SpreadsheetService. – davak

4

Google ha appena smesso di supportare OAuth1.0. OAuth2 deve essere utilizzato. Per passare, prima vai su Google Developer Console, crea un progetto e imposta una credenziale. Poi aggiorna il codice simile al seguente codice Java:

private void createSpreadSheetService() throws GeneralSecurityException, IOException, ServiceException { 
    HttpTransport httpTransport = new NetHttpTransport(); 
    JacksonFactory jsonFactory = new JacksonFactory(); 
    String [] SCOPESArray= {"https://spreadsheets.google.com/feeds", "https://docs.google.com/feeds"}; 
    final List SCOPES = Arrays.asList(SCOPESArray); 
    GoogleCredential credential = new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(jsonFactory) 
    .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
    .setServiceAccountScopes(SCOPES) 
    .setServiceAccountPrivateKeyFromP12File(SERVICE_ACCOUNT_PKCS12_FILE) 
    .build(); 

    SPREADSHEETSERVICE = new SpreadsheetService("data"); 
    SPREADSHEETSERVICE.setOAuth2Credentials(credential); 

}

Si avrebbe bisogno di due librerie: google-api-client e Google-http-client-jackson. Se usi Maven, incluse le seguenti dipendenze in pom.xml.

<dependency> 
    <groupId>com.google.api-client</groupId> 
    <artifactId>google-api-client</artifactId> 
    <version>1.19.0</version> 
    <type>jar</type> 
</dependency> 
<dependency> 
    <groupId>com.google.http-client</groupId> 
    <artifactId>google-http-client-jackson</artifactId> 
    <version>1.19.0</version> 
    <type>jar</type> 
</dependency> 
+0

Il motivo: OpenAuth 1/Accesso client non è più supportato. Come scritto qui https://code.google.com/p/gdata-issues/issues/detail?can=2&start=0&num=100&q=&colspec=API%20ID%20Type%20Status%20Priority%20Stars%20Summary&groupby=&sort= & id = 2717 – Skwarosz

+0

Da dove importa "JacksonFactory"? –

+1

Quali librerie esatte sono necessarie per eseguire questo 'createSpreadSheetService'? – Skwarosz

1

Ho provato la soluzione di Gao ma ho un problema con le librerie. Sto utilizzando NetBeans, il progetto sta costruendo senza errori, ma quando sto cercando di eseguirlo ho questo errore:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory 
at com.google.api.client.json.jackson.JacksonFactory.<init>(JacksonFactory.java:38) 
at SandboxCheck.main(SandboxCheck.java:48) 

ho scoperto che ci sono problemi con il percorso di classe, ma non ho idea di come sistemalo su netbeans, pensavo che lo avrebbe fatto automaticamente aggiungendo una libreria. Ho aggiunto

google-oauth-client-1.16.0-rc.jar google-oauth-client-1.16.0-rc-sources.jar google-api-client-1.8.0-beta-sources.jar google-api-client-1.4.1-beta.jar google-api-client-1.19.1.jar

Non sono sicuro se aggiungo troppo di questo librerie ma se rimuovo per esempio. google-api-client-1.4.1-beta.jar non vedrà la classe JacksonFactory.

+0

Esattamente lo stesso problema anche qui. –

+0

* AGGIORNAMENTO *: gestito per risolverlo con 'import com.fasterxml.jackson.core. *;'. Non so cosa diavolo sto facendo o cosa sta succedendo. –

+0

Come è riuscito a far funzionare Dimitris da questa importazione, perché sta usando JsonFactory non JacksonFactory e ho ancora questo problema. – Skwarosz

Problemi correlati