Nextcloud Talk - Nachrichten über die CLI verschicken

Ich bin ja dabei bei den von mir genutzten Tools auszumisten bzw. aufzuräumen. Wer ein paar der älteren Artikel gelesen hat ist vermutlich darüber gestolpert, dass ich als Messenger den Dienst Pushbullet nutze. Eigentlich war dieser gar nicht als Messenger vorgesehen sondern sollte eine einfache Möglichkeit liefern, Daten jeglicher Art vom Telefon auf den Rechner und umgekehrt zu bekommen. Natürlich hat dies ein Eigenleben entwickelt, weshalb ich Pushbullet fast ausschließlich als Messenger nutze.
Ein Grund dafür war sicherlich auch die unkomplizierte Möglichkeit, von einer CLI eine Nachricht an mich oder andere zu schicken. Alles was ich mir zu der Zeit angeschaut hatte, legte einem hier gefühlt Steine in den Weg. Bei Pushbullet musste ich mir nur einen Token organisieren und konnte z.B. einen einfachen Curl Befehl absetzen und schon war die Nachricht unterwegs. Allerdings merkte ich in letzter Zeit, dass Features eingekürzt wurden bzw. Sachen gar nicht mehr funktionierten (z.B. Übertragung von großen Bildern). Mich beschlich das Gefühl, dass hier wenig bis keine Liebe ehr in die Entwicklung bzw. Fehlerbehebung gesteckt wurde. Dies und die Tatsache, dass ich die Daten gerne in der eigenen Hoheit hätte, hat mich nach einer Alternative ausschau halten lassen.
Ich betreibe schon Jahre eine eigene Cloudlösung. Am Anfang bin ich mit einer Owncloud gestartet und vor ca. 1 Jahr, habe ich diese zu einer Nextcloud migriert. Ich habe den Schritt bis jetzt nicht bereut und gerade die Fülle an zusätzlichen Tools und Features finde ich fantastisch. Ich denke wir gehen in Zukunft auf ein paar weitere ein aber mit dem obigen Kontext (und der Überschrift), soll es heute nur um die Messenger Funktionalität der Nextcloud gehen – Talk!
Talk steht m.E. echten Messenger Diensten in nichts nach. Ich kann hier sowohl schnöde Chatten, Bilder und andere Dateien austauschen, aber ich kann auch mit anderen Nutzern telefonieren und Videoanrufe durchführen. Das alles dazu noch über eine eigene Plattform und somit die Daten in der eigenen Hand. Ich für meinen Teil finde das sehr beeindruckend und bin auch ein großer Fan dieser Anwendung geworden. Für Android und IOS gibt es entsprechende Apps in den eigenen Stores.
Wie ihr merkt, bin ich ein begeisterter Nutzer und wollte mich langsam damit beschäftigen Pushbullet abzulösen. Das größte Problem war, dass Pushbullet, über die Hausautomation, die meisten meiner Haus-Nachrichten übermittelt. Es war also klar, dass ich Pushbullet erst beerdigen kann, wenn ich dies abgelöst habe.
Genau hierum soll es in diesem Artikel gehen. Ich möchte mit euch zusammen, eine Nachricht von einer CLI oder einem Script zu einem Nextcloud Nutzer schicken. Erstaunlich ist, dass es doch relativ einfach möglich ist aber wie immer muss Mann etwas recherchieren und lesen, bevor es losgehen kann. Auch wenn ihr bis hierhin schon einiges an Text hinter euch habt, hoffe ich ihr seid noch Aufnahmefähig.
Für unser Vorhaben setze ich eine aktive Nextcloud Instanz mit Talk installiert voraus. Ihr konntet auch schon erfolgreiche Nachrichten zwischen z.B. zwei Testuser schicken. Weiterhin brauchen wir ein System, auf welchem Python läuft. In meinem Beispiel ist es ein Debian 11 System, welches ich auf den aktuellen Stand gebracht habe.
Aber genug geredet fangen wir an………..
Als erstes wählen wir uns mit einem Administrator Account auf der Nextcloud ein und wählen den Unterpunkt Benutzer, wenn ihr auf euer Profil oben rechts in der Ecke klickt.
Im sich öffnenden Fenster, klicken wir links oben auf Neuer Benutzer. Im Nutzerdialog benötigen wir nur einen Namen und ein Passwort. Das Passwort kann, und ich empfehle dies auch, ein sehr langes und schweres sein. Final nutzen wir dieses nicht für unsere Zwecke (außer einmal). Wir legen uns einen API Token an, mit welchem wir später arbeiten. In meinem Beispiel nenne ich diesen einfach mal test.
Wie angekündigt müssen wir das lange Passwort aber einmal nutzen. Wir loggen uns also als unser gerade angelegter Nutzer ein und navigieren, wieder über das Profil, auf den Punkt Einstellungen. Hier wählen wir in der linken Navigationsleiste den Punkt Sicherheit. Ganz unten findet ihr die Rubrik Geräte & Sitzungen. Wir vergeben jetzt einen Namen für unsere „App“ und klicken auf Neues App-Passwort erstellen. Zur Vereinfachung nenn ich diese jetzt cli. Wenn ir alles richtig gemacht habt, seht ihr jetzt eine Ausgabe eines Users und das dazugehörige Passwort. Bitte kopiert euch dieses heraus, da es nur einmal angezeigt wird und sonst nur noch ein neues erzeugt werden kann.
Wo wir einmal eingeloggt sind, gehen wir in Talk über das Q in der Navigationsleiste oben und erstellen und direkt die gewünschten Unterhaltungen. Wenn ihr nur einen einzelnen Nutzer erreichen wollt, dann könnt ihr einfach den Namen in das Suchfeld eintippen. Über den Pluspunkt daneben könnt ihr euch aber auch eine Unterhaltung erstellen und dazu dann mehrere Nutzer einladen. Warum ist das wichtig? Weil wir neben einem angemeldeten und autorisierten Benutzer auch eine sogenannte Channel-ID benötigen. Nextcloud vergibt für einzelne Unterhaltungen eine eindeutige Zeichenfolge. Aus der CLI schicken wir die Nachricht dann direkt in diesen Channel oder Raum wenn ihr so wollt.
Diese Channel-ID erhalten wir, indem wir im Browser in die gewünschte Unterhaltung springen. In der Adresszeile ist diese zu erkennen. In meinem Fall lautet diese „hd279mu3“.
So das war es auf der Nextcloud selber. Wir loggen uns aus und machen auf dem Linux System weiter. Grundsätzlich könnt ihr schon jetzt eine Nachricht von der CLI losschicken. Hierzu muss nur Curl auf dem System installiert sein und ihr müsst den folgend String an eure Begebenheiten anpassen (ChannelID muss zweimal geändert werden).
curl -d '{"token": "ChannelID", "message": "Eure Nachricht"}' -H "Content-Type: applicatio
n/json" -H "Accept: application/json" -H "OCS-APIRequest: true" -v -u "User:App-Passwort" https://eure
.domain.net/ocs/v2.php/apps/spreed/api/v1/chat/ChannelID
Wenn alles geklappt hat solltet ihr auf irgendeinem Device die Nachricht erhalten oder gesehen haben. Falls nicht ist in diesem Curl Befehl schon das Verbose Log Level aktiviert und ihr solltet im Output ziemlich genau sehen können, was schief gegangen ist. Solltet ihr diesen Befehl produktiv nutzen wollen, entfernt das „-v“ damit der Output nicht alles zuspamt.
Ich fand diese Lösung etwas unschön. Natürlich kann ich bei jedem Script oder Projekt den Aufruf mit einbinden und einfach aufrufen lassen aber ich wollte dies entkoppeln. Was genau meine ich damit? Ich wollte eine Möglichkeit, wo ich nur wenige Variablen übergeben muss und sich ein anderer Prozess, oder Programm, um den Versand der Nachricht kümmert. Daher habe ich ein Python Script geschrieben bzw. das Grundgerüst habe ich online gefunden und verändert. Herausgekommen ist folgendes.
#!/usr/bin/python3
import requests import json import sys channelId = sys.argv[1] message = sys.argv[2] server = "https://eure.domain.net" username = "User" password = "App-Passwort" def NextcloudTalkSendMessage(channelId, message): data = { "token": channelId, "message": message, "actorDisplayName": "User", "actorType": "", "actorId": "", "timestamp": 0, "messageParameters": [] } url = "{}/ocs/v2.php/apps/spreed/api/v1/chat/{}".format(server, channelId) payload = json.dumps(data); headers = {'content-type': 'application/json', 'OCS-APIRequest': 'true'} resp = requests.post(url, data=payload, headers=headers, auth=(username, password)) print(resp) NextcloudTalkSendMessage(channelId, message)
Was genau passiert in dem Script? Grundsätzlich gebt ihr über eine Variablen Sektion sowohl die Adresse eurer Nextcloud Instanz, den von euch eingerichteten Nutzer und das von euch erstellt App-Passwort an. Weiterhin ist eine Funktion gebaut, welche den Request zusammenbaut, ähnlich dem was wir über den Curl Befehl abgesetzt haben. Zum Schluss rufen wir die Funktion auf und geben dort die ChannelID und unsere Nachricht mit. Ihr könntet dort also einfach eure Daten in Anführungszeichen einfügen und wenn ihr das Script ausführt, schickt es auch eine Nachricht. Ich persönlich wollte aber Daten übergeben. Das Ganze löse ich jetzt mit System Argumenten! Ds Script füttert die Variablen channelId und message mit den beim Aufruf des Scriptes überreichten Argumenten. Der Vorteil liegt auf der Hand. Wenn ich jetzt mehrere Prozesse habe, welche eine Nachricht verschicken wollen oder müssen, kann ich dem Script einfach die entsprechenden Werte übergeben und schon wird die Nachricht X an Y geschickt und die Nachricht Z an V. Natürlich könnt ihr den Aufruf auch wieder aus einem Script heraus durchführen aber der Einfachheit halber testen wir das jetzt einfach auf der CLI. Das Script heist im Beispiel totalk.py!
python totalk.py ChannelID "Eure Nachricht"
Wie ihr seht ist es wirklich nicht zu schwer. Je nach Anwendungsfall könnt ihr euch einzelne Schritte sogar noch sparen. Für mich ist das so eine wirklich Runde Lösung! Ich hoffe ich konnte euch ein wenig Zeit bei der Recherche und beim probieren ersparen.
Wie immer handelt es sich um mein Beispiel. Passt also alles an eure Voraussetzungen an.
Ich hoffe euch hat der Artikel gefallen. Solltet ihr Fehler gefunden haben, generelle Fragen haben, oder wollt ihr einfach noch zusätzliche Informationen, dann schreibt mir bitte in die Kommentare. Ich versuche diese zeitnah zu beantworten.
Danke fürs lesen…..
Euer cedigger

