Azure 自动化 Webhook - Twilio StatusCallback 未到达 JSON

Azure Automation Webhook - Twilio StatusCallback not arriving in JSON

我正在尝试实施一种解决方案,该解决方案基于 Twilio、Azure Automation 和 SCOM,可在特定事件发生时自动呼叫某人。并且,应该可以有人拨打号码,触发同样的流程。

Twilio Account/Phonenumber 已设置并且运行良好。当我调用 Twilio Number 时,我在我的 Azure Automation Webhook 上成功接收到 HTTP POST 并且 Runbook 被触发。

我现在面临的唯一问题是我无法使用 cmdlet ConvertFrom-Json 来提取 WebhookBody。

这是我在使用 cmdlet 时遇到的错误:

ConvertFrom-JSON : Invalid JSON primitive: Called. At line:13 char:11 + $Inputs = ConvertFrom-JSON $webhookdata.RequestBody + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [ConvertFrom-Json], ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

这是从 Twilio 到达 Azure Automation Webhook 的输入:

{"WebhookName":"Twilio Endpoint","RequestBody":"Called=%2B41815880262&ToState=Chur&CallerCountry=CH&Direction=inbound&Timestamp=Fri%2C%2010%20Feb%202017%2009%3A07%3A35%20%2B0000&CallbackSource=call-progress-events&CallerState=&ToZip=&SequenceNumber=0&CallSid=CA7c152287d945595fe600614fe7778f8a&To=%2B41815880262&CallerZip=&ToCountry=CH&ApiVersion=2010-04-01&CalledZip=&CalledCity=&CallStatus=completed&Duration=1&From=%2BMYTELNUZMBER&CallDuration=8&AccountSid=MYSID&CalledCountry=CH&CallerCity=&Caller=%2Bmybnumber&FromCountry=CH&ToCity=&FromCity=&CalledState=Chur&FromZip=&FromState=","RequestHeader":{"Cache-Control":"max-age=259200","Connection":"close","Accept":"/","Host":"s2events.azure-automation.net","User-Agent":"TwilioProxy/1.1","X-Twilio-Signature":"pq2jYVGN3H5LmanwId0xCvp69tM=","x-ms-request-id":"bc1cf55a-33b2-4046-a343-199d1a7fac4a"}}

当我用这个 cmd 简单地输出 WebHook 数据时,我可以看到 Twilio Repsonse 看起来有点奇怪(虽然 Heade 看起来不错):

$WebhookName = $WebhookData.WebhookName
$WebhookHeaders = $WebhookData.RequestHeader
$WebhookBody = $WebhookData.RequestBody

Write-Output $WebhookHeaders
Write-Output $WebhookBody

输出:

Cache-Control : max-age=259200 Connection : close Accept : / Host : s2events.azure-automation.net User-Agent
: TwilioProxy/1.1 X-Twilio-Signature : xmEbt23prT+W8zJrRZE5pdKullE= x-ms-request-id : bdca412c-584e-42ba-acbb-969cdf9c1ec0

Called=%2B41815880262&ToState=Chur&CallerCountry=CH&Direction=inbound&Timestamp=Wed%2C%2008%20Feb%202017%2013%3A18%3A27%20%2B0000&CallbackSource=call-progress-events&CallerState=&ToZip=&SequenceNumber=0&CallSid=CALLSID&To=%2B41815880262&CallerZip=&ToCountry=CH&ApiVersion=2010-04-01&CalledZip=&CalledCity=&CallStatus=completed&Duration=1&From=%2BMYNUMBER&CallDuration=7&AccountSid=MYSID&CalledCountry=CH&CallerCity=&Caller=%2BMYBNUMBER&FromCountry=CH&ToCity=&FromCity=&CalledState=Chur&FromZip=&FromState=

有人知道我可以做什么而不是自己编写 "Converter" 来从 TWILIO HTTP POST 获取值吗?或者我可能做错了什么?

所以,我想我明白你的问题了。你做的有点不对:$webhook data 已经是一个对象,它拥有你需要的一切:

$WebhookData.WebhookName
$WebhookData.RequestHeader
$WebhookData.RequestBody

你只需要将 RequestBody 解析成有意义的东西:

$data = @{ };

foreach ($item in $WebhookData.RequestBody.Split('&')) {
    try {
        $item = $item.Split('=');
        $data.Add($item[0], [System.Net.WebUtility]::UrlDecode($item[1]))           
    }
    catch {
        Write-Warning -Message ('Possible null parameter value for {0}' -f $item[0]);
    }
}

这里是 Twilio 开发人员布道者。

当 Twilio 向您的 URL 发送 webhook 请求时,它不会编码为 JSON。这就是您的 JSON 转换失败的原因。

Twilio sends the data as either URL encoded parameters in the body of a POST request or URL query parameters for GET requests。这与通过在浏览器中提交表单来发出请求一样。

我不熟悉 Azure cmdlet,但如果有一个用于解析 URL 编码数据,那么您会想改用它。或者,@4c74356b41 提供了一个不错的实现。