【问题标题】:Create Spreadsheet using Google Spreadsheet API in Google drive in Java在 Java 的 Google 驱动器中使用 Google 电子表格 API 创建电子表格
【发布时间】:2015-08-09 14:32:53
【问题描述】:

我创建了一些用于填充 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 = "usename@........com"; ->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 的代码。

【问题讨论】:

  • 我怀疑你遇到了两个问题。 1) 不再支持 OpenAuth 1 / 客户端登录 2) Documents List API 已弃用,因此您需要迁移到 Drive API 以创建电子表格。不幸的是,我没有关于如何在 Java 中执行此操作的示例。
  • 这样看来,不再支持客户端登录。我希望他们会更新 Spreed API 页面,并举例说明如何在 Java 中使用它。
  • 从昨天开始出现同样的问题!他们是否放弃了对应用密码身份验证的支持?

标签: java google-api google-sheets gmail-api


【解决方案1】:

我终于在from here 的帮助下设法创建了这样的连接。 一切都像以前一样工作。 您要做的步骤是:

  1. 注册https://console.developers.google.com
  2. 创建新项目
  3. 在 APIs & Auth -> Credential -> Create New Client ID for Service Account
  4. 生成客户端 ID 时必须生成 P12 密钥。
  5. 下面的代码中需要客户 ID,电子邮件地址是您必须共享电子表格的地址

下面是工作代码

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

【讨论】:

  • 谢谢 Skwarsz。对其他人的一个小的澄清。在第 4 步中,控制台将为您提供“客户 ID”和“电子邮件地址”。 (a) 您需要在 setServiceAccountId() 方法调用中使用“电子邮件地址”(尽管有方法名称,但不是 ID)。 (b) 您需要与同一个电子邮件地址共享您的电子表格
  • 电子表格文档代码中定义的SCOPES变量应为:static final List&lt;String&gt; SCOPES_ARRAY = Arrays.asList("https://spreadsheets.google.com/feeds", "https://spreadsheets.google.com/feeds/spreadsheets/private/full", "https://docs.google.com/feeds")
  • 感谢 Skwarsz。不过有一个小问题:我认为您需要 gdata-core-1.47.1.jar 而不是您正在使用的 gdata-core-1.0.jar。 1.0 版无法识别 SpreadsheetService 类的 setOAuth2Credentials() 方法。
  • @Skvarosz:我实际上发现 gdata-spreadsheet.jar 和 gdata-core.jara 重叠。对我来说,删除 gdata-spreadsheet.jar 是有效的。考虑检查它在您的项目中是否/不是多余的。
  • p12 密钥文件保存在哪里?
【解决方案2】:

Google 刚刚停止支持 OAuth1.0。需要使用 OAuth2。要切换,首先进入谷歌开发者控制台,创建一个项目并设置一个凭证。然后更新您的代码,类似于以下 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>

【讨论】:

  • 原因:OpenAuth 1 / Client Login 不再支持。正如这里写的code.google.com/p/gdata-issues/issues/…
  • 你从哪里导入JacksonFactory
  • 运行这个createSpreadSheetService需要什么exacly库?
  • 高 你能告诉我你用什么库来使这段代码有效吗?我一直面临异常和其他错误。
【解决方案3】:

我尝试过来自 Gao 的解决方案,但我对库有一个问题。我正在使用 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) 

我发现类路径有问题,但我不知道如何在 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 类。

【讨论】:

  • 这里也有同样的问题。
  • 更新:已由import com.fasterxml.jackson.core.*; 解决。我不知道我到底在做什么或发生了什么。
  • 如何通过此导入使其工作 Dimitris,因为它使用的是 JsonFactory 而不是 JacksonFactory,我仍然有这个问题。
  • JsonFactory 是一个抽象超类,您的问题来自JacksonFactory 无法找到定义。将jackson-core-2.1.3.jar 包含到您的项目库中并导入我写的内容。它可能会通过。
  • 我在SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);上遇到过Exception in thread "main" java.lang.AbstractMethodError: com.google.api.client.json.JsonFactory.createJsonGenerator(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)Lcom/google/api/client/json/JsonGenerator;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2014-12-13
  • 2023-03-23
  • 2019-04-18
  • 1970-01-01
相关资源
最近更新 更多