Automatisierte Erstellung von Zufallsterminen mit der Google Calendar API & Symfony2
Vor einiger Zeit fragte ich mich wie die automatisierte Terminerstellung in einem Google Kalender funktioniert. Diese praktische Funktion findet sich z.B. bei Hotelbuchungsseiten. Diese tragen nach einer erfolgreicher Buchung einen Termin in dem Standard Google Kalender ein, damit man seine Buchung stets vor Augen hat. Ähnlich ist es auch bei Buchungsseiten von Konzerten oder Veranstaltung. Diese vermerken den Veranstaltungstermin ebenso automatisch in dem für Google hinterlegten Standard Kalender.
Diese Funktion in Kombination mit einem Symfony2 CLI Kommando wäre eine optimale Ergänzung zu meinem Toolkit an Webapplikationen. Eine solche Applikation würde z.B. die Anlage von zufälligen Prüfterminen für ein Server Backup oder die Gültigkeit eines SSL Zertifikats deutlich vereinfachen. Oder wie in meinem Fall, mir einfach die Suche nach zufälligen Terminen für einen “spontanen”-Blumenstrauß für meine Frau erleichtern.
So entstand die Idee zu Random Flower Reminder und wie sich während der Entwicklung zeigte, ist das Konzept der zufälligen Terminerstellung noch für viele weitere Bereiche nutzbar.
Random Flower Reminder
Random Flower Reminder ist eine einfache Symfony2 CLI Applikation welche mit Hilfe der Google Calendar API zufällige Termine in einem freigegebenen Google Kalender erstellt. Die Termine pro Intervall, deren Anzahl sowie die Intervalllänge lassen sich bequem über optionale CLI Parameter einstellen.
Damit die Kommunikation zwischen Applikation und der Google Calender API reibungslos funktioniert nutzt Random Flower Reminder eine serverseitige Authentifizierung mittels Private / Public Key. Dies macht die Angabe von Benutzername und Passwort überflüssig was etwaige Sicherheitslücken durch eine Klartextübertragung minimiert.
Wie funktioniert Random Flower Reminder?
Random Flower Reminder basiert auf einer Kombination aus der Composer Library “google/apiclient” und einem selbst entwickelten Random Date Service. Auf Basis der in der voreingestellten bzw. übergebenen optionalen Parametern errechnet der Random Date Service zufällige Termine welche dann mit einem vordefinierten Kalenderereignis an die Google Calender API gereicht und dort vermerkt werden. Verpackt ist die Logik in einem einfachen Symfony2 Kommando welches sich intuitiv bedienen lässt.
Installation
Die Installation von Random Flower Reminder ähnelt jeder anderen Symfony2 CLI Applikation. Wie gewohnt nutzen wir hierzu Git als SCM und Composer als Package Manager
- git clone git@github.com:patrick-blom/flower-reminder.git
- cd flower-reminder
- composer update
- composer install
Konfiguration
Die Konfiguration unterteilt sich in zwei Teile. Die vorbereitende Konfiguration innerhalb des Google Accounts und die abschließende Konfiguration des Random Flower Reminder. Die Einrichtung des Private/Public Key Pair gestaltet sich seitens Google etwas hakelig muss aber glücklicherweise nur einmalig vorgenommen werden.
Google Konfiguration
1. Zu erst wird ein neues Projekt im Google-Developer-Account erstellt.

2. Danach wird das Projekt mit einem Namen versehen, in unserem Fall “FlowerReminderDemo”

3. Das Projekt ist nicht sofort verfügbar sondern wird erst einmal in den Benachrichtigungen als “Projekt wird erstellt” gezeigt. Sobald das Projekt verfügbar ist, wird dies unter den Benachrichtigungen ersichtlich.

4. Nach dem das Projekt gewählt wurde, muss die Calendar API unterhalb von Google Apps API’s aktiviert werden.


5. Nach dem die API Aktiviert wurde müssen die Zugangsberechtigungen angepasst werden.

6. Um eine Server zu Server Authentifizierung zu erstellen müssen die Einstellungen unter den Dienstkonten vorgenommen werden.

7. Unterhalb der Dienstkonten wird dann ein neues Schlüsselpaar über “Dienstkonto Erstellen” generiert.

8. Im folgenden Fenster, wird dann der Name des Dienstkontos sowie die Berechtigungen gesetzt (Inhaber). Als Schlüsseltyp wird JSON gewählt. Wichtig hierbei ist das, dass neue Dienstkonto domainfrei erstellt wird. Hierzu muss der Haken bei “Domainweite G-Suite Delegation” gesetzt werden.

9. Nach der Schlüsselerstellung wird der neue Schlüssel direkt zum Download angeboten. Zudem wird mit einer Meldung visualisiert das der Schlüssel erfolgreich erstellt wurde.


