2015-05-27 7 views
17

Ich hatte ein Tool erstellt, das die Google-Tabelle gefüllt wurde. Es funktioniert gut für 1 Jahr, da ich heute Fehler habeErstellen Sie Tabellenkalkulation mit Google Spreadsheet API in Google-Laufwerk 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) 

Dies ist der Teil des Codes ist mit gmail zu verbinden:

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

Ich weiß nicht, wie mit gmail verbinden Ich habe versucht, dies über oAuth zu tun, aber ich weiß nicht, wie ich das machen soll. In den Beispielen auf https://developers.google.com/google-apps/spreadsheets/authorize gibt es nur Code für .net.

+0

Ich vermute, dass Sie zwei Probleme treffen.1) Die OpenAuth 1/Client-Anmeldung wird nicht länger unterstützt und 2) Die Documents List-API wird abgeschrieben. Daher müssen Sie zur Erstellung einer Tabelle in die Drive API migrieren. Leider habe ich keine Beispiele dafür, wie Sie dies in Java tun können. – daryl

+0

Es sieht so aus, dass die Client-Anmeldung nicht länger unterstützt wird. Ich hoffe, dass sie die Spreed-API-Seite aktualisieren und ein Beispiel für die Verwendung in Java geben werden. – Skwarosz

+0

Das gleiche Problem hier seit gestern! Haben sie die Unterstützung für die App Password-Authentifizierung verworfen? –

Antwort

18

Ich endlich mit Hilfe from here geschafft, eine solche Verbindung zu schaffen. Alles funktioniert wie vorher. Schritte Sie tun müssen, ist:

  1. Register bei https://console.developers.google.com
  2. neues Projekt erstellen
  3. Unter APIs & Auth -> Credential -> Neue Client-ID für Service
  4. Konto Wenn der Client-ID ist generiert Sie müssen den P12-Schlüssel generieren.
  5. Client-ID im Code wird unten benötigt werden, ist E-Mail-Adresse die addres Sie haben Ihre Tabelle

Im Folgenden wird der Arbeits Code zu teilen

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

    } 

} 

Ich hoffe, das sich mit Fragen helfen I‘ ve konfrontiert. Dies ist die Liste von Glas, das ich verwendet habe:

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

Danke Skwarsz. Eine geringfügige Klarstellung für andere. In Schritt 4 bietet Ihnen die Konsole "Client ID" und "Email address". (a) Sie benötigen die "E-Mail-Adresse", die im Methodenaufruf setServiceAccountId() verwendet werden soll (nicht die ID trotz des Methodennamens). (b) Sie müssen Ihre Tabelle mit der gleichen E-Mail-Adresse teilen. – AndrewL

+0

Die Variable '' SCOPES'', die im Code für Tabellenkalkulationsdokumente definiert ist, sollte lauten: '' statische endgültige Liste SCOPES_ARRAY = Arrays.asList ("https: // Spreadsheets .google.com/feeds "," https://spreadsheets.google.com/feeds/spreadsheets/private/full "," https://docs.google.com/feeds ")" – Mrdev

+2

Vielen Dank Skwarsz. Ein kleiner Punkt: Ich denke, Sie brauchen *** gdata-core-1.47.1.jar *** anstelle von gdata-core-1.0.jar, das Sie verwenden. Version 1.0 erkennt die Methode setOAuth2Credentials() der SpreadsheetService-Klasse nicht. – davak

4

Google gestoppt nur Unterstützung OAuth1.0. OAuth2 muss verwendet werden. Wechseln Sie zunächst zu Google Developer Console, erstellen Sie ein Projekt und legen Sie eine Anmeldeinformationen fest. Dann aktualisieren Sie Ihren Code ähnlich dem folgenden Java-Code:

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

}

Sie würden zwei Bibliotheken benötigen: google-api-Client und Google-http-client-Jackson. Wenn Sie Maven verwenden, einschließlich der folgenden Abhängigkeiten 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

Der Grund: OpenAuth 1/Client Login wird nicht mehr unterstützt. Wie schrieb hier 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

Woher importierst du 'JacksonFactory'? –

+1

Welche exacly-Bibliotheken werden benötigt, um diesen 'createSpreadSheetService' auszuführen? – Skwarosz

1

Ich habe versucht, Lösung von Gao, aber ich habe ein Problem mit Bibliotheken. Ich benutze Netbeans, das Projekt ohne Fehler baut aber wenn ich versuche, es auszuführen habe ich diesen Fehler:

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) 

Ich fand heraus, dass es Probleme mit Classpath aber ich habe keine Ahnung, wie man repariere es auf Netbeans, ich dachte, es würde es automatisch tun, wenn man eine Bibliothek hinzufügt. I

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

hinzugefügt haben bin ich nicht sicher, ob ich zu viel von diesen Bibliotheken hinzufügen, aber Wenn ich zB entfernen. google-api-client-1.4.1-beta.jar wird die JacksonFactory Klasse nicht sehen.

+0

Genau dasselbe Problem auch hier. –

+0

* UPDATE *: Verwaltet, um es zu lösen durch 'import com.fasterxml.jackson.core. *;'. Ich weiß nicht, was zur Hölle ich mache oder was los ist. –

+0

Wie es gelungen ist, Dimitris durch diesen Import zum Laufen zu bringen, weil es JsonFactory und nicht JacksonFactory verwendet und ich dieses Problem immer noch habe. – Skwarosz

Verwandte Themen