Telegram Messenger und die Bot API - Teil 2

telegram messenger

Im ersten Teil - Telegram Messenger und die Bot API - bin ich auf einige Grundlagen eingegangen wie man einen Telegram-Bot einrichtet und diesen nutzt um sich Nachrichten, Informationen und sonstiges bequem auf sein Handy Handy zu schicken.

Da sich dieses Werkzeug als äußerst praktisch erwiesen hat, habe ich mich dazu entschlossen den vorherigen Beitrag nochmal aufzugreifen und etwas aufzubohren sprich zu erweitern.

Inhaltsverzeichnis:

Telegram Messenger und die Bot API

christ schmuck.jpgEs geht darum nicht mehr bloß irgendwelche Informationen zu einem vordefinierten Zeitpunkt zu erhalten, sondern vereinfacht gesagt in mehr oder weniger direktem Kontakt mit seinem Backend zu treten. Hier ein Beispiel wie man seinem Messenger-Bot beibringt auf eure Nachrichten zu reagieren.

Um das Ganze relativ kurz und knackig zu halten werde ich hier nur die Einrichtung des Webhooks und das Verarbeiten eines Kommandos mit einem einfachen PHP-Script erklären. Bei allem weiteren was Programmierung angeht sind der eigenen Kreativität keine Grenzen mehr gesetzt. Weiter unten gehe ich dann noch darauf ein wie man Fotos, Bilder und Screenshots per Telegram-API verschickt.

Telegram Bot API - SetWebhook

Wie in Teil 1 schon erwähnt gibt es in der Dokumentation der Telegram Bot-API die Funktion setWebhook. Diese nutzt man um dem eigenen Telegram-Bot zunächst mitzuteilen wohin in Zukunft empfangene Nachrichten gesendet werden sollen. Hier übermittelt man einmalig u.a. eine URL zum Script auf eurem Server, welches die Nachrichten verarbeiten soll.

Der einmalige Aufruf (z.B. über den eigenen Browser) zur Einrichtung sieht dann wie folgt aus, wobei <HIER BOT-TOKEN> durch euren eigenen Auth-Token zu ersetzen ist. Gleiches gilt für den Parameter URL.

https://api.telegram.org/<HIER BOT-TOKEN>/setWebhook?url=https://www.meineseite.de/msg_receive_89572953227abdkjln438902.php&max_connections=5&allowed_updates=["message"]

Möchte man nicht nur Messages empfangen sondern auch jede andere Benachrichtigung (siehe Telegram Dokumentation) so lässt man den allowed_updates-Parameter einfach weg oder erweitert diesen um die jeweiligen Events.

Aus Sicherheitsgründen empfiehlt es sich das Script für die Verarbeitung in einen Unterordner zu packen, der einen "exotischen" Namen trägt, den man nicht erraten kann, oder gleich das Script so zu nennen. In meinem Beispiel heißt das PHP-Script:
msg_receive_8957295322$!p7abdkjln438902.php

Jetzt wo die Einrichtung des Webhooks klar ist, legen wir das besagte Script auf unserem Server an. Da Telegram die Status-Meldung per JSON-Object (JSON-serialized) an den Server schickt, müssen wir diese zunächst eingegen nehmen. Danach wandeln wir das JSON-Object in ein Array um.

$request = file_get_contents('php://input');
$request = json_decode($request, true);

if(!$request || !isset($request['message'])){
     //request ungültig
}else{
     //soweit sogut! hier nachricht auswerten
     //Hier Nachricht auswerten und dem User antworten.
}

Um sich einen Überblick zu verschaffen welche Informationen im Array liegen kann man dieses z.B. per $output = print_r($request, true); zurückgeben lassen und $output in eine Datei oder Datenbank auf dem Server schreiben.

In diesem Beispiel sind aber nur 3 Informationen interessant. Die Absender-ID, Benutzername und der Inhalt der Nachricht. Diese speichern wir in jeweils einer Variablen zwischen, für bessere Übersichtlichkeit:

$absender_id = $request['message']['chat']['id'];
$benutzername = $request['message']['chat']['username'];
$nachricht = strtolower(trim($request['message']['text']));

Im nächsten und letzten Schritt wird der Switch durchlaufen und wenn das Kommando bzw. die Nachricht bekannt ist (z.B. "Hello World") dann wird eine passende Antwort generiert und dem Benutzer per Telegram geschickt. Schickt man dem Bot also über Telegram "Hello World", antwortet dieser mit "hello <username>! how are u? ;)". Der Code dazu sieht dann so aus:

$answer = "";
switch ($msg)
{
     case "hello world":
          $answer = "hello ".$username."! how are u? ;)"; break;
}

if (strlen($answer)>0)
{
     //Antwort an User schicken; siehe Part 1
     $request = TELEGRAM_URL;

     $request = str_replace("<ID>", $chat_id, $request);
     $request = str_replace("<TEXT>", urlencode($answer), $request);

     $response = @file_get_contents($request);
     $positive_answer = "{\"ok\":true";
     $telegram_sent = (substr($response, 0, strlen($positive_answer)) == $positive_answer);
}

Die Switch-Anweisung kann nun um beliebige cases und Funktionen erweitert werden.

Fotos verschicken per Telegram Bot API

amz music.pngDie Bot-API von Telegram bringt gleich mehrere Möglichkeiten mit sich Fotos, Bilder oder Screenshots zu versenden.

Aktuell gibt es 3 Optionen:
1.) Bilder per file_id verschicken, welche bereits bei Telegram hochgeladen wurden.
2.) Bilder per URL versenden, welche auf einem Server im Web liegen.
3.) Bilder oder Foto direkt bei Telegram hochladen

