API Google Календаря с ASP.NET

Я не понимаю, как использовать Google Calendar API для добавления / изменения событий в веб-формах ASP.NET (C#).

Я не уверен, нужен ли мне oAuth или что-то в этом роде. Мое приложение находится на моем собственном сервере и имеет доступ к моему собственному домену и моему собственному календарю. Мне не нужно, чтобы другие пользователи открывали мне доступ к своему календарю; Мне нужно получить доступ только к своему через приложение.

На одной из моих aspx-страниц я хотел бы отправить информацию о мероприятии в свой календарь Google, чтобы добавить (или позже изменить) событие.

Я проверил всевозможные примеры кода и руководства Google по началу работы. Я просто не понимаю, что именно нужно. Я установил ключ API и идентификатор клиента oAuth2. Инструкции Google разослали меня по кругу, и это, вероятно, связано с тем, что я нуждаюсь в разъяснении того, что нужно.

Может ли кто-нибудь прояснить мое замешательство и указать мне правильное направление?

Вам всегда нужно пройти аутентификацию. В противном случае любой анонимный пользователь мог читать и изменять ваш календарь через API. Поэтому для этого вам нужно использовать oAuth. Я предлагаю вам перейти по ссылке в ответе ниже и задать конкретный вопрос по любой возникшей у вас проблеме.

Nick.McDermaid 06.01.2019 23:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
1
12 669
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Резюме :

  • Для вызова защищенного ресурса google clould oauth2

  • С вашего сервера на сервер Google

  • Без взаимодействия с пользователем

  • Доступ к вашим собственным данным

  • Использование C#

Код:

    var private_key = @"-----BEGIN PRIVATE KEY-ccc-END PRIVATE KEY-----\n";
    string calendarId = @"[email protected]";
    var client_email = @"[email protected]";

    var credential =
        new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(client_email)
        {
            Scopes = new string[] { CalendarService.Scope.Calendar }
        }.FromPrivateKey(private_key));
    var service = new CalendarService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
    });
  • Используйте методы услуга для получения данных

  • Закрытый ключ и client_email могут быть сгенерированы из эта ссылка

  • Идентификатор календаря можно найти на сайте calendar.google.com.

  • Вы должны предоставить доступ к своему календарю client_email посмотреть демо


  Google            You                             You
  Pay +             Pay +                           Pay +
  Google            Google                          You
  Manage            Manage                          Manage%
 +----------+    +----------+                     +----------+
 | Gmail    |    |          |                     |          |
 | Calendar |    |  G Suite |                     | Google   |
 | drive    |    |          |                     | Cloud    |
 |          |    |          |                     |          |
 +----^-----+    +----+-----+                     +------+---+
      |               ^                                  ^
      |               |                                  |
      |               |                                  |
      |               |                                  |
+-------------------------------------------------------------+
|     |               |                                  |    |
|     |               |                                  |    |
|     |               |       Google                     |    |
|     |               |       Oauth2                     |    |
|     |               |       Server                     |    |
|     |               |                                  |    |
|     |               |                                  |    |
+-------------------------------------------------------------+
      |               |                                  |
      |               |         +----------------+       |
      |               |         |                |       |
      |               |         |                |       | No
      |               |require  |                |       | Consent
      |               |admin    |                |       |
      |               |consent  |                |       |
      |require        |         |                +-------+
      |user           |         |                |
      |consent        +---------+   Your app     |
      |                         |                |
      |                         |                |
      |                         |                |
      |                         |                |
      +-------------------------+                |
                                |                |
                                |                |
                                |                |
                                +----------------+
                                     You
                                     Pay +
                                     You
                                     Manage

Пошаговая демонстрация


Шаг 01: откройте консоль Google

https://console.developers.google.com/projectselector/apis/library/calendar-json.googleapis.com

Шаг 02: нажмите "Выбрать"

Шаг 03: выберите или создайте новый проект

Шаг 04: нажмите включить или управлять

Шаг 05: нажмите Учетные данные

Шаг 06: Создайте ключ сервисного аккаунта

Шаг 07: Введите имя учетной записи службы, нажмите "Создать".

Шаг 08: нажмите «Создать без роли» и сохраните загруженный закрытый ключ json в надежном месте.

Шаг 09: скопируйте свой client_email из

Шаг 10: откройте календарь Google

  • calendar.google.com

Шаг 11. Откройте настройки календаря и поделитесь им

Шаг 12: заходим в Делитесь с конкретными людьми и нажимаем добавить

Шаг 13:

  1. Добавьте адрес электронной почты для учетной записи службы, которую вы скопировали ранее в шаг 09
  2. измените разрешения тоже Вносите изменения и управляйте совместным доступом
  3. нажмите отправить

Шаг 14: на той же странице скопируйте и сохраните Идентификатор календаря, который нам понадобится

Шаг 15: создайте новое консольное приложение

Шаг 16: добавьте json-файл закрытого ключа в свой проект

Шаг 17: щелкните закрытый ключ json с помощью r-щелчка и щелкните Свойство

Шаг 18: измените параметр "Копировать в каталог вывода" на "Всегда копировать"

Шаг 19: откройте консоль PM и выберите свой проект в проекте по умолчанию D.

Шаг 20. Установите пакет календаря Google.Apis

Install-Package Google.Apis.Calendar.v3

Шаг 21: замените Program.cs кодом