Dieser Beitrag hat 2 Kommentare

  1. jeff

    Hi,
    ich teile Deine Meinung Talk für Nachrichten von zu Hause zu verwenden, die beste überhaupt ist. Alles Daten bleiben im Haus.
    Leider bin ich „noch“ kein Python-freak und ich erhalte eine Fehlermeldung, welche für mich nicht nachvollziehbar ist:

    Traceback (most recent call last):
    File „/home/pi/Downloads/nachricht.py“, line 15
    data = {
    ^^^^
    IndentationError: expected an indented block after function definition on line 14

    Würde mich sehr über einen Tipp freuen.
    Grüße Ulrich

    1. cedigger

      Hallo Ulrich,

      schön von jemandem zu hören, der das auch so sieht 🙂

      Bezüglich deines Problems fehlt mir etwas der Kontext aber der Fehler deutet auf ein schnödes Problem mit einer Mischung von Tabulatoren und Freizeichen. Ich vermute du hast das Script von der Seite kopiert? Evtl. hat sich da eine Formatierung eingeschlichen. Meine Empfehlung für sowas ist es immer einen Texteditor dazwischen zu schalten. Kontrollier doch nochmal dein Script bzw. lass dir die Zeichen anzeigen. Evtl. gibt sich das Problem so. Ansonsten gib mir noch etwas mehr Infos und ich versuche zu helfen.

      Bezüglich Python einfach dranbleiben. Das wird schnell besser. Aus meiner Erfahrung gibt es wenig Programmiersprachen, wo du eine so schnelle Lernkurve hast.

      Bis dann

      Cedigger

Schreibe einen Kommentar