Telegram erlaubt Automatisierung über die Telegram-Bots – kleine Roboter-Accounts. Wir zeigen Schritt für Schritt, wie Ihr die API nutzt – ohne Vorwissen!

Für Telegram gibt es sogenannte Bots – letztlich sind das einfach Nutzer-Accounts für Programme/Roboter statt Menschen. Diese Konten lassen sich dann per API/Schnittstelle ansprechen und ganz „normal“ in Telegram nutzen. Ihr könnt also beispielsweise Umfragen für Terminvereinbarungen in eine Telegram-Gruppe einbauen, eigene Clients schustern, von der Kommandozeile aus Dateien, Fotos oder Text senden, Nachrichten als Telegram-Messages anzeigen und so weiter. Das Schicke daran: Den Bot erstellt Ihr ganz simpel über das Telegram-Standard-Konto Botfather im Dialog. Wir zeigen Euch Schritt für Schritt, wie Ihr einen Bot erstellt und von der Kommandozeile aus Texte und Dateien sendet. Vorwissen wird nicht benötigt.

[UPDATE] Im zweiten Teile zeigen wir Euch, wie Ihr Nachrichten im Terminal empfangen könnt.

Natürlich gibt es auch fertige Bots, für Hundebilder und sowas, hier geht es aber darum, eigene Bots zu erstellen:

1. Botfather integrieren

Fügt zunächst den „Nutzer“ @botfather hinzu – über die Suchfunktion oder den Link auf der Homepage.

Zunächst fügt Ihr den @Botfather hinzu – ein Angebot, dass Ihr nicht …

2. Telegram-Bot erstellen

Um Euren Bot zu erstellen, sendet dem neuen Nutzer Botfather einfach die Nachrichten

/newbot

und vergebt anschließend auf Nachfrage Nutzer- und Bot-Namen – letztere müssen auf bot enden. Zum Abschluss bekommt Ihr den sogenannten Token, eine längere Zeichenkette, die Euren Bot eindeutig identifiziert. Am besten kopiert Ihr Euch den Token-Code direkt. Optional könnt Ihr noch eine About-Seite, ein Nutzerbild für den Bot etc. einrichten – sendet einfach im Telegram-Client Befehle wie /setuserpic, /help und so weiter. Nicht vergessen: Ihr müsst den Bot jetzt starten und eine erste Nachricht versenden, sonst funktioniert der nächste Schritt nicht.

Sehr cool: Bots erstellt Ihr im Dialog mit @botfather

3. ID des Chats herausfinden

Um eine Nachricht an einen Telegram-Chat oder eine Telegram-Gruppe zu senden, benögtigt Ihr die entsprechende Chat-ID, die Ihr über folgendes Kommando bekommt:

curl -X POST https://api.telegram.org/bot123456:abcde1234ABCDE/getUpdates

Zunächst: 123456:abcde1234ABCDE müsst Ihr natürlich durch Euren Token-Code ersetzen. Das Linux-Standard-Werkzeug curl dient lediglich dazu, eine HTTP-Anfrage an Telegram abzusetzen. Unter Windows müsst Ihr zunächst curl für Windows installieren. Übrigens: cURL steht für „see url“, aber egal. Das Ergebnis dieser Anfrage ist etwas in der Art:

