gpt4 book ai didi

java - 调用日历 Api 返回 403 状态并显示使用限制超出消息

转载 作者:行者123 更新时间:2023-12-02 09:02:16 25 4
gpt4 key购买 nike

我正在尝试使用 java 从服务器创建事件。

这是我的代码。

private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";

private static final List<String> SCOPES = Collections.singletonList(CalendarScopes.CALENDAR);
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

private static final String projfilepath = "/quickstart-foxmatrix.json";

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws Exception {
// Load client secrets.

InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}

GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline").build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(9000).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}

public static void main(String... args) throws Exception {
// Build a new authorized API client service.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

InputStream in = CalendarQuickstart.class.getResourceAsStream(projfilepath);

GoogleCredential credential = GoogleCredential.fromStream(in)
.createScoped(Collections.singleton(CalendarScopes.CALENDAR));

Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME).build();
CalendarQuickstart obj = new CalendarQuickstart();
obj.createEvent(service);
}

public String createEvent(Calendar service) throws IOException {
Event event = new Event().setSummary("New Event")
.setDescription("A chance to hear more about Google's developer products.");

DateTime startDateTime = new DateTime("2020-02-04T09:00:00-07:00");
EventDateTime start = new EventDateTime().setDateTime(startDateTime);
event.setStart(start);

DateTime endDateTime = new DateTime("2020-02-04T17:00:00-07:00");
EventDateTime end = new EventDateTime().setDateTime(endDateTime);
event.setEnd(end);

EventAttendee[] attendees = new EventAttendee[] {
new EventAttendee().setEmail("hanil.kathuria@innovationm.com"),
new EventAttendee().setEmail("jijo.mathew@innovationm.com"), };
event.setAttendees(Arrays.asList(attendees));

EventReminder[] reminderOverrides = new EventReminder[] {
new EventReminder().setMethod("email").setMinutes(24 * 60),
new EventReminder().setMethod("popup").setMinutes(10), };
Event.Reminders reminders = new Event.Reminders().setUseDefault(false)
.setOverrides(Arrays.asList(reminderOverrides));
event.setReminders(reminders);

String calendarId = "primary";
event = service.events().insert(calendarId, event).execute();
System.out.printf("Event created: %s\n", event.getHtmlLink());
event.getHangoutLink();
return event.getHtmlLink();
}

我正在使用 json 文件中的服务帐户凭据。

我正在使用 Google 客户端库进行 API 调用。

我还检查了我的仪表板,API 调用的限制是 100/秒。并且没有显示 api 调用的流量。当我尝试创建一个事件时,它仍然显示超出了使用限制。

完全错误

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden { "code" : 403, "errors" : [ { "domain" : "usageLimits", "message" : "Calendar usage limits exceeded.", "reason" : "quotaExceeded" } ], "message" : "Calendar usage limits exceeded." }

最佳答案

您收到此错误是因为您尝试在不使用帐户模拟的情况下与与会者创建 Activity ,而执行此操作目前不可能,如 this issue in Google Issue Tracker 中所示。 .

如果可以的话,您可以先与服务帐户共享您的日历,然后添加 Activity 。但由于这是不可能的,您应该使用服务帐户来模拟您自己:它应该代表您添加事件。

(重要说明:如果您不进行模拟使用服务帐户并将 calendarId 设置为 primary ,如您共享的代码中所示,您将不会'请勿将 Activity 添加到您的主日历,而是添加到服务帐户的主日历。服务帐户有自己的主日历、自己的云端硬盘等,这与您的主日历、您的云端硬盘不同。驱动器等)。

工作流程:

如果您想使用服务帐户代表您访问资源,则必须执行以下操作:

  • 按照 the steps specified here 授予对服务帐户的域范围委托(delegate) 。将服务帐户 ID 添加为 Client Namehttps://www.googleapis.com/auth/calendar作为 Manage API client access 中的范围.
  • 下载与服务帐户对应的凭据(在我下面提供的示例中,使用 P12 而不是 JSON)。
  • 使用服务帐户在构建凭据时指定您的电子邮件地址来冒充您自己,如下面的示例所示。

您可以通过以下方式构建您的凭据:

GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("service-account@email-address") // Service account email
.setServiceAccountPrivateKeyFromP12File(new File("your-credentials.p12"))
.setServiceAccountScopes(Collections.singleton(CalendarScopes.CALENDAR))
.setServiceAccountUser("user@email-address") // Your email address (address of the user you want to impersonate)
.build();

引用:

希望这对您有所帮助。

关于java - 调用日历 Api 返回 403 状态并显示使用限制超出消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60076154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com