Per Telegram mit dem RasPi chatten

© 29mokara, 123RF

Aufgeweckt

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

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

Listing 3

 

# Unit-Datei /etc/systemd/system/rpi-bot.service
[Unit]
Description=Servicedefinition für rpi-bot
After=multi-user.target
[Service]
Type=simple
User=rpi-bot
ExecStart=/usr/local/sbin/rpi-bot.py
[Install]
WantedBy=multi-user.target

Listing 4

 

rpi-bot ALL=(ALL) NOPASSWD: /sbin/halt, /sbin/reboot

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Aktuelle Ausgabe

12/2018
Coole Projekte

Diese Ausgabe als PDF kaufen

Preis € 7,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Bytes und Beats

    In Sonic Pi können Sie mit wenigen Codezeilen Klänge manipulieren, Beats zusammenstellen und ganze Songs komponieren.

  • Klein, aber fein

  • Trick or treat

    Das traditionelle RPG-Gruselkabinett glänzt dieses Jahr mit einer innovativen Umsetzung mittels Pneumatik und Elektropneumatik sowie ST-Programmierung.

  • Unter Kontrolle

    Traditionell stellen wir alljährlich ein selbst gebautes Halloween-Gespenst vor. Die pneumatischen und elektronischen Grundlagen erklärt dieser Artikel.

  • Go Pi Go!

    Der Bausatz GoPiGo3 liefert Bauteile und Software für ein kleines Roboterauto. Zusammen mit einem RasPi als Gehirn programmieren Sie den Roboter per Mausklick.

  • Handlicher Helfer

    Während die Folien der Präsentation durchlaufen, liefert ein kleiner Dokumentenserver auf Basis des GL-AR300M-ext zusätzliche Informationen aus.

  • Wiederverwertet

    Mithilfe eines einfachen Python-Programms recyceln Sie ein ausgedientes Smartphone als drahtlos angebundenes RasPi-Display.

  • Herzenssache

    Steigt beim Krimi der Herzschlag bedrohlich an? Mit einem Pulsmesser in Eigenbau ermitteln Sie einfach und kostengünstig, ob der Herzschlag noch in verträglichen Bereichen liegt.

  • Fernbedient

    Mit der Fernbedienung den RasPi steuern. In der Theorie möglich, in der Praxis oft beschwerlich. Die Libcec liefert praktische Tools zur Fehlersuche.

  • Musikwürfel

    Mit Musikcube machen Sie Ihre eigene Sammlung fit fürs Streamen. Der terminalbasierte Audioplayer lässt sich Fernsteuern und bietet eine App für Android-Smartphones.