Calling Calendar Api возвращает статус 403 с сообщением об превышении лимита использования - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать событие с сервера, используя 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 / se c. и для вызова API не отображается трафик c. Тем не менее, когда я пытаюсь создать событие, оно показывает превышение лимита использования.

полная ошибка

Исключение в теме "main" com.google.api.client.googleapis. json .GoogleJsonResponseException: 403 Forbidden {"code": 403, "errors": [{"domain": "useLimits", "message": "Превышены пределы использования календаря.", "Reason": "quotaExceeded"}], "message": "Превышены пределы использования календаря." }

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Вы получаете эту ошибку, потому что вы пытаетесь создать событие с посетителями, не используя олицетворение учетной записи, и сделать это в настоящее время невозможно , как вы можете видеть в эту проблему в Google Issue Tracker .

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

( Важное примечание : если вы используете учетную запись службы без олицетворения и устанавливаете calendarId в значение primary, как в коде, которым вы поделились, вы не добавите событие в свой основной календарь, а в основной календарь учетной записи службы У служебной учетной записи есть собственный основной календарь, собственный диск и т. Д. c, который не совпадает с основным календарем, вашим диском и т. Д. c.).

Рабочий процесс:

Если вы хотите использовать служебную учетную запись для доступа к ресурсу от вашего имени, вам необходимо сделать следующее:

  • Предоставить делегирование по всему домену на сервисную учетную запись , выполнив шаги, указанные здесь . Добавьте идентификатор учетной записи службы как Client Name и https://www.googleapis.com/auth/calendar в качестве области действия в Manage API client access.
  • Загрузите учетные данные, соответствующие учетной записи службы (в приведенном ниже примере, вместо * 1062 используется P12). *).
  • Используйте учетную запись службы, чтобы выдать себя за себя, указав свой адрес электронной почты при создании учетных данных, как показано в приведенном ниже примере.

Вы можете создать свои учетные данные следующим образом :

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

Ссылка:

Надеюсь, это поможет.

0 голосов
/ 05 февраля 2020

Вы используете код для Oauth2, а не для служебных учетных записей. Google Analytics API имеет очень хорошее учебное пособие для служебной учетной записи для java Быстрый старт служебной учетной записи java не должно быть слишком сложным для его замены к календарю.

private static Calendar initializeCalendar() throws GeneralSecurityException, IOException {

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    GoogleCredential credential = GoogleCredential
        .fromStream(new FileInputStream(KEY_FILE_LOCATION))
        .createScoped(CalendarScopes.CALENDAR));

    // Construct the Analytics service object.
    return new Calendar.Builder(httpTransport, JSON_FACTORY, credential)
        .setApplicationName(APPLICATION_NAME).build();
  }


public static void main(String... args) throws IOException, GeneralSecurityException {
    // Build a new authorized API client service.
    Calendar service = initializeCalendar();

    // List the next 10 events from the primary calendar.
    DateTime now = new DateTime(System.currentTimeMillis());
    Events events = service.events().list("primary")
            .setMaxResults(10)
            .setTimeMin(now)
            .setOrderBy("startTime")
            .setSingleEvents(true)
            .execute();
    List<Event> items = events.getItems();
    if (items.isEmpty()) {
        System.out.println("No upcoming events found.");
    } else {
        System.out.println("Upcoming events");
        for (Event event : items) {
            DateTime start = event.getStart().getDateTime();
            if (start == null) {
                start = event.getStart().getDate();
            }
            System.out.printf("%s (%s)\n", event.getSummary(), start);
        }
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...