Startseite>Per Telegram mit dem RasPi chatten
Aus Raspberry Pi Geek 12/2017

Per Telegram mit dem RasPi chatten

© 29mokara, 123RF

Aufgeweckt

Bernhard Bablok

Dank der Chat-Plattform Telegram und einem eigenen Chatbot kommunizieren Sie mit dem Mini-PC selbst durch eine Firewall hindurch.

Bots kommen inzwischen vielerorts zum Einsatz: Die Bandbreite reicht von der Manipulation in sozialen Netzwerken während des Wahlkampfs bis hin zu Support-Plattformen. Für einfache Fragen ist diese Form des Supports allemal besser als stundenlanges Warten am Telefon. Neben der geringen Hürde für Anwender hat ein Chatbot für einen RasPi noch einen weiteren Vorteil: Die Kontaktaufnahme von außen zum Kleinrechner klappt selbst ohne offene Ports auf dem heimischen Router – in Zeiten ständiger Angriffe ein nicht zu unterschätzender Vorteil.

Als Basis für unsere Lösung dient die Chat-Plattform Telegram [1]. Sie bietet in etwa dieselben Funktionen wie der Platzhirsch Whatsapp, kommt aber anders als dieser nicht aus einem Konzern. Zwar liegt die Server-Komponente nicht offen, wohl aber das Client-API. Deshalb gibt es für Telegram neben dem offiziellen Client auch viele verschiedene Implementationen. Das ist besonders für Linux interessant.

Der Zugriff auf Telegram erfolgt Content-verschlüsselt per HTTPS, auf Wunsch Ende-zu-Ende. Für das API gibt es Bibliotheken in vielen Programmiersprachen; für unseren Bot kommt die Python-Implementation Telepot [2] zum Einsatz. Eine Webseite des Diensts führt in die Bot-Thematik ein [3].

Mein erster Bot

Besitzen Sie noch keinen Telegram-Account, so laden Sie sich einen Client herunter, der Sie dann durch den Anmeldeprozess führt. Anders als bei Whatsapp dürfen Sie Ihre ID auf diversen mobilen und stationären Geräten verwenden. Verzichten Sie auf Ende-zu-Ende-Verschlüsselung, finden Sie auf allen Geräten den aktuellen Stand der Chats.

Ihren Bot erhalten Sie bezeichnenderweise per Chat mit einem speziellen Bot, den Telegram bereitstellt und betreibt. Dieser Vater aller Bots heißt BotFather und fragt im Dialog (Abbildung 1) diverse Attribute für Nachkommen ab (Abbildung 2), unter anderem einen eindeutigen Namen.

Abbildung 1: Der Telegram-Bot BotFather dient dazu, neue Bots im Chat-Dienst anzulegen.

Abbildung 1: Der Telegram-Bot BotFather dient dazu, neue Bots im Chat-Dienst anzulegen.

Abbildung 2: Beim Erstellen eines Bots fragt der Vater aller Bots diverse Parameter ab, in erster Linie natürlich den Namen.

Abbildung 2: Beim Erstellen eines Bots fragt der Vater aller Bots diverse Parameter ab, in erster Linie natürlich den Namen.

Hat alles geklappt, liefert BotFather ein Token für das HTTP-API. Diese Zeichenkette dient als Identifikation gegenüber dem Dienst und darf deshalb nicht in falsche Hände gelangen. Bis auf den Namen des Bots dürfen Sie alle Attribute nachträglich ändern. Dazu starten Sie wieder einen Chat mit BotFather. Bei Fehleingaben gibt dieser entsprechende Hilfestellungen.

Installation

Für die Installation von Telepot benötigen Sie zuerst das Paket python-pip (oder python-pip3 für Python 3), das Sie aus dem Raspbian-Repository über Apt-get installieren. Telepot integrieren Sie dann mit dem folgenden Befehl ins System:

$ sudo pip install telepot

Ein erstes Testprogramm (Listing 1) startet dann den Bot in einem Terminal; Sie beenden ihn mit [Strg]+[C]. In der Zeile 8 ersetzen Sie Token durch die Zeichenkette, die Sie vom BotFather erhalten haben.

Listing 1

 

