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:

TelegramBotWithPHP.zip

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:

&#10;

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.

Kategorie: Allgemein

Tags: , ,

0 Kommentare

5.914 Aufrufe

Über mich

Ich bin Janis (aka. EurenikZ), 24 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.

6121 Aufrufe
Tags: , ,

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten.

Durchschnittliche Bewertung 5 / 5. Anzahl Bewertungen: 1

Bisher keine Bewertungen. Sei der Erste, der diesen Beitrag bewertet!

Es tut mir Leid, dass der Beitrag für dich nicht hilfreich war!

Wie kann ich diesen Beitrag verbessern?

Keine Kommentare vorhanden

  1. Jens 4. Januar 2022 um 8:40 - Antworten

    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?

    • Avatar-Foto
      Janis 4. Januar 2022 um 9:18 - Antworten

      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.

      • Jens 4. Januar 2022 um 12:22 - Antworten

        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 :)

        • Avatar-Foto
          Janis 4. Januar 2022 um 12:29 - Antworten

          Da sind mir keine bekannt.

          • Martin 2. Februar 2022 um 13:59

            Ích glaube nicht, dass es sinnvoll ist, wenn ein "totaler Laie" Webservices baut. Das Internet ist ohnehin schon voller Mist.

          • Dr. Würth 14. Dezember 2022 um 17:12

            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.

Hinterlasse einen Kommentar

  • Seit einiger Zeit erhalten viele Benutzer von Microsoft / Office 365 beim Anmelden den Fehler "Da hat etwas nicht geklappt. [1001]". Dieser ist zunächst nichtssagend, Microsoft hat jedoch einen Artikel zur Fehlerbehebung veröffentlicht. Da hat etwas nicht geklappt. [1001] Um[...]

    26.02.2024 19:11

    35
  • In den Exif-Daten von Fotos befinden sich einige Informationen, die man mit einem Bildbetrachter nicht zu Gesicht bekommt: Verwendete ISO, Kameramodell und vieles mehr. Auch das Aufnahmedatum wird hier teilweise gespeichert. Mit dem ExifTool kann man das Datum ganz einfach[...]

    31.01.2024 8:47

    36
  • Evernote hat in den letzten Jahren immer mehr Einschränkungen für die Nutzer der kostenlosen Version eingeführt. Ende 2023 wurde die Beschränkung auf insgesamt maximal 50 Notizen bekannt. Wer Nextcloud verwendet, kann seine Notizen auch einfach in der eigenen Cloud selbst[...]

    27.01.2024 19:52

    46
  • Seit einiger Zeit erhalten viele Benutzer von Microsoft / Office 365 beim Anmelden den Fehler "Da hat etwas nicht geklappt. [1001]". Dieser ist zunächst nichtssagend, Microsoft hat jedoch einen Artikel zur Fehlerbehebung veröffentlicht. Da hat etwas nicht geklappt. [1001] Um[...]

    26.02.2024 19:11

    35
  • In den Exif-Daten von Fotos befinden sich einige Informationen, die man mit einem Bildbetrachter nicht zu Gesicht bekommt: Verwendete ISO, Kameramodell und vieles mehr. Auch das Aufnahmedatum wird hier teilweise gespeichert. Mit dem ExifTool kann man das Datum ganz einfach[...]

    31.01.2024 8:47

    36