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 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.
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”).