# simplebot.py
#!/usr/bin/python
import signal
from pprint import pprint
import telepot
from telepot.loop import MessageLoop
# --- Initialisierung
bot = telepot.Bot('Token')
pprint(bot.getMe())
# --- Eingehende Meldungen verarbeiten
def handle_text(msg):
  pprint(msg)
  content_type, chat_type, chat_id = telepot.glance(msg)
  if content_type == 'text':
    bot.sendMessage(chat_id, "ich verstehe '%s' noch nicht!" % msg['text'])
# --- Message-Loop als Thread
MessageLoop(bot, handle_text).run_as_thread()
# --- Nichts tun, ohne die CPU zu belasten
signal.pause()

Der Befehl bot.getMe() aus Zeile 9 gibt Informationen zum Bot aus (Abbildung 3, erste drei Zeilen). Die Zeile 17 startet eine Message-Schleife in einem eigenen Thread. Dem Objekt MessageLoop übergibt das Programm den in Zeile 8 initialisierten Bot sowie eine Funktion (handle_text()), die dieser für jede eingehende Nachricht aufruft.

Abbildung 3: Der neu erstellte Bot weiß zwar schon, wer er ist, vermag aber mit eingehenden Nachrichten noch recht wenig anzufangen.

Abbildung 3: Der neu erstellte Bot weiß zwar schon, wer er ist, vermag aber mit eingehenden Nachrichten noch recht wenig anzufangen.

Diese Funktion ist in den Zeilen 11 bis 15 definiert – der Bot meldet lediglich, dass er den eingegangenen Text noch nicht versteht (Zeile 15). Die eingehenden Nachrichten landen mit pprint(msg) aus Zeile 12 samt der gesamten Message-Struktur schön formatiert auf der Konsole (Abbildung 3 unten).

Die Nachricht steckt in einem geschachtelten Dictionary, auf das Sie mit den üblichen Python-Methoden zugreifen. Die ID des Chat-Partners aus msg['from']['id'] nutzen Sie, damit der RasPi später nicht mit Fremden redet. Bei jeder eingehenden Message prüfen Sie dazu diese ID gegen eine hinterlegte Liste von gültigen Einträgen und ignorieren alle Nachrichten von fremden Nutzern.

Der Schutz ist nur begrenzt, denn er verlässt sich darauf, dass die Telegram-Server das Fälschen von IDs zuverlässig verhindern. Der RasPi darf also ohne zusätzliche Maßnahmen per Chat auf keinen Fall vertrauliche Dokumente herausrücken oder die Wohnung aufsperren. Außerdem sollte der Bot als eigener Dienst mit eingeschränkten Rechten laufen (siehe Kasten “Den Bot einsperren”).

Den Bot einsperren

Damit der Bot nur eingeschränkte Rechte auf dem System erhält, muss das Programm unter einer eigenen Benutzer-ID laufen. Dazu legen Sie zuerst einen neuen Account an, etwa mybot (Listing 2, erste zwei Zeilen). Das Programm (im Beispiel /usr/local/sbin/rpi-bot.py) starten Sie anschließend über einen Systemd-Service mit der Unit-Datei /etc/systemd/system/rpi-bot.service (Listing 3) über die Kommandos aus den beiden letzten Zeilen von Listing 2.

Planen Sie, den Bot Kommandos ans System absetzen zu lassen, geben Sie ihm auf keinen Fall volle Sudo-Rechte: Es genügt, einzelne Kommandos freizuschalten. Dazu legen Sie die Datei /etc/sudoers.d/rpi-bot mit dem Inhalt aus Listing 4 an. Damit darf der Bot per Sudo genau die genannten Befehle ausführen. Der Name der Datei spielt dabei keine Rolle, entscheidend ist der Inhalt. Je nach Sicherungsbedarf bieten sich noch weitere Verfahren an, wie etwa eine Chroot-Umgebung oder ein via Docker teilvirtualisiertes System.

Listing 2

 

$ sudo groupadd -r mybot
$ sudo adduser --disabled-login --gecos "" --system --group --home /var/lib/mybot mybot
[... Unit-Datei anlegen ...]
$ sudo systemctl enable rpi-bot.service
$ sudo systemctl start rpi-bot.service
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland