Telegram: Nachrichten per Bot von der Heimautomation aufs Handy

Telegram bietet eine Funktion, mit der man automatisiert Nachrichten versenden kann – über einen Bot. Dies kann man zum Beispiel in der Heimautomation ganz wunderbar nutzen, um über aktuelle Geschehnisse informiert zu werden, indem man sich Nachrichten aufs Mobiltelefon senden lässt. In diesem Beitrag möchte ich euch einmal zeigen, wie man einen eigenen Bot einrichtet und wie man ihn per URL-Aufruf nutzen kann.

Dass ihr bereits einen Account bei Telegram habt setze ich einfach mal voraus.

Inhalt

Telegram Bot einrichten

Wir beginnen, indem wir in Telegram einen Chat mit @BotFather starten. Im Chat-Fenster klicken wir auf die Schaltfläche Start oder geben /start ein.

Als nächstes legen wir mit /newbot einen neuen Bot an, geben ihm einen beliebigen Namen (ich nenne ihn indiBot) und vergeben zusätzlich einen eindeutigen Telegram-Benutzernamen. Meiner heißt indiBits_bot. Die Benutzernamen für Bots müssen immer mit „bot“ oder „Bot“ enden.

Name vs. Benutzername: warum zwei Namen?
Der Benutzername ist sozusagen die Telefonnummer des Bots und muss Telegram-weit eindeutig sein. Der Name hingegen ist der Eintrag im Telefonbuch und kann beliebig gewählt werden.

Anschließend bekommen wir den Token für unseren Bot angezeigt. Meiner lautet 5035750014:AAEV9N2H0TBhtmnTv2lbvYjWMv5ERRaozao. Den Token benötigen wir gleich noch.

Telegram: neuen Bot anlegen

Telegram: neuen Bot anlegen

Mein Bot ist nun unter @indiBits_bot erreichbar.

Eigene User-ID abfragen

Damit wir uns gleich selbst Nachrichten zusenden können benötigen wir noch unsere eigene User-ID (die nochmal etwas anderes ist, wie Name oder Benutzername).

Dazu beginnen wir einen Chat mit @userinfobot und klicken auf die Schaltfläche Start, bzw. geben /start ein. Wir bekommen direkt die nötigen Informationen zugesandt.

Telegram: User-ID abfragen

Telegram: User-ID abfragen

Nachrichten versenden

Wir wollen uns Nachrichten mittels einfachem URL-Aufruf zusenden. D.h., wir geben eine Adresse im Webbrowser ein, die bereits alle Informationen enthält, sodass allein dieser Aufruf dazu führt, dass wir eine Nachricht aufs Mobiltelefon bekommen.

Die Adresse setzt sich aus mehreren Teilen zusammen:

  1. https://api.telegram.org/ (Adresse der Bot-API)
  2. bot<Token>/ (Der Token unseres Bots, den uns @BotFather angezeigt hat; dem Token wird das Wort bot vorangestellt)
  3. sendmessage? (Befehl, den der Bot ausführen soll)
  4. chat_id=<User-ID>& (Die User-ID, die uns @userinfobot angezeigt hat)
  5. text=<Text> (Inhalt der Nachricht, Leerzeichen ggf. durch %20 ersetzen – je nachdem, wie sich die Anwendung verhält, mit der der Text versendet wird)

Ein zusammengesetztes Beispiel könnte so aussehen:

https://api.telegram.org/bot5035750014:AAEV9N2H0TBhtmnTv2lbvYjWMv5ERRaozao/sendmessage?chat_id=238470164&text=Liebe Grüße vom indiBot

Fügt man diese Adresse nun in der Adresszeile eines Webbrowsers ein bekommt man unmittelbar eine Telegram-Nachricht mit dem Inhalt „Liebe Grüße vom indiBot“ zugesandt. Allerdings muss man zuvor aktiv den Bot kontaktieren und genau wie bei @BotFather und @userinfobot den Chat starten.

Telegram: Nachricht vom eigenen Bot

Telegram: Nachricht vom eigenen Bot

Nachrichtentext formatieren

Man kann Inhalte auch formatieren, um beispielsweise die Lesbarkeit zu verbessern. Dazu stehen die Formatierungsoptionen Markdown und HTML zur Verfügung. Besonders viel ist damit nicht möglich, aber die grundlegenden Funktionen sind vorhanden. Welche Formatierung angewendet werden soll, wird mit dem zusätzlichen Parameter parse_mode= in der URL angegeben.

