Verbinden einer Knotenanwendung mit der Google Kalender-API

Irgendwie stellte sich für mich unerwartet heraus, dass das Verbinden meiner nodejs-Anwendung mit der Google Kalender-API eine nicht triviale Aufgabe war. Trotz der detaillierten Beschreibung der Verbindungsoptionen auf Russisch musste ich durch den Wald verschiedener Einstellungen und Konfigurationen waten. Der Artikel beschreibt die Schritte, die unternommen werden müssen, damit die Integration erfolgreich ist.

Der Zweck der Integration besteht darin, einer NodeJS-Anwendung zu ermöglichen, Ereignisse in einem bestimmten Kalender zu veröffentlichen. In diesem Beispiel haben wir ein reguläres, persönliches Google-Konto verwendet.

Erstellen Sie einen Kalender

Zunächst müssen Sie einen Kalender erstellen, in dem wir Ereignisse veröffentlichen. Gehen Sie zu Google Kalender und klicken Sie auf die Schaltfläche " + " neben " Andere Kalender ". Wählen Sie dann den Eintrag " Kalender erstellen " aus:

Füllen Sie das Formular aus und klicken Sie erneut auf " Kalender erstellen ", jedoch mit der blauen Schaltfläche:

Google hat lange Zeit mit dem Kopf geredet und kündigt anschließend gerne an, dass der neue Kalender fertig ist. Zugriff auf neue Kalendereinstellungen:

In den Einstellungen interessiert uns vor allem das Element " Kalenderintegration " :

am nützlichsten ist die " Kalender-ID "

c093hr4fqjuj5k9e6uvvac73ac@group.calendar.google.com

nodejs- API.

Google

" API".

- " ":

- "Habr Demo":

API Google':

Google 3 , :

"calend" , :

"Google Calendar API" :

dashboard API (https://console.developers.google.com/apis/api/calendar-json.googleapis.com/overview?project=habr-demo-293107&supportedpurview=project), , API :

" " , , API:

, :

Google JSON, Google Calendar API:

"". , Google' , API, :

, " / ", . "" JSON- "Downloads" :

JSON- ( ):

{
  "type": "service_account",
  "project_id": "habr-demo-293107",
  "private_key_id": "4ec17ea5f8b606e0535a0623a110111123fd3c33",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "nodejs-app@habr-demo-293107.iam.gserviceaccount.com",
  "client_id": "102219376121816220804",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/nodejs-app%40habr-demo-293107.iam.gserviceaccount.com"
}

API "Habr Demo" email' "nodejs-app@habr-demo-293107.iam.gserviceaccount.com":

API nodejs- Google googleapis . OAuth2- , scope' . :

const fs = require('fs');
const {google} = require('googleapis');

const CALENDAR_ID = 'c093hr4fqjuj5k9e6uvvac73ac@group.calendar.google.com';
const KEYFILE = 'Habr Demo-4ec17ea5f8b6.json'; // path to JSON with private key been downloaded from Google
const SCOPE_CALENDAR = 'https://www.googleapis.com/auth/calendar'; // authorization scopes
const SCOPE_EVENTS = 'https://www.googleapis.com/auth/calendar.events';

(async function run() {
    // INNER FUNCTIONS
    async function readPrivateKey() {
        const content = fs.readFileSync(KEYFILE);
        return JSON.parse(content.toString());
    }

    async function authenticate(key) {
        const jwtClient = new google.auth.JWT(
            key.client_email,
            null,
            key.private_key,
            [SCOPE_CALENDAR, SCOPE_EVENTS]
        );
        await jwtClient.authorize();
        return jwtClient;
    }

    async function createEvent(auth) {
        const event = {
            'summary': 'Habr Post Demo',
            'description': '    nodejs-  Google Calendar API.',
            'start': {
                'dateTime': '2020-10-20T16:00:00+02:00',
                'timeZone': 'Europe/Riga',
            },
            'end': {
                'dateTime': '2020-10-20T18:00:00+02:00',
                'timeZone': 'Europe/Riga',
            }
        };

        let calendar = google.calendar('v3');
        await calendar.events.insert({
            auth: auth,
            calendarId: CALENDAR_ID,
            resource: event,
        });
    }

    // MAIN
    try {
        const key = await readPrivateKey();
        const auth = await authenticate(key);
        await createEvent(auth);
    } catch (e) {
        console.log('Error: ' + e);
    }
})();

Calendar API:

{
  ...
  "status": 404,
  "statusText": "Not Found",
  ...
}

- .

, , " ", " " email- , :

:

" ", "You need to have writer access to this calendar." API:

:

16:00:

'start': {
    'dateTime': '2020-10-20T16:00:00+02:00',
    'timeZone': 'Europe/Riga',
}

a 17:00, IT:

Es gibt nur zwei typische Schwierigkeiten bei der Programmierung: Cache-Ungültigmachung, Entitätsnamen und ein Fehler pro Einheit

Zusammenfassung

Das ist alles, die Quest ist abgeschlossen. Glücklich, wie sie sagen, Codierung.

Links




All Articles