Schickt automatisch eine Telegram-Nachricht, wenn in einem TimeTree-Kalender ein neues Event erstellt (oder geändert) wird – mit Titel, Datum, Beschreibung und Link. Läuft kostenlos auf GitHub Actions, ohne dauerhaft laufendes Gerät.
⚠️ Nutzt die inoffizielle TimeTree-Web-API. Das kann jederzeit kaputtgehen, wenn TimeTree etwas umbaut. Für ein kleines Team-Newsboard okay, aber kein „einmal bauen, nie wieder anfassen“.
- Einen TimeTree-Account (am besten einen Extra-/Dummy-Account), der in Renés Kalender Mitglied ist.
- Einen Telegram-Bot + einen Telegram-Kanal, dem deine CrossFit-Leute beitreten.
- Ein (privates) GitHub-Repo mit diesen Dateien.
- In Telegram @BotFather anschreiben →
/newbot→ Namen vergeben → du bekommst einen Bot-Token (sieht aus wie12345:ABC...). - Einen Kanal erstellen (das ist die „Newsletter“-Seite für deine Leute). Den Bot als Administrator zum Kanal hinzufügen.
- Die Chat-ID des Kanals herausfinden: Bei einem öffentlichen Kanal reicht
@deinkanalname. Bei einem privaten Kanal: einmal etwas posten, dannhttps://api.telegram.org/bot<TOKEN>/getUpdatesim Browser öffnen und diechat.idablesen (beginnt meist mit-100…). - Deine Leute abonnieren später einfach über den Einladungslink des Kanals.
- Lege ein privates Repo an und lege dort ab:
notify.js.github/workflows/notify.yml(die mitgeliefertenotify.ymldorthin)
state.jsonwird automatisch vom Skript erzeugt und ins Repo geschrieben.
Setze erstmal nur TIMETREE_EMAIL und TIMETREE_PASSWORD als Secrets
(siehe Schritt 4) und starte den Workflow einmal manuell ohne CALENDAR_ID.
Im Log werden alle Kalender mit ihrer id aufgelistet. Die passende id dann
als Secret CALENDAR_ID eintragen.
Im Repo unter Settings → Secrets and variables → Actions → New repository secret:
| Secret | Wert |
|---|---|
TIMETREE_EMAIL |
E-Mail des Dummy-Accounts |
TIMETREE_PASSWORD |
Passwort des Dummy-Accounts |
TELEGRAM_BOT_TOKEN |
Token von @BotFather |
TELEGRAM_CHAT_ID |
@deinkanal oder die -100…-ID |
CALENDAR_ID |
aus Schritt 3 |
AUTHOR_FILTER |
(optional) nur Events von René – siehe unten |
Der Workflow startet alle ~20 Minuten von selbst (oder per Knopf unter Actions → Run workflow). Der erste echte Lauf merkt sich nur den aktuellen Stand und verschickt nichts – ab dann kommen nur noch neue/geänderte Events. So wirst du nicht mit alten Events zugespammt.
- Beschreibung: kommt zuverlässig mit (Feld
note). - Kommentare: Die
events/sync-Schnittstelle liefert keine Kommentare – die hängen an einem separaten, undokumentierten Endpunkt. Als Ersatz meldet das Skript, wenn ein bestehendes Event geändert wurde (✏️), z.B. wenn René nachträglich die Beschreibung ergänzt. Echte Kommentar-Threads müsste man per Browser-Netzwerk-Tab nachschauen und separat anbinden. - „Nur von René“ (
AUTHOR_FILTER): TimeTree benennt das Ersteller-Feld nicht eindeutig. So findest du den richtigen Wert: Workflow einmal mit Repo-VariableDEBUG_DUMP=1laufen lassen (oder lokalDEBUG_DUMP=1 node notify.js). Im Log siehst du ein Beispiel-Event mit allen Feldern – dort die ID/den Namen von René ablesen und alsAUTHOR_FILTEReintragen. Lässt du das Secret leer, kommen Benachrichtigungen für alle neuen Events. - Link: Das Linkformat ist ein begründeter Best-Effort. Falls der Link mal
nicht direkt aufs Event springt: ein Event im Browser öffnen, das Format in der
Adresszeile ansehen und in
notify.jsdie FunktioneventLink()anpassen. - Tempo: GitHub-Cron läuft nicht sekundengenau und kann sich bei Last etwas verzögern. Für Event-Ankündigungen völlig ausreichend.
TIMETREE_EMAIL=... TIMETREE_PASSWORD=... node notify.js # listet Kalender
TIMETREE_EMAIL=... TIMETREE_PASSWORD=... CALENDAR_ID=... \
TELEGRAM_BOT_TOKEN=... TELEGRAM_CHAT_ID=... node notify.js # echter Lauf