Ich werde hier nur die 3te Option vorstellen, da diese wohl am häufigsten Verwendung findet.

Generell erfolgt das versenden von Fotos über Telegram per sendPhoto-Request (siehe Bot-API Dokumentation). Die URL an welche man diesen Request sendet sieht dann wie folgt aus, wobei BOT_API_KEY und EMPFAENGER_ID natürlich durch die entsprechenden Werte ersetzt werden müssen.

https://api.telegram.org/BOT_API_KEY/sendPhoto?chat_id=EMPFAENGER_ID

Als Beispiel übergebe ich per POST ein Bild als String base64-encoded, welches dann zurück ins Ursprungsbild gerechnet, temporär abgespeichert und versendet (multipart/form-data) wird. $tele_id beinhaltet die ID des Empfängers und TELEGRAM_URL_PHOTO ist eure Request-URL (siehe oben /sendPhoto). Zum versenden wird curl verwendet.

Der PHP-Code dazu sieht dann wie folgt aus:

$imageBase64 = (isset($_POST['image'])) ? $_POST['image'] : "";

if (strlen($imageBase64)>0 && strlen($tele_id)>0)
{
$request = str_replace("<ID>", $tele_id, TELEGRAM_URL_PHOTO);

$filename = "tmp/screen.jpg";
$img = base64_decode($imageBase64);
$im = imagecreatefromstring($img);
imagejpeg($im, $filename);
imagedestroy($im);

$post_fields = array('chat_id' => $tele_id,
'photo' => new CURLFile(realpath($filename))
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:multipart/form-data"));
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$response = curl_exec($ch);

$positive_answer = "{\"ok\":true";
if (substr($response, 0, strlen($positive_answer)) == $positive_answer)
echo "1";
else
echo "0";

return;
}

Der Code an sich ist sicherlich nicht perfekt. Man sollte den JSON Telegram-Response natürlich parsen und so den Rückgabewert (Status) auswerten anstatt des hardcoded strings, aber ich hoffe die Funktionsweise ist leicht verständlich und es hilft als kleinen Einstieg in die Materie. Viel Spaß beim proggen!

Author: Sascha von Saschas-Bastelstube.de

Autor: sascha

Ein paar Worte über mich selbst. Mein Name ist Sascha, wie der Titel dieses Blogs erahnen lässt. :-) Ich bin von Beruf selbstständiger Programmierer und Trader. Neben Programmierung, Trading und Kampfsport sind einige meiner Interessen und Hobbys das Kochen, Fitness und das Hören lauter Heavy-Metal Musik. :D

Dies könnte dich auch interessieren

ESP8266-WiFi-Modul flashen

Da ich mich seit kurzem wieder intensiver mit den Themen Smart Home und "Home automation" beschäftige habe ich beschlossen einige meiner Baustellen, Stolpersteine und Lösungen hier zu veröffentlichen. Wie im Beitrag zu meinem Smart-Home-Project V1 bereits erwähnt setze ich auf das WLAN-Modul ESP8266-ESP01 , da dieses unter anderem klein, zuverlässig und günstig ist. In diesem … „ESP8266-WiFi-Modul flashen“ weiterlesen


Trainingsgerät: Makiwara 2.0

Ein Makiwara ist ein aus Japan stammendes Sportgerät, welches man im Karate vor allem als Schlagpfosten aus Holz kennt. Früher (und zum Teil heute noch) fertigt man einen Makiwara aus einem biegsamen und nicht-splitternden Holzbrett. Das eine Ende des Brettes wird senkrecht in den Boden getrieben, und das andere Ende im oberen Bereich (ca. 10-20cm) … „Trainingsgerät: Makiwara 2.0“ weiterlesen


Trading-Journal: Krypto Trading Bot für Kraken

Jeder halbwegs professionelle Trader sollte natürlich ein Trading-Journal führen um seine Trades zu erfassen und später auswerten zu können. Manche gute Trading-Software bietet natürlich bereits integrierte Lösungen an, was mich natürlich trotzdem nicht davon abgehalten hat für unser Projekt Smart-Trading-Systems.de eine eigene Software zu programmieren und diese an unser Trading-System anzubinden. Neben der Erfassung und … „Trading-Journal: Krypto Trading Bot für Kraken“ weiterlesen


Apfel-Appstore-Reader - Update 2.0

Wie im Artikel - Apfel-Appstore-Reader - beschrieben, hält sich Apple bezüglich der App-Rankings (Positionierung im Appstore) sehr gedeckt. Auch im Report-Tool (ITC / iTunes-Connect -> Sales & Trends) keinerlei Informationen auftauchen, an welcher Position man sich mit der jeweiligen App in z.B. einer Kategorie wie “Produktivität” befindet, habe ich vor längerer Zeit ein kleines Java-Tool … „Apfel-Appstore-Reader - Update 2.0“ weiterlesen


Programmieren: PHP image captcha code

Hier möchte ich meine kleine aber feine capture code Lösung vorstellen, welche ich vor einiger Zeit mal programmiert habe. Ich war es leid, auch in Hinblick auf die DSGVO, Capture-Lösungen externer Anbieter einzubinden. Darüber hinaus werden durch diverse Privacy-Browser z.B. auch Javascripts geblockt, sodass ein externes Image-Capture-Modul für etwa das eigene Kontakt- oder Anmeldeformular nicht … „Programmieren: PHP image captcha code“ weiterlesen