Der Messenger Telegram stellt eine offene API zur Verfügung. Mit dieser lassen sich eigene Chat-Bots programmieren. Wie man mit PHP anfängt, einen Bot zu programmieren, welcher auf Befehle und Fragen reagiert, zeige ich hier.
INHALTSVERZEICHNIS
- 1.Bot-Profil über den BotFather anlegen
- 2.Webhook erstellen
- 3.Anfangen zu programmieren
- 4.Bot verwenden
Bot-Profil über den BotFather anlegen
Zunächst musst du über den Messenger den BotFather (@BotFather) kontaktieren. Dies ist der offizielle Bot von Telegram, mit welchem man eigene Bots erstellen und verwalten kann.
Verwende den Befehl /newbot und befolge die Schritte. Zunächst wird der dargestellte Name vom Bot abgefragt, danach folgt der Benutzername. Dieser ist bei Telegram eindeutig und muss mit Bot enden. Dieser Name wird auch für die Erwähnung verwendet.
Anschließend erhältst du den Bot-Token. Dieser wird unter anderem für den nächsten Schritt wichtig.
Webhook erstellen
Der nächste Schritt ist das Einrichten des Webhooks, der mit dem Bot kommuniziert. Der Bot muss ja nämlich wissen, zu welcher Schnittstelle er die Anfragen stellen soll. Erstelle also zunächst eine .php-Datei auf deinem Webserver. Öffne dann folgende URL in deinem Browser, passe vorher aber den Bot-Token sowie den Pfad zu deiner PHP-Datei an:
https://api.telegram.org/botBOT_TOKEN/setwebhook?url=https://example.com/TelegramBot.php
Das Script auf deiner Website muss per HTTPS erreichbar sein, es muss also ein gültiges SSL-Zertifikat vorhanden sein.
Anfangen zu programmieren
Nachdem du den Webhook gesetzt hast, kann es an das Programmieren gehen. Für das Senden einfacher Nachrichten ist folgende Funktion notwendig. Der folgende Code muss für mein folgendes Beispiel-Script als sendMessage.php gespeichert werden.
<?php function sendMessage($bot_id,$chat_id,$disable_notification,$message_text) { $ch = curl_init('https://api.telegram.org/bot'.$bot_id.'/sendMessage'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $param = array( 'chat_id' => $chat_id, 'parse_mode' => 'html', 'disable_notification' => $disable_notification, 'text' => $message_text ); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); $result = curl_exec($ch); curl_close($ch); return $result; } ?>
Weitere Funktionen (Senden von Audios, Dokumenten, Orten, Fotos und Videos) kannst du hier herunterladen und dementsprechend einbinden:
Mehr Methoden und detaillierte Informationen kann man der Dokumentation entnehmen: core.telegram.org/bots/api
Im Folgenden habe ich einen Beispiel-Code, welcher 1 zu 1 übernommen werden kann. Lediglich der Bot-Token in Zeile 2 muss eingetragen werden. Und werden noch andere Funktionen verwendet, müssen diese noch eingebunden werden, wie in Zeile 3 bereits sendMessage.
Die Chat-ID des Absenders wird in der Variable $chat_id gespeichert, an diese geht dann auch die Antwort vom Bot. Die Chat-ID einer Gruppe ist übrigens immer negativ, beginnt also mit einem Bindestrich. Soll der Bot an einen Kanal senden, ist das Herausfinden der Chat-ID etwas schwieriger. Hierfür musst du beispielsweise eine Nachricht aus dem Kanal an den Bot @getidsbot weiterleiten. Als Antwort erhältst du Informationen zu dieser Nachricht, unter anderem steht hier dann auch die die ID des Kanals. Diese ist ebenfalls negativ.
In der Variable $message befindet sich die Nachricht des Absenders.
Eine kurze Erklärung der Funktionen, hier am Beispiel von sendMessage:
sendMessage($bot_id,$chat_id,false,'Hi '.$first_name.'! Wie kann ich dir helfen?');
Der erste Wert ist der Bot-Token. Danach kommt die User-ID, an wen diese Nachricht gesendet werden soll. Darauf folgt der Boolean für disable_notification, also ob die Nachricht ohne Ton verschickt werden soll (true) oder ganz normal (false). Anschließend kommt die Textnachricht selbst.
Ich habe ein paar if-Abfragen mit Aktionen eingebaut für Befehle und Trigger von einem oder mehrere Wörter, worauf der Bot mit einer einfachen Textnachricht antwortet.
Da ich das Parameter parse_mode=html verwende, kann auch HTML für die Antwort verwendet werden um beispielsweise den Text zu formatieren. Für einen Zeilenumbruch muss jedoch diese Zeichenfolge verwendet werden:
Passt die an den Bot gesendete Nachricht zu keiner der Abfragen, erhält der Benutzer eine Standard-Antwort zurück.
<?php $bot_id = 'BOT_TOKEN_HIER'; include('sendMessage.php'); $json_out = json_decode(file_get_contents('php://input'), true); $chat_id = $json_out['message']['chat']['id']; $first_name = trim(str_replace('?', '', preg_replace('/[^A-Za-z0-9 ]/', '', $json_out['message']['chat']['first_name']))); $type = $json_out['message']['chat']['type']; $message = $json_out['message']['text']; $message_id = $json_out['message']['message_id']; if(stripos($message, '/start') === 0 && ($type == 'private' || $type == 'group' || $type == 'supergroup' || $type == 'channel')) { $sent = true; sendMessage($bot_id,$chat_id,false,'Hi '.$first_name.'! Wie kann ich dir helfen?'); } if(stripos($message, '/befehl') === 0 && !isset($sent)) { $sent = true; sendMessage($bot_id,$chat_id,false,'Du hast <b>/befehl</b> verwendet. Das wäre die Antwort auf diesen Befehl. Ach übrigens, kannst du ganz einfach HTML-Tags verwenden, um beispielsweise den Text <b>fett</b> oder <i>kursiv</i> zu schreiben.'); } if(stripos($message, '/würfel') === 0 || stripos($message, '/wuerfel') === 0 && !isset($sent)) { $sent = true; file_get_contents('https://api.telegram.org/bot'.$bot_id.'/senddice?chat_id='.$chat_id); } if(strpos(strtolower($message), 'whatsapp') !== false && !isset($sent)) { $sent = true; sendMessage($bot_id,$chat_id,false,'Habe ich da etwa WhatsApp gehört? Telegram > WhatsApp.'); } if(strpos(strtolower($message), 'chatid') !== false && !isset($sent)) { $sent = true; sendMessage($bot_id,$chat_id,false,'Deine Chat-ID lautet: <b>'.$chat_id.'</b>'); } $array = array('eins','zwei','drei'); if(in_array(strtolower($message), $array) AND !isset($sent)) { $sent = true; sendMessage($bot_id,$chat_id,false,'Wenn eines dieser Wörter in der Nachricht an den Bot vorkommt, erscheint diese Antwort.'); } if(!isset($sent) && $type == 'private') { sendMessage($bot_id,$chat_id,false,'Sorry, aber das habe ich nicht ganz verstanden.'); } ?>
Bot verwenden
Wenn die .PHP-Datei gespeichert und hochgeladen wurde, kannst du den Bot jetzt über Telegram anschreiben. Er wird dir mit der entsprechenden Antwort antworten.
Bei programmiertechnischen Hilfen kannst du mich gerne kontaktieren: JanisMades.IT
Bei Fragen oder Anregungen freue ich mich natürlich über eure Kommentare.