Adaptive Cards

Teams WebHooks, Bots und andere Dienste kommunizieren mit Anwendern. Wie bei Mails kann ein Prozess einfach Text oder formatierten Text senden aber dann muss der Ersteller sich noch Gedanken um das Layout auf den verschiedenen Geräten machen. Da bietet es sich an, wenn der Client von Microsoft auch ein neues Format versteht, welches sogar Interaktionen über definierte Wege erlaubt. Das freut auch die IT-Sicherheit, wenn 3rd-Party Tools keine HTML-Seiten mit JavaScript u.a. auf einem Client starten.

Adaptive Cards habe ich aktuell beim Einsatz mit Teams Webhooks und Bots kennen gelernt. Das Prinzip ist aber offen und ich denke es wird noch weitere Anwendungsfälle geben.

Quellen

Die MSXFAQ ist sicher nicht die "Programmierer-Referenz" und wer mit Adaptive Cards starten will, findet viele Quellen, von denen ich einige hier aufführe.

Skype for Business is not on our roadmap at this time as Microsoft's investments on collaboration software is targeted at Microsoft Teams, which now fully supports adaptive cards.
Quelle: Kommentare auf https://docs.microsoft.com/en-us/adaptive-cards/

Adaptive Cards in Bots, Windows, Outlook and your own applications : Build 2018
https://www.youtube.com/watch?time_continue=48&v=GJkep8wToVA

Für die Erstellung von Adaptive Cards gibt es verschiedene Editoren im Internet

Beispiel

Für meine Beispielanwendung habe ich mir das Leben einfach gemacht und einfach mal nur eine Zeile und einen Button mit Link generiert. Beachten Sie dabei eine Besonderheit, dass Teams ein Feld "Summary" erfordert, die von den meisten Generatoren nicht angelegt wird. Das Feld können Sie aber einfach manuell zwischen "Version" und "Body" einfügen

Ich habe dennoch mit "Action Cards" weiter gemacht und per PowerShell mal schnell einen HTTP-Request erstellt.

Die "webhookuri" bekommen Sie im Teams Client, wenn Sie dort einen WebHook erstellen. Siehe Teams WebHooks

param (
$webhookuri = 'https://outlook.office.com/webhook/<id1>/IncomingWebhook/<id2>'
)

$body = @"
{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.0",
    "summary": "Update der MSXFAQ", 
    "body": [
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "width": "32px",
                    "items": [
                        {
                            "type": "Image",
                            "width": "32px",
                            "horizontalAlignment": "Center",
                            "url": "https://www.msxfaq.de/images/kachel/msxfaq70x70.png",
                            "altText": "Trello Logo"
                        }
                    ],
                    "type": "Column"
                },
                {
                    "width": "stretch",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "MSXFAQ-Update"
                        }
                    ],
                    "type": "Column"
                }
            ]
        },
        {
            "type": "ColumnSet",
            "spacing": "Large",
            "separator": true,
            "columns": [
                {
                    "width": "32px",
                    "items": [
                        {
                            "type": "Image",
                            "width": "32px",
                            "style": "Person",
                            "horizontalAlignment": "Center",
                            "url": "https://www.msxfaq.de/images/logbuchn.gif",
                            "altText": "Neue Seite: Samplecode"
                        }
                    ],
                    "type": "Column"
                },
                {
                    "width": "stretch",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "Es gibt was neues auf der MSXFAQ"
                        }
                    ],
                    "type": "Column"
                }
            ]
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "Webseite öffnen",
            "url": "https://www.msxfaq.de/sonst/logbuch.htm",
            "iconUrl": "https://www.msxfaq.de/images/kachel/msxfaq70x70.png"
        }
    ]
}
"@

$result = invoke-webrequest `
   -method POST  `
   -uri $webhookuri `
   -contenttype 'application/json' `
   -body $body

Die Rückgabe ist unspektakulär und im Body steht einfach nur eine "1" drin, was Sie als "Wahr" oder Erfolg interpretieren können:

PS C:\> $result.RawContent

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
request-id: 54f99598-9fc5-4924-b12f-7af4fbf4be69
X-CalculatedBETarget: DB8PR04MB5641.eurprd04.prod.outlook.com
X-BackEndHttpStatus: 200
X-AspNet-Version: 4.0.30319
X-CafeServer: DB6P191CA0016.EURP191.PROD.OUTLOOK.COM
X-BEServer: DB8PR04MB5641
X-Proxy-BackendServerStatus: 200
X-Powered-By: ASP.NET
X-FEServer: DB6P191CA0016
X-MSEdge-Ref: Ref A: 280814FC49894AB39360465BA0349FE7 Ref B: FRAEDGE0616 Ref C: 2019-09-07T11:38:31Z
Date: Sat, 07 Sep 2019 11:38:31 GMT
Content-Length: 1
Content-Type: text/plain; charset=utf-8
Expires: -1

1

Ausgabe in Teams

Allerdings entsprach die Anzeige im Team dann immer noch nicht genau meinen Vorstellungen:

Da ist auf jeden Fall noch Feintuning erforderlich.

Weitere Links