10. In der Übersicht ist nun auch das neue Schlüsselpaar zu erkennen.

11. Nach dem das Schlüsselpaar erstellt wurde, muss im Google Kalendar die Freigabe für den neuen Schlüssel erstellt werden. Hierzu ändert man im Kalendarinterface bei einen beliebigen Kalender die Einstellungen

12. In den Kalendereinstellungen wird nun unter den Freigaben eine neue E-Mail mit Schreibrechten hinzugefügt

13. Für die Freigabe wird die E-Mail des zuvor erstellen Schlüsselpaars verwendet. So ist gewährleistet das Random Flower Reminder auch Termine anlegen und auslesen kann.


Damit ist die Google Konfiguration abgeschlossen. Im zweiten Teil der Konfiguration wird nun lediglich noch Random Flower Reminder mittels des erstellten Schlüssels an die API angebunden.
Random Flower Reminder Konfiguration
1. Die Konfiguration von Random Flower Reminder ist vergleichsweise simple. Zu erst muss zum “config” Ordner innerhalb des geclonten Repositories navigiert werden

2. In diesem Ordner wird dann der zuvor runtergeladenen Schlüssel abgelegt

3. Zum Abschluss wird der Name des Schlüssels in der parameters.xml hinterlegt. So wird Random Flower Reminder mitgeteilt welcher Schlüssel zu verwenden ist. Zudem können dort auch noch Details zum anzulegenden Termin, bspl. die Beschreibung des Termins oder dessen Dauer hinterlegt werden.

Damit ist die Konfiguration von Randmon Flower Reminder abgeschlossen.
Test
Wie jede vergleichbare Symfony2 CLI Applikation auch wird Random Flower Reminder aus dem “bin” Verzeichnis aus gestartet. Um einen Überblick über die Funktionen zu erhalten wird die Applikation ohne jegdlichen Parameter gestartet.
php bin/application
Um zu sehen welche zuvor freigegebene Kalender verfügbar sind wird die Applikation mit dem parameter zu Auflistung der Kalender gestartet.
php bin/application reminder:calendar:list

Hier wird nun der zuvor freigegebne Kalender “temp” ausgegeben. Durch diese Auflistung wird die KalenderId sichtbar, welche für alle weiteren Befehele notwendig ist.
Um zu testen ob die Terminanlage funktionsfähig ist, bietet Random Flower Reminder einen Dummy Befehl welcher einen Termin am nächsten 3 November anlegt. Um zu sehen welche Parameter ein Befehl benötig und welche Angaben optional sind, kann das standard Symfony2 CLI help Kommando verwendet werden.
php bin/application help reminder:calendar:create:dummy
Somit ergibt sich für das o.g. Beispiel foglender Befehl.
php bin/application reminder:calendar:create:dummy ev9ja1ckt6vbhqhct4f4c589lg@group.calendar.google.com
War die Anlage des Termins erfolgreich, wird dies visualisiert und ist im Google Kalender ersichtlich.


Wenn die Funktion sichergestellt ist und alle Angaben im Temrin korrekt sind können die Zufallstermine erstellt werden. Dies funktioniert ähnlich wie die Anlage des Dummy Termins. Die Defaulteinstellungen können, wie zuvor bereits angemerkt, durch die Angabe optionaler Parameter verändert werden. Da für unser Beispiel die Defaulteinstellungen ausreichend sein genügt folgender Befehl. Auch hier wird wieder die bereits bekannte KalendarId verwendet.
php bin/application reminder:calendar:create:random ev9ja1ckt6vbhqhct4f4c589lg@group.calendar.google.com
Die Dauer der Alnage variiert nach Anzahl der Termine. Wie auch schon bei dem Dummy Befehl, werden die angelgten Termine im Anschluss dem User visualisiert.

Fazit
Die Entwicklung von Random Flower Reminder hat nicht nur meine Eingangsfrage beantwortet sondern zudem noch interessante Erkenntnisse hervorgebracht. So stelle sich heraus, das die Erstellung des Private/Public Schlüssels im Google Developer Account deutlich komplexer ist als angenommen. Im Vergleich dazu war die Entwicklungsarbeit relativ gering, da die von Google bereitgestellte Composer Library sich um die Kommunikation zwischen API und Applikation kümmert und zu dem OuOfTheBox funktioniert. Dazu kommt das die Integration dieser Library problemlos mit der Symfony2 CLI Komponente umsetzbar war, was den Entwicklungsprozess zusätzlich beschleunigte.
Das ganze Projekt ist quelloffen auf GitHub verfügbar und ermöglicht einen kurzen Einblick in die umfangreiche Welt der kostenlosen Google API Dienste.