Automatisierte Microsoft Teams Nachrichten mit Python, curl & co versenden

Als Video ansehen
Bereitgestellt über YouTube

Automatisierte Microsoft Teams Nachrichten mit Python, curl & co versenden

Wer Microsoft Teams nutzt, will oder muss andere Anwendungen daran anbinden. Beispielsweise aus anderen Anwendungen heraus Nachrichten versenden, um Informationen in einem MS Teams Kanal bereitzustellen. Wie dies funktioniert, zeigt dieser Beitrag am Beispiel des bekannten curl sowie der Skriptsprache Python. Auf ähnliche Weise kann man aber auch mit anderen Technologien Chatnachrichten an den Clouddienst versenden.

Vorbereitung: Anlegen eines Connectors

MS Teams nutzt Connectoren, um andere Anwendungen zu integrieren. Dies geschieht auf Kanalebene. Navigiert daher zu dem Kanal, in den ihr automatisiert Nachrichten senden möchtet. Beim drauf zeigen mit der Maus erscheinen rechts drei Punkte. Sie öffnen ein Menü mit dem Eintrag Connectors:

Sucht dort nach Incoming Webhook. Wurde dieser Connector noch nie zum Team hinzugefügt, muss dies zuerst durch zweimal Klicken auf Hinzufügen durchgeführt werden.

Anschießend wiederholt man den obigen Schritt und klickt dieses mal beim Incomming Webhook Connector auf Konfigurieren:

Gebt dem Connector einen frei wählbaren Namen, optional kann darunter ein Bild hochgeladen werden. Beides wird im Kanal angezeigt, wenn der Connector dort Nachrichten veröffentlicht. Schlussendlich wird der Bot mit Erstellen angelegt:

Nach einigen Sekunden Wartezeit erscheint über den Knopf eine URL, die ihr euch kopiert und abspeichert. Sie enthält alle notwendigen Informationen, um Nachrichten in diesem Kanal veröffentlichen zu können – sie ist daher wie ein API-Schlüssel zu behandeln.1 Das Erzeugen von Nachrichten ist von nahezu überall möglich, wo HTTP-Anfragen gesendet werden können. In den folgenden Abschnitten demonstriere ich dies auf der Kommandozeile mit curl sowie einem Python-Skript.

Senden von Nachrichten mit curl

An diese URL wird ein JSON-Dokument gesendet, das im einfachsten Falle nur den Text enthält. Es sind viele weitere Attribute möglich: Etwa können Links angeheftet oder Karten mit Titeln erstellt werden.2 Für eine einfache Nachricht ohne zusätzliche Inhalte genügt ein JSON mit dem Attribut „text“:

{"text": "Hi von curl!"}

Dafür ist eine HTTP-POST Anfrage notwendig, die sich mit dem freien und quelloffenen Werkzeug curl wie folgt senden lässt:

curl -s --header "Content-Type: application/json" \
   --request POST \
   --data '{"text": "Hi von curl!"}' \
   https://xx.webhook.office.com/webhookb2/xyz

MS Teams liefert 1 zurück, wenn die Nachricht gesendet wurde. Dies kann einige Sekunden dauern. Wird die Nachricht nicht gesendet, ist entweder MS mal wieder down oder man hat ein Limit überschritten. Beispielsweise etwa 28KB pro Nachricht.3 Dazu wird ebenfalls die maximale Anzahl von Anfragen in bestimmten Intervallen (pro Sekunde, 30/3600 Sekunden usw) beschränkt.4

Senden von Nachrichten mit Python

Python bringt Bibliotheken für JSON und HTTP-Anfragen mit, sodass eine Anfrage in nur wenigen Zeilen mit Boardmitteln durchgeführt werden kann:

import json
import sys
import datetime
from urllib import request

webhook_url = "https://xx.webhook.office.com/webhookb2/xyz"
message = "Diese Nachricht wurde von Python gesendet: " + str(datetime.datetime.now())

req = request.Request(url=webhook_url, method="POST")
req.add_header(key="Content-Type", val="application/json")
data = json.dumps({"text": message}).encode()

with request.urlopen(url=req, data=data) as response:
    print("HTTP Status: " + str(response.status))
    print("MS Status: " + response.text)

Wer die JSON-Objekte nicht selbst erzeugen möchte und mit der Verwendung von Drittanbieter-Paketen keine Probleme hat, kann die Bibliothek pymsteams nutzen.56 Grundsätzlich lässt sich auch mit anderen Plattformen eine Nachricht erzeugen – ein HTTP-Client ist in nahezu jeder Plattform vorhanden.

Sicherheitshinweis: Der Totalschaden in Microsofts Wolke

Bedenkt, dass ihr hierbei die öffentliche Cloud von Microsoft benutzt. Eure Daten befinden sich auf Servern des Konzerns. Für deren Sicherheit müsst ihr euch auf das Unternehmen verlassen – und zwar auf eines, das in der Vergangenheit bereits mehrfach mit extremen Sicherheitsmängeln aufgefallen ist. Zuletzt beispielsweise BingBang, bei dem auch zahlreiche interne Microsoft-Systeme für fremde Zugreifbar waren. Auch Microsoft 365 wurde bereits gehackt, da Microsofts Schutzmaßnahmen unzureichend waren. Außerdem bemerkte der Konzern den Angriff nicht, sondern die Kunden selbst. Selbst dann versuchte Microsoft, den Angriff klein zu reden – obwohl große Organisationen wie u.a. die US-Regierung betroffen waren.

Microsoft hat bereits mit mehr als einem Totalschaden bewiesen, dass Daten dort nicht sicher aufgehoben sind. Ich halte es daher für Angebracht, vor diesen Gefahren zu warnen – überlegt euch gut, ob ihr eure Daten unsicheren Cloudsystemen anvertrauen möchtet, die zudem gerne mal ausfallen.

Quellen & weiterführende Informationen

  1. https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet ↩︎
  2. https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL ↩︎
  3. https://learn.microsoft.com/en-us/microsoftteams/limits-specifications-teams ↩︎
  4. https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL#transactions-per-second-thresholds ↩︎
  5. https://github.com/rveachkc/pymsteams ↩︎
  6. https://stackoverflow.com/questions/59371631/send-automated-messages-to-microsoft-teams-using-python ↩︎

Leave a Reply