Bot-Talk (Teil I): Einen neuen Telegram-Bot anlegen

Ein Telegram Bot ist relativ schnell und nach einem festen Muster erstellt. Bei den Möglichkeiten der Antwortgebung eröffnen sich jedoch viele Möglichkeiten.

TL;DR

  • die Erstellung eines Bots ist straight-forward
  • ein Bot kann auf unterschiedliche Arten reagieren
  • Möglichkeiten sind:
    • einfache Textantworten
    • Zitierungen
    • Inline-Antworten
    • uvm.

Generelle Hilfen zum Start

Generell bietet die API Dokumentation von Telegram genau die Hilfe, die man fürs Programmieren benötigt.

Zum Verständnis: Für meinen Code verwende ich PHP. Im Folgenden verwende ich die Begriffe „Bot“ und „Bot-Programm“ bzw. „PHP-Bot“ synonym, denn ein Bot ist letzten Endes nichts anderes, als ein reguläres PHP-Programm.

Kommunikationsschema eines Bots

Sehr gut erläutert das Kommunikationsschema eine Grafik, die ich bei Tutsplus gesehen habe.

https://cms-assets.tutsplus.com/uploads/users/1203/posts/26329/image/Untitled%20Diagram.png

Der linke Teil verläuft wie bei jedem regulären Chat auch: Das Endgerät sendet eine Nachricht an einen Telegram-Server, der diese dann an die entsprechenden Endgeräte der Empfänger weiterleitet.

Neu ist der rechte Teil: Hier kann entweder ein Bot per Long polling-Prinzip oder per Webhook-Prinzip auf Nachrichten reagieren. Im ersten Fall wird quasi in einer Dauerschleife eine regelmäßige Anfrage seitens des Bots (z.B. alle 5 Sekunden) nach Änderungen im Chat durchgeführt. Gibt es neue Nachrichten, kann der Bot diese entsprechend verarbeiten.

Ich persönlich finde den zweiten Fall per „Webhook“ für meine Zwecke interessanter, da der Bot solange untätig sein kann, bis ihm tatsächlich eine Nachricht gesendet wird. Der Telegram-Server leitet in diesem Fall jede Nachricht an den Bot an diesen weiter, ohne das der Bot nach Änderungen im Chat fragen müsste. Entsprechend basieren die nachfolgenden Ausführungen auf dem Webhook-Prinzip.

Einen neuen Bot kreieren

Dazu wendest du dich einfach an den Telegram-Kontakt @BotFather. Sein Frage- und Antwortspiel führt dich spielend leicht durch die Erstellung und Einrichtung des Bots seitens Telegram. Für die Umsetzung nach dem Webhook-Prinzip benötigst du den API-Token, den du im Verlauf der Einrichtung vom @BotFather erhältst.

Beachte: Deine Webhook-URL muss eine HTTPS-Adresse sein!

Mit diesem API-Token kannst du schließlich deinen Webhook bei Telegram mittels setWebhook-Methode anmelden. Z.B. indem du https://www.example.com/<token>/setWebhook?url=<webhook-url>

Und nun kann es auch schon los gehen. Füge deinen Bot als Kontakt hinzu und sende ihm eine Nachricht. Wenn du per error_log(file_get_contents("php://input")) dein Server-Log verfolgst, kannst du sehen, welche Informationen in welcher Art „einfliegen“. Das ist für das Nachvollziehen der nachfolgenden Schritte sehr bedeutsam.

Falls hier doch keine Nachrichten ankommen, kannst du einmal die Antwort beim Abruf von https://www.example.com/<token>/getWebhookInformation ansehen.

Im nächsten Teil geht es an die Anwendung dessen, was in der Bot-API beschrieben wird.

Links zum Start

‚Lorem ipsum‘ == 0

Das ist eigentlich ein alter Hut, dennoch ist das Problem zuletzt bei meiner Programmierarbeit aufgeschlagen.

