Einführung in Telegram Bots 2: Nachrichten automatisch im Terminal empfangen
Wie Ihr Telegram-Bots erstellt und von der Kommandozeile aus Texte und Dateien sendet, haben wir Euch hier im Artikel gezeigt. Nun ist es aber auch nach der Lektüre leider nicht völlig selbsterklärend, wie Ihr anschließend Nachrichten empfangen könnt. Also zeigen wir Euch Schritt für Schritt, wie Ihr automatisch alle Nachrichten bekommt, die direkt an den Bot gerichtet sind oder aber in Gruppen gepostet werden, in denen der Bot Mitglied ist. Einzige Voraussetzung: Ihr habt einen Bot erstellt, wie in Teil 1 nachzulesen.
Die folgende Prozedur stellt den wohl einfachsten, sicherlich nicht einzigen oder elegantesten Ansatz dar - vor allem, was die Textverarbeitung angeht ...
1. Bot-Privacy abschalten
Standardmäßig sieht Euer Bot nur Nachrichten, die per @EuerBot direkt an ihn gerichtet sind. Wenn er alle Nachrichten sehen soll, die in Gruppen gepostet werden, in denen er Mitglied ist, müsst Ihr den BotFather besuchen (mehr dazu in Teil 1) und diese Beschränkung über "/setprivacy" deaktivieren (disable).
2. Neue Nachrichten abrufen
Genau genommen ruft Ihr nicht Nachrichten, sondern in der einfachsten Form schlicht Updates ab - dazu gehören beispielsweise auch neue Einladungen in Gruppen und dergleichen. Die Grundversion:
curl -X POST "https://api.telegram.org/bot123123:ABCABCabcabc_FOO-A/getUpdates"
Damit bekommt Ihr alle Updates in einem eher unschönen Textpaket, wo auch Nutzernamen, IDs und so weiter enthalten sind, sowie die entsprechenden Feldnamen (das ganze ist ein JSON-Objekt). Das muss schöner werden.
3. Text umformen
Im letzten Screenshot seht Ihr, dass der eigentliche Nachrichtentext immer mit "text:" anfängt - ein guter Ansatzpunkt, um das Ergebnis zu filtern und zu formatieren. Eine Simpel-Variante:
curl -X POST "https://api.telegram.org/bot123123:ABCABCabcabc_FOO-A/getUpdates | egrep --color=always -o "text\":.*}"
egrep sucht also nach "text:", dann beliebig viele beliebige Zeichen (.*) und zum Abschluss eine geschweifte Klammer (}); per -o wird nur dieser gefundene Teil, nicht die ganze Zeile ausgegeben und per --color=always wird zur Verdeutlichung noch eingefärbt. An dieser Stelle natürlich der Hinweis: Mit dem Output ließe sich deutlich professioneller umgehen, aber es soll ja schön einfach bleiben.
4. Nachrichten kontinuierlich abrufen
Natürlich wollt Ihr neue Nachrichten sofort sehen, ohne jedesmal einen Befehl absenden zu müssen. Auch hier wieder die einfachst mögliche Variante:
watch -n 1 'curl -X POST "https://api.telegram.org/bot123123:ABCABCabcabc_FOO-A/getUpdates"|egrep --color=always -o "text\":.*}"|cut -c18-| rev | cut -c 9- | rev'
Der ganze Befehl wird einfach per watch-Befehl einmal pro Sekunde ausgeführt - und schon habt Ihr eine Live-Ansicht für eingehende Nachrichten. Nebenbei sind hier noch ein paar Klammern und der text-Kram vor der Nachricht verschwunden, was sich einfach mit den beiden cut-Befehlen machen lässt (das aber nur nebenbei, daher in Kürze: das erste cut schneidet die ersten 18 Zeichen ab; dann wird der Text per rev umgedreht, es werden die ersten neun Zeichen abgetrennt und dann wieder umgedreht.)
Sinnvollerweise könntet Ihr neben der Nachricht auch noch den Absender mit ausgeben lassen und vielleicht noch ein wenig an der Formatierung feilen - aber als einfachstmögliche Quick&Dirty-Lösung sollte das reichen. Außerdem soll es ja nur zeigen, wie Ihr per URL/Kommandozeile an die Nachrichten kommt.
P.S.: Damit Ihr immer nur die letzten zwanzig aktuellsten Nachrichten seht, könnt Ihr hinten noch ein "| tail 20" anhängen. P.P.S.: Nach 100 Updates scheint Telegram keine weiteren mehr anzuzeigen, vielleicht ein Problem mit dem Offset-Wert ... wird bei Zeiten vielleicht noch gelöst.
[UPDATE] Yep, es ist ein Offset-Problem: Standardmäßig bekommt Ihr maximal 100 Updates auf einmal - danach muss Telegram mitgeteilt werden, dass Ihr erst Nachrichten ab Update Nummer 100 haben wollt, dann ab 200, dann ab 300 und so weiter. Mit anderen Worten, Eure URL müsste wie folgt aussehen:
https://api.telegram.org/bot123123:ABCABCabcabc_FOO-A/getUpdates?offset=100"
Bekommt Ihr immer nur die alten Updates angezeigt, tragt als Offset-Wert die letzte update_id ein, die mit ausgegeben wird. Im Fall des Tutonaut-Telegram-Chats ist das die ID "586715624". Für eine Live-Ansicht, wie sie hier im Artikel umrissen wird, müsstet Ihr also für den Produktivbetrieb noch einen Zählmechanismus einbauen. Eine Supersimpel-Quick&Dirty-Variante für die Anzeige der jeweils zehn aktuellsten Updates/Nachrichten als Skript:
#!/bin/sh
u=$( curl -X POST "https://api.telegram.org/bot123123:ABCABCabcabc_FOO-A/getUpdates"|egrep --color=always -o "update_id\":.*,"|egrep -o '[0-9]{8,}'|tail -1 )
u=$(($u-10))
curl -X POST "https://api.telegram.org/bot123123:ABCABCabcabc_FOO-A/getUpdates?offset=$u"|egrep --color=always -o "text\":.*}"|cut -c18-| rev | cut -c 9- | rev | tail -20
Dieses Skript könntet Ihr dann etwa per
watch -n 1 telegram-updates.sh
aufrufen. In aller Kürze: In der Variablen $u wird die letzte update_id gespeichert und um 10 reduziert. Dann wird $u als Offset-Wert in die URL gesetzt. Die Anzeige der maximal 100 Updates startet also ab 10 Updates vor dem letzten Update - wenn Ihr immer 40 Updates sehen wollt, zieht eben 40 ab. Wenn jemand mehr über die $u-egrep-Baustelle wissen will: Einfach in den Kommentar posten, dann kommt mehr Input.
Ach du backe XD muss man programmoerer sien um sowas einzustellen oder wie XD. Hab null plan wie ich Bot auf meine telegruppe einstellen soll. Bzw. wegen unangemessene nachrichten direkt löschen oder die Leute auch verwarnt bevor es zum entfernen kommt oder sowas… also ein Bot der in der Gruppe nach dem rechten schaut werend als Admin oder so mal abwesend bin. Quasi ein schutz bot^^
Hallo lieber Namensvetter,
vielen Dank für diese recht einfache Erklärung. Dem ersten Teil deiner Anleitung konnte ich noch gut folgen. Wenn ich versuche die Nachrichten im Terminal zu lesen kommt allerdings nur ein leerer Output, beim zweiten Befehl erscheint: „dqoute>“ und ich kann wieder etwas eingeben…
Hintergrund: ich würde gerne ein Chat basiertes Telegramm Game schreiben, habe aber nicht richtig viel Peil. Über Expertise würde ich mich freuen. LG
Puh, schwierig ;) Der erste Teil wird viel gelesen und kommentiert – und daher immer wieder mal geupdatet. Teil 2 liest aus mir unerfindlichen Gründen kaum jemand …
Ich musste jetzt ein wenig herumspielen, da ich auch keine Updates mehr zu sehen bekam. Bei mir hat es gereicht, vorab eine Nachricht direkt an den Bot zu adressieren:
Im normalen Telegram-Client eine Nachricht direkt an den Bot gesendet: @meinbot Hallo Welt
Danach Updates angefordert per
Das hat funktioniert – und danach kamen dann wieder alle Nachrichten an.
Das andere Problem, nämlich dass Du wieder etwas eingeben kannst/sollst, liegt vermutlich daran, dass irgendwas mit den Anführungszeichen nicht passt. Es kann gut sein, dass einer der Quelltexte hier im Artikel durch eines der vielen WordPress-Updates kaputt gegangen ist … Also: Einfach den String von https bis getUpdates in einfache Anführungszeichen setzen, dann sollte kein dqoute-Irgendwas erscheinen.
Hey, danke für die schnelle Antwort. Es ist allerdings noch ein bisschen Debugging nötig. Der erste Befehl funkt jetzt richtig, aber ist ja viel Kaudawelsch dabei.
Wenn ich den Befehl aus Punkt 3 mit einfachen Anführungszeichen eingebe also:
curl -X POST ‚https://api.telegram.org/bot123456:ABCDE/getUpdates | egrep –color=always -o „text\“:.*}‘
kommt folgende Meldung: curl: (3) unmatched close brace/bracket in URL position 123. es stimmt etwas nicht mit der } am Ende.
Ich finde deine Anleitung sehr gut und simpel. Leider klappt sie nicht richtig. Gerne möchte ich sie mit dir zusammen verbessern und dabei selbst was lernen. LG
Der Teil mit der geschweiften Klammer ist schon richtig, Du hast aber die falschen Anführungszeichen – das erste nach POST gehört nach oben, wie in
Das ist das Zeichen über SHIFT+# Und jetzt sehe ich, dass auch die egrep-Anführungszeichen falsch sind. Ich tippe auf komische Editor-Einstellungen – oder schreibst Du etwa in sowas wie Word, Writer oder so? Bei Anführungszeichen, Klammern und dergleichen musst Du immer sehr sehr genau gucken.
Hier nochmal sicherheitshalber ein Beispiel für egrep im Bild:
Oh jee, die Fehler mit den Anführungszeichen sind erst beim reinkopieren in die Kommentarzeile auf der Website entstanden. Den Befehl hatte ich ganz normal in die Linux Kommandozeile eingegeben.
Habs jetzt mehrmals mit dem Befehl aus 4 versucht. Mal abgeschrieben mal kopiert. Immer das Gleiche wie beschrieben. Setze ich den Teil nach POST in „…“ kommt dquote setze ich ihn in ‚…‘ kommt bad syntax.
Beim Watch Befehl danach habe ich keine Probleme. Der funktioniert so wie er soll. Hab das Ganze auch als screenshot. Weiß aber nicht wie ich es anhängen soll. LG
Screenshot kannst Du an maschinist@tutonaut.de schicken, dann gucke ich mal.
Also bei mir ist es so, dass ich mit /setprivacy „enable“ keine Nachrichten sehe. Auch keine, welche explizit an @Bot geschickt wurden. Ich sehe nur die Kommandos, welche mit „/“ beginnen. Alle Nachrichten sehe ich, wenn /setprivacy auf „disable“ steht.
Gibt es keinen Weg einzustellen, dass ich nur die Nachrichten sehe, welche explizit an den @Bot geschickt wurden?
Danke Fabian
Hallo zusammen, schöne Tutorials für den Einstieg, welchen Sie mir dadurch sehr erleichtert haben. Bin im Moment dabei mir ein Bot Modul in Python zu programmieren (aktuell noch in der visuellen Ausarbeitung welche Funktionen von der API enthalten sein sollen). Bin auf der Suche nach einer Schritt für Schritt Anleitung für die Einrichtung eines Webhook für den Telegram Bot. Vielleicht habt ihr dazu ja Lust das Tutorial damit zu ergänzen :)