Telegram Bot ganz einfach mit PHP programmieren

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/bot<BOT_TOKEN>/setwebhook?url=https://example.com/TelegramBot.php

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:

DOWNLOAD

Weitere 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. 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.

&lt;?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')
{
	$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 &lt;b>/befehl&lt;/b> verwendet. Das wäre die Antwort auf diesen Befehl. Ach übrigends, kannst du ganz einfach HTML-Tags verwenden, um beispielsweise den Text &lt;b>fett&lt;/b> oder &lt;i>kursiv&lt;/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: &lt;b>'.$chat_id.'&lt;/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.');
}

?>

War dieser Artikel hilfreich?

1
EurenikZ

EurenikZ

Ich bin Janis, 21 Jahre jung und komme aus Frankfurt am Main. Aktuell mache ich eine Ausbildung zum Fachinformatiker für Systemintegration. Neben meinem vServer beschäftige ich mich viel mit Coden und meinen Webseiten. Zocken ist ebenfalls eine meiner Leidenschaften, mein Lieblings-Genre ist Battle Royale und Survival.

Zuletzt aktualisiert

13.05.2020