TL;DR

  • PHP parsed Strings recht „naiv“ auf Integers
  • z.b. ist ein Text, der nicht mit einer Ziffer > 0 beginnt stets gleich 0
  • im Programmierkontext kann das irreführend sein

Strings sind keine Integers, oder doch?

Ich wollte prüfen, ob in einer Variable der String ‚xxx‘ steht. Tatsächlich war die Variable mit dem Integer 0 initialisiert, was zu irreführendem Verhalten führte.

/*$var ist bereits irgendwie initialisiert, ansonsten wird $var auf 0 gesetzt*/
$var = $var ?? 0;

if ($var == 'xxx') {
    echo 'Der Variablenwert ist ein String';
} else {
    echo 'Der Variablenwert ist ein Integer';
}

Der obenstehende Code wird, sofern $var nicht zuvor initialisiert wurde, immer ‚Der Variablenwert ist ein String‘ ausgeben. Dies liegt am automatischen String parsing von PHP, welches versucht, einen String auf Biegen und Brechen in einen Integer zu wandeln, falls notwendig. Da ‚xxx‘ mit keinerlei Ziffer beginnt ist dieser String stets gleich 0. Anders verhält es sich mit ‚1xxx‘, welcher bei einer Berechnung wie eine 1 gehandhabt wird. Sehr gut wird dieses Verhalten in diesem Beitrag erläutert.

Vorgebeugt kann dieses vermeintliche Fehlverhalten mit einer Prüfung auf Identität bzw. dem Tripple-Equals-Operator (===). Bedenke: wie oben Beschrieben ist 0 == ‚xxx‘!

echo (0 == 'xxx'); // output - true, da auch 0 == '0' true ist
echo (0 === 'xxx'); // output - false, da auch 0 === '0' false ist

Wo sind die reflektierten Innovatoren?

Ja wo sind diejenigen, die langfristig und nachhaltig denken und zugleich innovativ sind? Diejenigen, die uns die Zukunft weisen und uns zugleich als diejenigen wahrnehmen, die wir sind? Wie weit weg ist eigentlich das Silicon-Valley und wie sehr liegt heute in der Vergangenheit?

TL;DR

  • Innovation fußt auf Mut und Ruhelosigkeit
  • Reflektiertheit bzw. Reife fußt demgegenüber auf Überlegtkeit
  • Innovation bedarf es an Reflexion, um verständlich und nachhaltig zu sein
  • Wie geht das zusammen?

Innovation auf Biegen und Brechen?

Immer wieder hören wir von Morgen und davon, welche neuen Entdeckungen uns das Leben leichter machen werden. Doch welcher Innovationstreiber wägt zwischen vereinfachen und verkomplizieren ab? Freilich hat der Computer mittlerweile Einzug in unser aller Privatleben gehalten (zumindest gehe ich bei Ihnen davon aus, da Sie diesen Beitrag lesen). Doch was tun mit den Nutzern, die im hohen Alter keinen Zugang zum überdimensionierten Abakus erhalten haben oder denen, die auch in jungen Jahren nicht verstehen, wie das Ding funktioniert oder warum es mal nicht das tut, was es soll?

Wer trägt die Verantwortung, wenn etwas nicht so funktioniert, wie gedacht?

Oft höre ich in diesem Zusammenhang: „ich verstehe das nicht, ich bin zu dumm dazu“. Doch wer hat sich hier eigentlich Vorwürfe zu machen? Natürlich darf der Entwickler von Hardware oder Software dem Nutzer ein gewisses Maß an Intelligenz voraussetzen. Wenn Fehlermeldungen und Fehlverhalten jedoch eingehendes Verständnis der Funktion des Geräts erfordern, so ist meiner Meinung nach, der Erfinder nicht aus der Verantwortung zu ziehen.

