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.
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.
Über mich
Ich bin Janis (aka. EurenikZ), 25 Jahre alt und komme aus der Nähe von Frankfurt am Main. Ich habe eine abgeschlossene IHK-Ausbildung zum Fachinformatiker für Systemintegration und arbeite als Junior IT-Administrator in einem IT-Systemhaus. Neben meinem IT-Blog beschäftige ich mich viel mit diversen IT-Themen und meinen Webseiten sowie Telegram Bots und biete IT-Dienstleistungen an.
Grundsätzlich sehr guter Beitrag, vielen Dank dafür.
Was mir noch fehlt (ich bin ein totaler Laie) ist, wie nutze ich den Bot?
Ich habe die beiden Dateien nach Anleitung erstellt und auch die Token ID eingetragen. Jetzt habe ich zwei PHP Dateien auf dem Web Server hochgeladen – doch wenn ich die PHP Datei, die den Chatbot "nutzt" aufrufe, bekomme ich nur einen leeren Bildschirm. Was fehlt da noch oder was mache ich falsch?
Hallo Jens,
jetzt musst du einfach den Bot über Telegram anschreiben. Die PHP-Dateien musst du im Browser nie aufrufen, das übernimmt ja quasi dein Bot.
Oh Mann – wie immer kommt der Fehler daher, dass man nicht richtig gelesen hat ;)
Alles klar, jetzt habe ich es verstanden. Das heißt, jetzt liegt es an mir, mittels PHP Kommandos den Bot entsprechend zu programmieren (so wie du es mit dem Würfel z. B. gemacht hast).
Gibt es da ein gutes Repository an Code-Beispielen die leicht verständlich sind? Ist dir zufällig etwas "untergekommen"?
Danke dir auf jeden Fall für deine erhellende Antwort :)
Da sind mir keine bekannt.
Ích glaube nicht, dass es sinnvoll ist, wenn ein "totaler Laie" Webservices baut. Das Internet ist ohnehin schon voller Mist.
Nun ja, jeder Mensch ist als Laie gestartet – und wer sich mit einem Thema nicht näher auseinandersetzt und nicht ausprobiert, der wird auch ewig ein Laie bleiben. Ihm sein Interesse abzusprechen ist daher äußerst fragwürdig und hat auch zur gestellten Frage rein gar nichts beigetragen.