java - 如何使用服务帐号正确获取用户的日历事件?

标签 java google-calendar-api google-api-java-client

我正在尝试检索域中用户的日历事件。我有服务帐户访问权限,但在尝试获取特定用户事件时出现 404 错误。 继承人连接代码:

NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(googleApiServiceAccountId)
            .setServiceAccountScopes(Collections.singleton(CalendarScopes.CALENDAR_READONLY))
            .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(
                    SecurityUtils.getPkcs12KeyStore(),
                    getClass().getClassLoader().getResourceAsStream(googleApiPrivateKeyPath),
                    NOTASECRET, PRIVATEKEY, NOTASECRET))
            .build();

    calendarApi = new Calendar.Builder(httpTransport,
            JSON_FACTORY, credential).setApplicationName(getApplicactionName()).build();

事件列表方法:

public List<Event> getCalendarEventsForUserAndDates(String userEmail, Long dateFrom, Long dateTo) {
    try {
        String pageToken = null;
        List<Event> allEvents = Lists.newArrayList();
        do {
            ArrayMap<String, Object> parameters = new ArrayMap<String, Object>();
            parameters.add("xoauth_requestor_id", userEmail);
            Calendar.Events.List list = calendarApiBean.getCalendarApi()
                    .events().list("primary");
            list.setTimeMax(new DateTime(dateFrom, 0))
                    .setTimeMin(new DateTime(dateTo, 0))
                    .setUnknownKeys(parameters);
            Events events = list.setPageToken(pageToken)
                    .execute();
            List<? extends Event> items = events.getItems();
            if (items != null) {
                allEvents.addAll(items);
            }
            pageToken = events.getNextPageToken();
        } while (pageToken != null);
        return allEvents;
    } catch (IOException e) {
        logger.error("error while retriving calendar events for {} and dates {} {} ", userEmail, dateFrom, dateTo);
        logger.error("exception", e);
        return Collections.emptyList();
    }

}

当我尝试将 xoauth_requestor_id 设置为用户的电子邮件并列出“主要”时,我得到了我的服务帐户的日历事件。当我将 events().list() 参数更改为用户的电子邮件时,出现以下错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "message" : "Not Found",
    "reason" : "notFound"
  } ],
  "message" : "Not Found"
}

感谢您的帮助。

最佳答案

为了解决这个问题,我必须将这个服务帐户添加到域管理上的授权 API 客户端。 客户端名称是服务帐户客户端 ID,范围是只读日历

关于java - 如何使用服务帐号正确获取用户的日历事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210821/

相关文章:

google-app-engine - GAE : java. lang.NoSuchMethodError : com. google.api.client.json.GenericJson.set

java - 无法找到窗口 - Selenium Webdriver 错误

java - IOException : stream closed error while reading multiple files from HDFS

java - 当 while(true) 在线程中循环时 JFrame 卡住

c# - 带有谷歌日历的通用 Windows 平台应用程序

javascript - 来自多个文本框的多个 Google 事件

calendar - 使用 google 日历 api 查找空闲时间

java - JPA:在获取时忽略字段,但在保存时保存所有字段。有没有任何注释属性可以做到这一点?

android - AccountManager 似乎返回了错误的 authToken

android - Gmail API 403 域全局权限不足