Formatierung Markdown V2 HTML Darstellung
parse_mode= markdownv2 html  
Fett-Schrift *bold \*text* <b>bold</b> fett
Kursiv _italic \*text_ <i>italic</i> kursiv
Unterstrichen __underline__ <u>underline</u> unterstrichen
Durchgestrichen ~strikethrough~ <s>strikethrough</s> durchgestrichen
Spoiler ||spoiler|| <tg-spoiler>spoiler</tg-spoiler> <versteckter Text>
Inline-Links [Linktext](http://.../) <a href="http://.../">Linktext</a> Schau dir das mal an
Inline-Code `Inline-Code` <pre>Inline-Code</pre> Inline-Code
Code-Block ```python
Code-Block
```
<pre><code class="language-python">Code-Block</code></pre>

Formatierungen können auch ineinander verschachtelt werden, allerdings kann Code naturgemäß keine weiteren Formatierungen beinhalten.

Weder in der Desktop-App, noch auf dem iPhone gibt es einen sichtbaren Unterschied zwischen Inline-Code und einem Code-Block. Ob es sich dabei um einen Bug handelt, oder das so beabsichtigt ist, konnte ich bisher nicht herausfinden.

Aus Kompatibilitätsgründen gibt es auch noch Markdown V1 (parse_mode=markdown), diese bietet jedoch weniger Möglichkeiten als V2, daher gehe ich nicht weiter darauf ein.

Hinweise zu Markdown V2

  • Innerhalb von pre und code müssen  ` und \ mit einem vorangestellten Escape-Zeichen (Backslash \) angekündigt werden. Möchte man also einen Backslash schreiben, muss man diesen doppelt ausführen (\` oder \\).
  • Innerhalb von (...) eines Inline-Links muss ) und \ ein Backslash vorangestellt werden (\) oder \\).
  • Innerhalb von normalem Text müssen die Zeichen _, *, [, ], (, ), ~, `, >, #, +, -, =, |, {, }, ., ! mit einem vorangestellten Backslash maskiert werden.
  • Gemäß der offiziellen Telegram-API-Dokumentation muss eine Unterstreichung mit \r beendet werden, wenn sie in Kombination mit kursivem Text verwendet werden soll. Ich bin jedoch der Meinung, dass das nicht korrekt funktioniert, da das Steuerzeichen \r trotzdem mit ausgegeben wird.
    • ___kursiv_unterstrichen__ wird zu kursivunterstrichen
    • ___kursiv%20unterstrichen_\r__ wird zu kursivunterstrichenr (das r wird mitgeschrieben)
    • ___kursiv%20unterstrichen___ verursacht eine Fehlermeldung

Hinweise zu HTML

  • Es werden nur die angegebenen HTML-Tags unterstützt.
  • Alle <, > und & Zeichen, die nicht Bestandteil eines HTML-Tags sind, müssen in der entsprechenden HTML-Schreibweise angegeben werden (< wird zu &lt;, > wird zu &gt; und & wird zu &amp;).
  • Alle numerischen HTML-Entitäten werden unterstützt (&#8240; wird zu ‰, usw.)
  • Die API unterstützt folgende benannte HTML-Entitäten: &lt;, &gt;, &amp; und &quot;.
  • Mit verschachtelten pre und code Tags kann die Programmiersprache für einen Code-Block angegeben werden.
  • In alleinstehenden code Tags kann keine Programmiersprache angegeben werden.

Beispiele

https://api.telegram.org/bot<Token>/sendmessage?chat_id=<User-ID>&parse_mode=markdownv2&text=Liebe%20Grüße%20vom%20*indiBot*
 
https://api.telegram.org/bot<Token>/sendmessage?chat_id=<User-ID>&parse_mode=markdownv2&text=Es%20gibt%20ein%20__dringendes__%20Problem
 
https://api.telegram.org/bot<Token>/sendmessage?chat_id=<User-ID>&parse_mode=markdownv2&text=Ein%20___bunter_%20Text__%20*mit* ||unsichtbaren||%20_*Elementen*_

Der Token und weitere Einstellungen

Sollte man mal den Token vergessen, kann man jederzeit @BotFather kontaktieren und diesen mit dem Befehl /token abfragen. Oder solltet ihr, so wie ich hier, alles öffentlich gemacht haben, lässt sich mit dem Befehl /revoke der Token zurücksetzen. Dabei wird dann ein neuer Token generiert, unter dem der Bot künftig erreichbar ist.

Es gibt noch weitere Einstellungen, die man vornehmen kann. Im Begrüßungstext zeigt euch @BotFather, was möglich ist. Am leichtesten geht es mit dem Befehl /mybot, der euch ein interaktives Menü zeigt, mit dem man sich durch alle Einstellungen klicken kann.

Anwendung des Telegram Bots

Wer jetzt noch keine Idee hat, was man mit einem Bot nun anstellen soll, nachfolgend eine kleine Inspiration:

Man hat irgendwo ein Programm beliebiger Art laufen und möchte sich Fehlermeldungen oder Werte zusenden lassen. An der Stelle, wo die Fehlermeldung erzeugt wird, baut man sich die URL aus https://api.telegram.org/bot<Token>/sendmessage?chat_id=<User-ID>&text= und einem dynamisch generierten Text zusammen, den man einfach an die URL anhängt. Anschließend lässt man das Programm die Gesamt-URL aufrufen und schon hat man die Fehlermeldung auf dem Mobiltelefon.

Für viele Systeme gibt es schon Telegram-Plugins, aber eben nicht für alle. Ein HTTP-Request ist dann der einfachste Weg, eine Nachricht zu versenden.

Der hier verwendete Bot @indiBits_bot, mein Benutzername @indibit_de und die User-ID 238470164 sind frei erfunden, bzw. wurden nur für diesen Beitrag erzeugt.

Weiterführende Links

Sebastian

1 Comment

  1. Antworten Bash-Hex

    Hallo Sebastian,
    vielen Dank für die super Erklärung zur Nutzung von Telegram über Bots.
    Ich habe mir einen kleinen Sketch auf einen ESP8266-12F geladen, der mir Statusnachrichten an mein
    Handy, auf dem Telegram installiert ist senden soll.
    Mit meiner Fritz!Box funkttoniert da alles ganz prima,es wird jedoch keine Nachricht gesendet, wenn ich meinen
    Bot an einem andern WLAN- Netzwerk anmelde. Die Ports 443, 80, 88 and 8443 müssten offen sein.
    Die genutzte Library ist:
    Hast du vielleicht eine Idee ab was das liegen könnte?
    Viele Grüße
    Micha B.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht.

WordPress Cookie Hinweis von Real Cookie Banner