using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using Google.Apis.Services;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace CalendarQuickstart
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonFile = "xxxxxxx-xxxxxxxxxxxxx.json";
            string calendarId = @"[email protected]";

            string[] Scopes = { CalendarService.Scope.Calendar };

            ServiceAccountCredential credential;

            using (var stream =
                new FileStream(jsonFile, FileMode.Open, FileAccess.Read))
            {
                var confg = Google.Apis.Json.NewtonsoftJsonSerializer.Instance.Deserialize<JsonCredentialParameters>(stream);
                credential = new ServiceAccountCredential(
                   new ServiceAccountCredential.Initializer(confg.ClientEmail)
                   {
                       Scopes = Scopes
                   }.FromPrivateKey(confg.PrivateKey));
            }

            var service = new CalendarService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "Calendar API Sample",
            });

            var calendar = service.Calendars.Get(calendarId).Execute();
            Console.WriteLine("Calendar Name :");
            Console.WriteLine(calendar.Summary);

            Console.WriteLine("click for more .. ");
            Console.Read();


            // Define parameters of request.
            EventsResource.ListRequest listRequest = service.Events.List(calendarId);
            listRequest.TimeMin = DateTime.Now;
            listRequest.ShowDeleted = false;
            listRequest.SingleEvents = true;
            listRequest.MaxResults = 10;
            listRequest.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;

            // List events.
            Events events = listRequest.Execute();
            Console.WriteLine("Upcoming events:");
            if (events.Items != null && events.Items.Count > 0)
            {
                foreach (var eventItem in events.Items)
                {
                    string when = eventItem.Start.DateTime.ToString();
                    if (String.IsNullOrEmpty(when))
                    {
                        when = eventItem.Start.Date;
                    }
                    Console.WriteLine("{0} ({1})", eventItem.Summary, when);
                }
            }
            else
            {
                Console.WriteLine("No upcoming events found.");
            }
            Console.WriteLine("click for more .. ");
            Console.Read();

            var myevent = DB.Find(x => x.Id == "eventid" + 1);

            var InsertRequest = service.Events.Insert(myevent, calendarId);

            try
            {
                InsertRequest.Execute();
            }
            catch (Exception)
            {
                try
                {
                    service.Events.Update(myevent, calendarId, myevent.Id).Execute();
                    Console.WriteLine("Insert/Update new Event ");
                    Console.Read();

                }
                catch (Exception)
                {
                    Console.WriteLine("can't Insert/Update new Event ");

                }
            }
        }


        static List<Event> DB =
             new List<Event>() {
                new Event(){
                    Id = "eventid" + 1,
                    Summary = "Google I/O 2015",
                    Location = "800 Howard St., San Francisco, CA 94103",
                    Description = "A chance to hear more about Google's developer products.",
                    Start = new EventDateTime()
                    {
                        DateTime = new DateTime(2019, 01, 13, 15, 30, 0),
                        TimeZone = "America/Los_Angeles",
                    },
                    End = new EventDateTime()
                    {
                        DateTime = new DateTime(2019, 01, 14, 15, 30, 0),
                        TimeZone = "America/Los_Angeles",
                    },
                     Recurrence = new List<string> { "RRULE:FREQ=DAILY;COUNT=2" },
                    Attendees = new List<EventAttendee>
                    {
                        new EventAttendee() { Email = "[email protected]"},
                        new EventAttendee() { Email = "[email protected]"}
                    }
                }
             };
    }
}

Шаг 22: замените имя файла json на имя вашего файла json

  string jsonFile = "xxxxxxx-xxxxxxxx.json";

Шаг 23: замените calendarId своим calendarId из шага 14

 string calendarId = @"[email protected]";

Шаг 24: запустите приложение

Шаг 25: посетите свой календарь, вы должны увидеть событие в

 2019/01/13

тебе все еще нужна помощь?

Mohamed Elrashid 07.01.2019 23:40

Хорошо, извините за задержку. ВЫ УСТРАНИЛИ ПРОБЛЕМУ - СПАСИБО! В конце концов, кто-то дал мне необходимое разъяснение, вместо того, чтобы ругать меня за то, как я задал вопрос. Большое тебе спасибо! До сих пор не могу понять, как поставить разрыв строки для абзацев :)

Donna 08.01.2019 23:20

так что тебе все еще нужна помощь? ты можешь принять ответ?

Mohamed Elrashid 08.01.2019 23:26

Это потрясающий учебник, похожий на ответ, который мне очень помог! :) Спасибо, что поделились!

LazyGeek 25.10.2019 18:53

фантастический простой учебник! отлично

David 23.04.2020 17:08

@ Дэвид, спасибо. если у вас есть другие вопросы, отметьте меня

Mohamed Elrashid 23.04.2020 17:40

Спасибо!! Я потерял столько часов на ужасную документацию Google, это работает. Сэкономьте мне намного больше часов.

hjgraca 17.05.2020 00:17

@MohamedElrashid Я следую твоему ответу. Чтение календаря работает хорошо, но вставка дает мне ошибку: учетные записи служб не могут приглашать посетителей без делегирования полномочий в пределах домена (403). У вас есть какие-нибудь идеи?

toregua 04.06.2020 08:53

@MohamedElrashid Я понял, почему, это были просто электронные письма участников, которые были имитацией, просто удалите их, и это сработает;)

toregua 04.06.2020 12:29

Другие вопросы по теме