Подтвердить что ты не робот

Создание электронной таблицы с использованием Google Spreadsheet API в Google Диске в Java

Я создал какой-то инструмент, который заполнял электронную таблицу google. Он работал отлично в течение 1 года, так как сегодня у меня ошибка

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)

Это часть кода для подключения к 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);

Я не знаю, как подключиться к gmail, я пытался это сделать через oAuth, но я не знаю, как это сделать. В примерах https://developers.google.com/google-apps/spreadsheets/authorize есть только код для .net.

4b9b3361

Ответ 1

Наконец, с помощью отсюда удалось создать такое соединение. Все работает по-прежнему. Шаги Вы должны сделать это:

  • Зарегистрируйтесь на https://console.developers.google.com
  • Создать новый проект
  • В разделе API и Auth → Учетные данные → Создать новый идентификатор клиента для учетной записи службы
  • Когда генерируется идентификатор клиента, вы должны сгенерировать ключ P12.
  • Идентификатор клиента будет необходим в коде ниже, Email addres - это addres. Вы должны поделиться своей электронной таблицей.

Ниже приведен рабочий код

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

    }

}

Я надеюсь, что это поможет с проблемами, с которыми я столкнулся. Это список jar, который я использовал:

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

Google просто остановил поддержку OAuth1.0. OAuth2 необходимо использовать. Чтобы переключиться, сначала зайдите в Google Developer Console, создайте проект и установите учетные данные. Затем обновите код, похожий на следующий код 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);

}

Вам понадобятся две библиотеки: google-api-client и google-http-client-jackson. Если вы используете Maven, включая следующие зависимости в 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>

Ответ 3

Я пробовал решение от Гао, но у меня есть одна проблема с библиотеками. Я использую netbeans, проект строится без ошибок, но когда я пытаюсь выполнить его, у меня есть эта ошибка:

 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) 

Я узнал, что есть проблемы с classpath, но я понятия не имею, как исправить это на netbeans, я думал, что он будет делать это автоматически при добавлении библиотеки. Я добавил

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

Я не уверен, если я добавлю слишком много этих библиотек, но если я удалю, например. google-api-client-1.4.1-beta.jar он не увидит класс JacksonFactory.