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