Welcher nicht-Informatiker kann mir die folgenden Fragen beantworten?

  • Warum erhält der Empfänger meine E-Mails plötzlich mehrfach? Ich habe nur meinen Computer neu installiert.
  • Wozu benötige ich heute diese neue Internetbox, ohne die ich bei der Telekom gekündigt werde? Und warum macht die Telekom so viel Druck?
  • Warum ploppt immer eine Fehlermeldung auf bzw. warum stürzt mein Entpackprogamm ab, wenn ich aus dem Dateianhang einer E-Mail direkt diese eine RAR-Datei öffnen will? Das E-Mail-Programm zeigt dazu irgenwas von 15MB an.
  • Warum bekomme ich Spam-Mails?
  • Wie lege ich auf meinem Smartphone einen Ordner in der Galerie an?
  • Was ist der Unterschied zwischen den Programmen von meinem alten Windows-PC und diesen jetzt überall auftauchenden „Apps“?
  • Warum passiert nichts, wenn ich auf „Drucken“ klicke?
  • usw …

Fehlt es dem Nutzer an Vorstellungskraft?

Ich denke, diese Liste lässt sich unendlich fortsetzen. Alle Fragen haben eins gemeinsam: Diese oder ähnliche Fälle kennt (und das behaupte ich jetzt einfach mal) jeder Computer- bzw. Smartphonenutzer. Die Fragen selbst haben nichts mit wissenschaftlicher Informatik zu tun. Man sollte im klassischen Sinn meinen, dass jeder das Werkzeug kennt, dass er verwendet. Nur ist ein Computer eben kein Schraubenzieher mit einer klar erkennbaren Form und direkt abzuleitenden Funktion.

Stelle dir dazu einen Aufbau vor, in dem ein Computer (natürlich über ein Kabel und eine entsprechende Elektronik inklusive Motor) an eine Mechanik angebunden ist, die eine Halterung dreht, in der ein Schraubenzieher befestigt ist. Im Wesentlichen ergeben sich also drei wesentliche am Aufbau beteiligte Komponenten: Die Mechanik, die Elektronik und der Computer.

Der Computer kann die Mechanik ansteuern, den Schraubenzieher zu drehen. Dieser wird sich willenlos drehen und nichts anderes tun, sofern dies nicht auf physikalische Weise manipuliert wird oder die Mechanik bzw. Elektronik Defekte aufweist. Andersherum kann ein Computerprogramm die Drehung der Mechanik über die angeschlossene Elektronik abgreifen und auswerten. Die Elektronik kann durch Stromschwankungen oder andere elektrische Fehler oder andere physische Einflüsse oder Manipulationen anders, als erdacht, reagieren. Doch wer kann bei Anwesenheit eines „Aufpassers“ für den Computer ein fehlerfreies verhalten garantieren? Zu diesem kommen neben den physischen Einflüssen programmiertechnische hinzu, denn nicht alle Einbrüche in bzw. Manipulationen an der Software werden erkannt. Damit ergibt sich eine Art Treppe der Komplexität ausgehend von der Mechanik über die Elektronik hin zum Computer.

Um diesen Beitrag nicht unnötig zu verkomplizieren, mache ich hier einen Schnitt bei der Auswertung des Versuchsaufbaus. Ich möchte an dieser Stelle nicht behaupten, dass dieser vollständig ist, es handelt sich schließlich nur um ein Modell und jedes Modell hat Lücken. Im Wesentlichen möchte ich dennoch zum Ausdruck bringen, dass der Computer eine Komplexität inne hat, die von einem einfachen Anwender und auch nicht von einem einzelnen Experten durchdrungen werden kann.

Wer entwickelt verständliche und nachhaltige Innovationen?

Das Paradoxon wird komplett, wenn man populäre Innovationen betrachtet. Der Computer selbst erscheint dabei als Inbegriff der Innovation. Welches Ding hat noch morgen eine Chance auf dem Markt, wenn es keinen Stromstecker und keine Platine besitzt, auf der Bits und Bytes umhergeschubst werden. Wo sind die reflektierten Innovatoren, die das Produkt von morgen entwickeln, welches der Mensch versteht?*

* … und nicht eines, das versucht den Menschen zu verstehen