Post 使用 Powershell 到 Office365 组连接器(Webhook)

Post to Office365 Group Connector(Webhook) using Powershell

我正在尝试使用 powershell post 向 O365 'Incoming Webhook' 发送一条简单消息。这是代码:

$url = 'https://outlook.office365.com/webhook/.......'

$body = @"
{
    "text": "Hello World!"
    "title": "Today"
}
"@

Invoke-RestMethod -Uri $url -Method Post -Body $body -ContentType "application/json"

但是得到这个错误:

PSMessageDetails      : 
Exception             : System.Net.WebException: The remote server returned an error: (404) Not Found.
                           at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.GetResponse(WebRequest request)
                           at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()
TargetObject          : System.Net.HttpWebRequest
CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
ErrorDetails          : Invalid webhook request
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 10
PipelineIterationInfo : {}

如果我遗漏了 -Contentype 参数,我会得到这个错误:

Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException: AADSTS90002: Requested tenant identifier '00000000-0000-0000-0000-000000000000' is not valid. Tenant identifiers may not be an empty GUID.
Trace ID: c4b77459-3915-475e-8125-fa2db9fd11e8
Correlation ID: 0ba64202-db52-4a96-8f44-a87b7f009170
Timestamp: 2016-03-27 07:48:02Z

有人知道如何让它工作吗?

由于 "text" 字段后缺少逗号,您的邮件正文不是有效的 json 片段。

改为

$body = @"
{
    "text": "Hello World!",
    "title": "Today"
}
"@

它对我有用。

谢谢指点。我试图测试 Azure WebHook。它将在网页的测试方法上工作;甚至将 JSON 正文从页面复制到 powershell,但它不起作用。关键显然是指定

-ContentType "application/json"

然而,我发现有趣的是,Teams do 中的 WebHooks 使用默认内容类型(即 "application/x-www-form-urlencoded") 举个例子 post Stefan Stranger posted:

Use WebHooks Connect to Send Data from PowerShell to Microsoft Teams

对他们来说是个不错的捷径,但最好始终为 WebHook 指定内容类型以确保安全。