Hier die längst überfällige Anleitung um Telegram Nachrichten mit einem Shellskript zu verarbeiten.
Das Interessanteste dabei ist bestimmt wie die Nachricht (per Luaskript) an das Shellskript weitergereicht
wird und wie das Shellskript antwortet.
Das letztere hab ich <--hier--> schon versucht zu erklären deshalb halt ich mich hier kurz.
Ausserdem zeige ich zum Schluss noch kurz wie ich den Telegram Client über die /etc/rc.local automatisch starte.
Voraussetzung:
Der Telegram Client wurde eingerichtet und funktioniert soweit. - Ihr habt also schon einen Kontakt
hinzugefügt und erste Nachrichten verschickt. -> Installation/Erste Schritte
Den privaten Schlüssel des Telegram Servers habe ich wie <-hier-> ganz am Anfang beschrieben ins
Verzeichnis /etc/telegram-cli kopiert, falls ihr euch wundert wieso ich den nicht mit angegeben muss.
"Installiert" ist der Client bei mir direkt im Heimverzeichnis (/home/pi/tg).
Ausserdem wird damit das Shellskript antworten kann das Programm netcat benötigt (sudo apt-get install netcat-traditional).
-------------------------------
1. Das Luaskript
Um die Nachrichten an das Shellskript weiter zu geben wird zuerst eine Kopie der test.lua so angepasst das
es alle Nachrichten die von einem bestimmten Benutzer kommen an das Shellskript weiterreicht.
Zusätzlich markiert das Luaskript auch noch alle angekommenden Nachrichten als gelesen. (Auf dem Smartphone
wird ein gelesen Haken angezeigt)
Also wird als erstes eine Kopie der test.lua erstellt...
...und dann die Funktion on_msg_receive darin mit der unten gezeigten ersetzt.
Angepasst werden muss der Name des Benutzers von welchem Nachrichten akzeptiert werden sollen (hier 'Joh'),
sowie gegebenenfalls der Pfad zum Skript das auf die Nachrichten reagieren soll (hier '/home/pi/tg/msg-parser.sh').
/home/pi/tg/fwd.lua
function on_msg_receive (msg)
if started == 0 then
return
end
if msg.out then
return
end
--------------------------------------------
-- Nachricht als gelesen markieren
if msg.text then
mark_read (msg.from.print_name, ok_cb, false)
end
--------------------------------------------
-- Nur Nachrichten vom Benutzer Joh aktzeptieren
if (msg.from.print_name == 'Joh') then
os.execute (string.format("/home/pi/tg/msg-parser.sh \"%s\" &", msg.text))
end
--------------------------------------------
end
Alles anzeigen
"weitergereicht" bedeutet in diesem Fall das mit jeder ankommenden Nachricht das Skript 'msg-parser.sh'
mit der angekommenen Nachricht als Parameter aufgerufen wird.
Ausserdem wird das Skripte durch das & Zeichen als eigenständiger Prozess gestartet, es wird also nicht
gewartet bis das Shellskript wieder beendet wurde (was je nach auszuführendem Befehl etwas dauern könnte).
Das heißt es können mehrere Nachrichten/Befehle gleichzeitig verarbeitet/ausgeführt werden.
-------------------------------
2. le Shellskript
Dazu hab ich im gleichen Verzeichnis in dem auch die fwd.lua liegt ein Shellskript mit dem Namen 'msg-parser.sh' angelegt.
Das Skript ist sehr einfach gehalten und unterstützt nur eine Hand voll Befehle, kann aber recht einfach erweitert werden.
Das Skript kann natürlich auch ein beliebiges anderes Skript oder Programm sein.
Angepasst werden muss der Kontakt Name des Empfängers der Antworten (hier Joh),
sowie gegebenenfalls der Port auf welchem der Telegram Client auf Befehle lauscht (hier 54321).
/home/pi/tg/msg-parser.sh
#!/bin/bash
#######################
# Konfig
#######################
empf=Joh
port=54321
#
cmd="nc.traditional -w 1 127.0.0.1 $port 2>/dev/null"
######################
# Main
######################
# Nachricht in Kleinbuchstaben umwandeln
msg="${1,,}"
case $msg in
"ping")
echo "msg $empf Pong" | $cmd
;;
"uptime")
echo "msg $empf "$(uptime)"" | $cmd
;;
"screenshot")
export DISPLAY=:0
scrot -q50 /tmp/screenshot.png
echo "send_photo $empf /tmp/screenshot.png" | $cmd
;;
"gpio high")
gpio mode 6 OUT
gpio write 6 1
;;
"gpio low")
gpio mode 6 OUT
gpio write 6 0
;;
"gpio toggle")
gpio mode 6 OUT
gpio write 6 $((! $(gpio read 6)))
;;
"gpio read")
echo "msg $empf "GPIO Pin 6: $(gpio read 6)"" | $cmd
;;
*)
echo "msg $empf "Unbekannter Befehl!"" | $cmd
;;
esac
exit 0
Alles anzeigen
Unterstütze Befehle:
'ping' - Antwortet mit 'Pong'
'uptime' - Schickt die Ausgabe vom Befehl 'uptime' zurück
'screenshot' - Schickt einen mit scrot gemachten screenshot zurück (dauert ca. 5 Sekunden)
'gpio high' - Setzt den gpio 6 auf high
'gpio low' - Setzt den gpio 6 auf low
'gpio toggle' - Wechelt den Zustand von gpio 6
'gpio read' - Schickt den Zustand von gpio 6 zurück (0 oder 1)
Damit nicht nur die Befehle 'ping' und 'uptime' funkionieren muss für 'screenshot' 'scrot' installiert sein(sudo apt-get install scrot) und für das setzten und lesen der GPIO Pins wiringPi.
(Ihr könnt (und sollt) das ja umbauen wie ihr es braucht )
Da die Nachricht in Kleinbuchstaben umgewandelt wird können die Befehle beim testen groß oder klein geschrieben
werden. (Praktisch da auf dem Smartphone immer mit einem Grossbuchstabe begonnen wird)
Wie das mit dem Antworten funktioniert hab ich <-hier->(Variante 2 - Über eine Port Verbindung) schon kurz beschrieben.
-------------------------------
3. Telegram Client automatisch starten
Da der Telegram Client ja am besten ständig im Hintergrund laufen und auch beim Systemstart mitstarten
sollte, zeig noch kurz wie ich das über die /etc/rc.local gemacht habe:
Falls ihr eine anderen Weg gewählt habt könnt ihr natürlich auch diesen verwenden. Am besten wäre wohl
wenn man den Client wie <--hier--> beschrieben wird startet. (hab ich aber noch nicht getestet)
Angepasst werden müssen der Pfad zu telegram-cli, der Pfad zum Luaskript sowie der Benutzer unter welchem der Telegram Client laufen soll (hier pi).
/etc/rc.local
########################################
# Telegram Client starten
########################################
su pi -c "/home/pi/tg/telegram-cli -s /home/pi/tg/fwd.lua -d -D -E -R -P 54321 -W" &
########################################
Das wichtigste dabei ist es einen Port zu öffnen (-P 54321). Da das ja dem Shellskript ermöglicht zu antworten.
Mehr Infos zu den einzelnen Parametern bekommt man mit 'telegram-cli -h'
-------------------------------
Falls was nicht klappt oder unklar ist bitte gleich bescheid geben.
-------------------------------
Quellen:
https://www.forum-raspberrypi.de/Thread-tutoria…25883#pid125883
https://github.com/vysheng/tg
Viel Spass beim testen und erweitern,
-- Joh