Teams 3rd Party Client-API SDK

Diese Seite beschreibt den Stand eines Reverse Engineering zur Teams 1.0 Client-API.

Der neue Teams 2.x Client hat mittlerweile ebenfalls eine API aber funktioniert etwas anders.

Nutzung der API

Die Hardware ist natürlich nur die eine Seite. Erst eine Software stellt die Verbindung her. Daher wollte ich wissen, wie die API technisch funktioniert und ob ich vielleicht per PowerShell oder andere Code auch selbst diese API nutzen kann. Eine schnelle Suche per Sysinternals Procmon, Ressourcemonitor etc. hat keinen offenen Port verraten. Das Ein/Ausschalten der API hat in der Datei "%appdata%\Microsoft\Teams\storage.json" folgende Einstellungen verändert.

Auszug aus %appdata%\Microsoft\Teams\storage.json

"enableThirdPartyDevicesService":true,
"tpdApiTokenString":"ea8d67e8-4693-40d0-b066-7426a1274bc3"

Hier findet sich dann auch das API-Token. Theoretisch könnte eine Applikation sich diese Information damit auch selbst holen. Da Microsoft selbst noch keine Dokumentation dazu veröffentlicht hat, bleibt nur ein Reverse Engineer mit den üblichen Werkzeugen und sehr schnell findet sich eine Websocket-API. Die Schnittstelle ist also keine COM-API, wie sie die IM-Integration (Siehe Teams Presence und Office IM API) nutzt. Eine erste Quelle zu der API finden Sie folgender URL

Der Autor ist wohl der Entwickler Martijn Smit mit seiner Software Mutedeck (http://Mutedeck.com).


https://twitter.com/smitmartijn/status/1621085116612378624

Nach seiner Analyse könnte eine Software über die folgende Websocket-URL eine Verbindung zum Teams Client herstellen:

ws://localhost:8124?token=API-TOKEN-FROM-PRIVACY
                   &protocol-version=1.0.0
                   &manufacturer=MuteDeck
                   &device=MuteDeck
                   &app=MuteDeck
                   &app-version=1.4

Der Autor hat dazu wohl die Kommunikation des Elgado Addons analysiert.

Auf meinem Client konnte ich aber unter "ws://localhost:8124" keine Verbindung aufbauen. Vermutlich ist der Port auf jedem Client unterschiedlich und muss vorher noch ermittelt werden.

Die Webseite beschreibt auch die verschiedenen Aufrufe der Aktionen. Interessant finde ich aber die Abfrage des Meetingstatus

{
   "apiVersion":"1.0.0",
   "service":"query-meeting-state",
   "action":"query-meeting-state",
   "manufacturer":"Elgato",
   "device":"StreamDeck",
   "timestamp":1674859442
}

Der Timestamp ist wieder die UNIX-Schreibweise und kann in PowerShell wie folgt umgerechnet werden.

[timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds(1674859442))
Freitag, 27. Januar 2023 23:44:02

Die Rückmeldung eröffnet viele Weg, z.B. einer Statusanzeige am PC oder dass eine Zusatzsoftware diese Information an ein Realtime-Dashboard liefert, da das Teams Backend dies aktuell nicht erlaubt.

{
   "apiVersion":"1.0.0",
   "meetingUpdate":{
      "meetingState":{
         "isMuted":false,
         "isCameraOn":true,
         "isHandRaised":false,
         "isInMeeting":false,
         "isRecordingOn":false,
         "isBackgroundBlurred":false
      },
      "meetingPermissions":{
         "canToggleMute":false,
         "canToggleVideo":true,
         "canToggleHand":false,
         "canToggleBlur":false,
         "canToggleRecord":false,
         "canLeave":false,
         "canReact":false
      }
   }
}

Meine ersten Versuche mit PowerShell die API anzusprechen, waren aber noch nicht erfolgreich, da ich nach der Aktivierung denn noch keine funktionierende ws-URL gefunden habe, auf der eine Verbindung zustande gekommen ist.

Ich bin gespannt, wann Microsoft die API öffentlich dokumentiert.

Weitere Links