{"ok":true,"result":[{"update_id":638422092,
"message":{"message_id":9,"from":{"id":268963852,"first_name":"Gizlog"},"chat":{"id":268963852,"first_name":"Gizlog"},"date":1437389925,"text":"c"}},{"update_id":638422093, 

Wichtig ist hier die ID des Chats, in diesem Beispiel also 268963852. Anmerkung: Natürlich könnt Ihr Euren neuen Bot wie jeden anderen Account einer Gruppe hinzufügen – dann taucht beim obigen Ergebnis auch die ID des Gruppen-Chats auf, den Ihr nutzen könnt, um in die Gruppe zu posten.

Die ID des Chats müsst Ihr auslesen.

4. Nachrichten und Dateien an Telegram senden

Auch zum Senden von Nachrichten nutzen wir wieder curl:

curl -X  POST 'https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text="texty text"'

Ihr seht schon, es ist wieder dasselbe Konstrukt wie oben, aber mit der Methode/dem Befehl „sendMessage“ und daran angefügt, abgetrennt per ?, zunüchst die Chat-ID und dann mit & abgetrennt der zu sendende Text. Und schon landet die Nachricht „texty text“ in Eurem Telegram-Account, abgesandt von „Nutzer“ TutoBot in unserem Beispiel. Das Senden von Dateien und Fotos ist dann selbsterklärend:

curl -X  POST "https://api.telegram.org/bot123456:abcde1234ABCDE/sendDocument" -F chat_id=-419426123 -F document="@/home/mirco/misto.txt"

Die Methode heißt nun sendDocument – allerdings muss die HTTP-Anfrage im Format „multipart/form-data“ gesendet werden, weshalb Chat-ID und Dokumentenpfad separad via F-Parameter an den curl-Befehl angehängt werden. In diesem Beispiel wird die Datei misto.txt an unseren Tutonaut-eigenen Gruppen-Chat gesendet (der Strich gehört zur Gruppen-Chat-ID!). Denkt an das @ vor dem Dokumentenpfad. Der Foto-Befehl ist komplett analog:

curl -X  POST "https://api.telegram.org/bot123456:abcde1234ABCDE/sendPhoto" -F chat_id=-4194264 -F photo="@/home/mirco/rathaus.jpg"

Messaging aus der Bash – viel einfacher kann API-Nutzung kaum sein.

Bis hierher ist das ganze freilich nur Spielerei – wie geht’s weiter? Zum einen könntet Ihr Telegram natürlich auch über Programmiersprachen ansprechen und ganze Programmlogiken darum herum stricken. Aber schon auf der Kommandozeile geht noch einiges: Statt eines fixen Texts könnt Ihr natürlich auch eine Variable einsetzen, also statt „texty text“ etwa „$text“ – und diese Variable ließe sich über Skript oder Nutzeranfragen ganz einfach besetzen. Ein Super-Simpel-Beispiel wäre ein Mini-Skript wie:

echo "Gib die Nachricht ein:" &&
read text &&
curl -X  POST "https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text=$text"

Wenn Ihr das etwa als Alias oder Skript abspeichert und dann aufruft, wird zunächst „Gib die Nachricht ein“ ausgegeben, dann gebt Ihr eben die Nachricht ein und per Return wird der eingegebene Text an Telegram gesendet. Soweit einfach mal als Einstieg.

Wenn was unklar ist, einfach fragen, „dumme“ Fragen gibt es bei so einem Thema eh nicht. Und was macht Ihr mit Bots? Oder würdet Ihr gerne machen? Was haltet Ihr überhaupt davon?

Über den Autor

Mirco Lang

Mirco Lang

Am Anfang war der C-64 des großen Bruders des besten Freundes in der Grundschule ...

Der echte Technikwahn kam dann mit einer Ausbildung bei Saturn - als Computer noch erklärt werden mussten, Soundkarten benötigten, ein gutes Monatsgehalt kosteten und das Internet nur bei Nerds und mit 38 kbp/s lief, bestenfalls.

Ein Studium der Informationswirtschaft und ein paar Jahre als Redakteur bei Data Becker später, sitzt hier ein freier Journalist, der auf Old-School-Computing (cli ftw!), Free Software, Frickelei, Kodi und "Hundedinger" steht - und Grauseligkeiten wie Bild und Heftig.co zutiefst verabscheut.

Und sonst so? Sauerländer, BSI-Mitarbeiter, untalentierter Musikinstrumentebesitzer und seit 24 Jahren Skateboarder, ein ziemlich alter. Und manchmal kommt das abgebrochene Philo-Studium wieder durch ...

Sag' Deine Meinung

Kommentare

  • Hallo,

    schöne Einführung. Allerdings will dein Befehl mit der Variablen nicht funktionieren. Als Resultat erhalte ich nur „$text“.
    Muss da noch was geändert werden?

    Gruss Andreas

  • Uuups – Danke für den Hinweis, das stimmte in der Tat was mit den Anführungszeichen nicht. Der POST-Befehl war in der Art:

    POST ' blabla "'
    

    sollte aber sein:

    POST " blabla " 
    

    also nur ganz normale Anführungszeichen um die Adresse herum. Hab’s geändert, sollte jetzt passen.
    Ich hatte das aus meinem Alias herauskopiert, weshalb hinten dran das „‚“ war – und dann habe ich irgendwann wohl verschlimmbessert. Wenn im Terminal was nicht klappt, sind’s aber auch fast immer diese ollen Anführungszeichen … ;-(

  • … dann gilt dies bei mir = nur unter Windows 😉

    Denn curl -X POST ‚https://api.telegram.org/bot123456:abcde1234ABCDE/sendMessage?chat_id=-4194264&text=“texty text“‚ konnte ich NICHT ausführen. Erst nachdem ich die Anführungszeichen „umgedreht“ hatte …

    Doch ’ne ganz andere Frage: ließen sich mit einem solchen Bot auch die Nachrichten eines Kanals auslesen, den nur ich selbst „fülle“, quasi nur für eigene Zwecke nutze?

    DANKE & demnächst ’ne Gute Nacht! 🙂

  • Zu dieser Anmerkung hätte ich ’ne Anmerkung 😉

    → »Anmerkung: Natürlich könnt Ihr Euren neuen Bot wie jeden anderen Account einer Gruppe hinzufügen«

    Denn wenn ich versuche, in einem Kanal von mir (in dem nur ich selbst Mitglied bin, da auch nur für mich selbst gedacht) meinen Bot hinzuzufügen (über den Web-Client), so erscheint bei mir folgende Fehlermeldung:

    ===
    Fehler
    Eine Parameter fehlt oder ist ungültig.
    Method: channels.inviteToChannel
    Result: {„_“:“rpc_error“,“error_code“:400,“error_message“:“USER_BOT“}
    Stack: Error
    at u (https://web.telegram.org/js/app.js:18:3697)

    Ist Dir dieser „Fehler“ bekannt?

    Danke!
    webaschtl

  • Hallo
    bei mir kommt der fehler,
    curl: (60) SSL certificate problem: self signed certificate in certificate chain
    More details here: http://curl.haxx.se/docs/sslcerts.html

    curl performs SSL certificate verification by default, using a „bundle“
    of Certificate Authority (CA) public keys (CA certs). If the default
    bundle file isn’t adequate, you can specify an alternate file
    using the –cacert option.
    If this HTTPS server uses a certificate signed by a CA represented in
    the bundle, the certificate verification probably failed due to a
    problem with the certificate (it might be expired, or the name might
    not match the domain name in the URL).
    If you’d like to turn off curl’s verification of the certificate, use
    the -k (or –insecure) option.

    was mache ich da falsch
    mfg Farmer

    • Irgendwo auf dem Weg von Dir zum angesprochenen Server liegt ein ungültiges SSL-Zertifikat – wo und warum genau kann ich nicht sagen. Du könntest wie vorgeschlagen den Schalter „-k“ nutzen, der auch SSL-Verbindungen ohne Zertifikatscheck erlaubt. Im Zweifelsfall könnte die Transportverschlüsselung über SSL somit angreifbar/unsicher sein. Sofern es zunächst mal ums Testen geht und/oder keine lebenswichtigen Daten telegrammiert werden, ist das nun aber auch nicht so tragisch.
      Was das Problem an sich angeht: Funkst Du vielleicht aus einem komplexeren Netzwerk heraus? Konfiguriert da jemand selbst SSL? (Falls ja: DER muss es wissen.) Oder hat sich das Problem mittlerweile vielleicht schon erledigt?

  • Hallo
    Hab diesen Fehler gefunden, hatte -s vergessen vor -X zu setzen, jetzt bekomme ich aber leider keinen Request mehr, bleibt alles lehr

    • Ja, wie unter Schritt 4 durchexerziert: Für Bilder gibt es die photo-Option, für Dokumente die document-Option – wobei „document“ hier auch ein Video sein kann.

  • Ich habe folgendes „Problem“ und bin mir nicht ganz klar darüber, ob ich das mit Telegram-Bots lösen kann bzw. sollte oder ob es das einfachere/bessere Methoden gibt :

    mehrere Personen werden per E-Mail von einem Server automatisch alarmiert und jeder muß dann entscheiden, ob er zum Einsatz fährt oder nicht. Bis jetzt gibt es keine Möglichkeit, die anderen alarmierten Personen darüber zu informieren, ob man kommt und wie lange die Anfahrt dauert. So kann es passieren, daß wir überbesetzt sind oder – noch schlimmer – zu wenige Leute sind, da jeder meint, der andere wird eh schon fahren. Das möchte ich mit einer Feedbackmöglichkeit an alle Alarmierten ändern.
    Es werden von den Leute die unterschiedlichsten Endgeräte, Betriebssysteme und E-Mail-Programme benutzt.

    Macht das Sinn, das mit so einem Telegram-Bot zu lösen ? Gibt’s Meinungen/Vorschläge dazu ?

    • Mmmhhh, auf Anhieb klingt das so, als würde es helfen, statt oder zusätzlich zu Mails Telegram-Nachrichten an zu verschicken. Das könnte einfach an eine Gruppe geschickt werden, in der alle drin sind – Feedback könnte dann jeder ganz einfach geben. Ein wenig mehr Aufwand würde es bedeuten, das per Bot zu lösen, der zum Beispiel sowas könnte: Nachricht geht an die einzelnen Nutzer und diese antworten über einen Ja/Nein-Button und vielleicht noch eine Auswahl für die Zeit, etwa 15/30/45/60 Minuten.

      Generell würde ich sagen, Telegram wäre eine gute Lösung dafür, da es im Gegensatz zu Mail synchrone Kommunikation ist – und „Einsatz“ klingt jetzt eher nach was Dringlichen. Die Frage ist, wie die bisherige Mail verschickt wird. Variante 1: Macht das jemand manuell, kann derjeniger auch eine Telegram-Nachricht an die Gruppe verschicken – technischer Aufwand ist dann gleich null. Variante 2: Wenn die Mail automatisiert, etwa von einem Informationssystem, verschickt wird und dann einfach zusätzlich die Telegram-Nachricht raus soll, müsste das irgendwie per Skript gelöst werden – technischer Aufwand hängt vom Mail-Verschick-System ab, auf Telegram-Seite wäre es in etwa das, was hier im Artikel steht. Variante 3: Wenn das ganze komfortabel per Bot passieren soll, muss dafür ein wenig Logik erstellt werden – das dürfte nicht allzu schwierig sein, aber man bräuchte schon einen Menschen, der Grundwissen Scripting/Programmierung hat und die Zeit, sich einzuarbeiten.

      Alternativ kannst Du auch mal schauen, ob es nicht Quick&Dirty-Möglichkeiten gibt. Beispielsweise gibt es den @PollBot, der Umfragen samt Antwortmöglichkeiten per Button und Auswertungen erstellt. Du erreichst den Bot über die Suchfunktion von Telegram – vielleicht ließe sich der zweckentfremden.

      Wenn „Einsatz“ hier nicht zeitkritisch ist, und bei E-Mail muss ich eigentlich davon ausgehen, würde es mich allerdings wundern, wenn sich nicht irgendwo ein entsprechendes Stück Software finden lassen würde; beispielsweise als Add-on für ein Content Management System. Stichworte die hier zielführend sein könnten: Vereinsverwaltung, Leitsystem, Konferenz-Management, Echtzeit-Terminverwaltung (Doodle auf Bot-Basis wäre perfekt 😉 ) oder vielleicht auch irgendwas aus dem Bereich Feuerwehr, da scheint es auch Open-Source-Leitsystem-Lösungen zu geben …

      Ist jetzt alles ein wenig Brainstorming-mäßig, aber vielleicht ist ja ein passender Ansatz dabei.

      • Vielen Dank für die schnelle Antwort.
        Das Beispiel von der Feuerwehr geht schon in die Richtung, wir sind aber Teil des Rettungsdienstes. Alarmiert werden wir vollautoamtisch von der Leitstelle, aber in erster Linie über den Piepser (also Funk) und nur zusätzlich per E-Mail und SMS. Der Piepser ist aber nur Funkempfänger und kann nichts Zurücksenden. Dass das nicht optimal ist, ist bekannt, aber zur Zeit gibt’s dafür noch keine akzeptierte Lösung.
        Bis da was kommt wollen wir hier vor Ort zumindest eine Quick&Dirty-Lösung haben, die auch nur als Zusatzinfo genutzt werden wird – 100% darauf verlassen werden wir uns sicher nicht.

        Beim Leitstellensystem können wir nix ändern und sicherlich auch die ITler nicht dazu überreden; alles was wir machen ist sowieso nicht amtlich und damit Grauzone. Die Varianten 1 + 2 fallen also aus.

        Brainstorming war schon richtig. Ich war mir hier nur nicht im Klaren, ob ich das Bot-System richtig verstanden habe.
        Ich such dann also mal weiter und werd nich bei Bedarf nochmal melden.

        Vielen herzlichen Dank für die Mühe und die Antwort !

  • Gute Beschreibung. Danke.
    Ich schaffe es nur leider nicht die ID zu Bekommen. Ich erhalte immer nur ein:

    {„ok“:true,“result“:[]}

    Die API stimmt, ändere ich eine Zahl kommt soort als Antwort ein Fehler.
    Haben die was geändert?
    Grüße,
    Gal

  • Danke für Deine tolle Anleitung. Ich benutze den Bot für ioBroker und Hausautomation. Das heisst, ich kann mit meinem Haus chatten und z.B. das Licht aus den Ferne einschalten oder Status Meldungen erhalten. Das funktioniert prima. Um nun mit IFTTT zu arbeiten, muss ich Befehle über die URL versenden, da es zur Zeit noch keine Telegram Instanz für IFTTT gibt. Um die Chat ID zu bekommen, bin ich Deiner Anleitung gefolgt, erhalte aber immer: {„ok“:false,“error_code“:404,“description“:“Not Found“} als Ergebnis.

    Am Mac Terminal benutze ich folgende Eingabe:

    sudo curl -X POST https://api.telegram.org/R2D2:296974797:XXXXXh1KTMmccQAqh6767R5mYk4b0/getUpdates

    Wenn der Bot R2D2 heißt und er Username Peter ist, dann gebe ich ein R2D2, Peter@R2D2 oder R2D2_bot ein? Ich habe alle Varianten durch und bestimmt keinen Fehler beim Token gemacht. Was kann ich noch tun?

    • Der Bot-Name muss gar nicht in die URL, nur der Token, den den der Botfather ausgegeben hat, so dass dann sowas rauskommt: …/botTOKEN/getUpdates. „bot“ steht hier nicht stellvertretend für den Bot-Namen, es sollten tatsächlich die drei Buchstabe bot sein. Wenn das hilft, gib doch mal kurz bescheid, dann füge ich noch einen Hinweis in den Text ein.

      • Das hat geholfen. Jedenfalls etwas 😉
        Ich bekomme jedoch immer {„ok“:true,“result“:[]} als response. Die Gruppe ist aktiv, ich habe Nachrichten versendet und vom Bot empfangen. Nur der Parameter getMe bringt die Chat ID vom Bot. Der Parameter getUpdates bringt immer nur das leere Ergebnis.

    • Sorry, habe die Kommentare zuerst nicht gesehen. Man muss erst etwas dahin posten.
      „/start“ reicht übrigens nicht, wie oben geschrieben.

      • Hallo,

        ich habe das gleiche Problem. Ich habe meinen Bot eingerichtet und ich kann auch FHEM aktion auslösen usw.
        Nun brauche ich allerdings die ChatID für Tasker.

        Jemand eine Idee?

        Habe testweise einen weiteren Bot erstellt (/start natürlich gemacht und mehrmals Texte geschreiben) da bekomme ich auch nur
        {„ok“:true,“result“:[]}

        • Hab ich auch versucht. Beim neuen Bot das gleiche Ergebnis. getMe funktioniert, getUpdates immer nur {„ok“:true,“result“:[]}.
          Auch hat meine Suche an anderen Stellen des Netzes nix gebracht. Ein Tip wäre schön! Danke