我试图实现一个解决方案,该解决方案基于Twilio,Azure Automation和SCOM在特定事件发生时自动呼叫某人。此外,有人可以拨打号码,并触发相同的过程。
Twilio帐户/电话号码设置正常。当我拨打Twilio号码时,我在Azure Automation Webhook上成功接收了HTTP POST,并且启动了Runbook。
我现在面临的唯一问题是,我无法使用cmdlet ConvertFrom-Json
来解压缩WebhookBody。
这是我在使用cmdlet时遇到的错误:
ConvertFrom-JSON:无效的JSON原语:被调用。在行: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 端点"" RequestBody":"调用=%2B41815880262&安培;使用toState =库尔&安培; CallerCountry = CH&安培;方向=入站&安培;时间戳=周五%2C%2010%20Feb%202017%2009%3A07 %3A35%20%2B0000&安培; CallbackSource =呼叫进程的事件和安培; CallerState =安培; ToZip =安培;的SequenceNumber = 0&安培; CallSid = CA7c152287d945595fe600614fe7778f8a&安培;为了=%2B41815880262&安培; CallerZip =安培; ToCountry = CH&安培; ApiVersion = 2010-04- 01安培; CalledZip =安培; CalledCity =安培; CallStatus =完成&安培;持续时间= 1和;从=%2BMYTELNUZMBER&安培; CallDuration = 8&安培; AccountSid =糠&安培; CalledCountry = CH&安培; CallerCity =安培;主叫=%2Bmybnumber&安培; FromCountry = CH&安培; ToCity = &安培; FromCity =安培; CalledState =库尔&安培; FromZip =安培; FromState ="" RequestHeader" {"缓存控制":"最大年龄= 259200""连接":"靠近""接受":" / ",& #34;主机":" s2events.azure-automation.net""用户代理":" TwilioProxy / 1.1"" X-Twilio签名":" pq2jYVGN3H5Lmanw Id0xCvp69tM ="" X-MS-请求-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
输出:
缓存控制:max-age = 259200连接:关闭接受 : / 主持人:s2events.azure-automation.net用户代理
:TwilioProxy / 1.1 X-Twilio-Signature:xmEbt23prT + W8zJrRZE5pdKullE = x-ms-request-id:bdca412c-584e-42ba-acbb-969cdf9c1ec0调用=%2B41815880262&安培;使用toState =库尔&安培; CallerCountry = CH&安培;方向=入站&安培;时间戳=星期三%2C%2008%20Feb%202017%2013%3A18%3A27%20%2B0000&安培; CallbackSource =呼叫进程的事件和安培; CallerState =安培; ToZip =安培;的SequenceNumber = 0&安培; CallSid = CALLSID&安培;为了=%2B41815880262&安培; CallerZip =安培; ToCountry = CH&安培; ApiVersion = 2010-04-01&安培; CalledZip =安培; CalledCity =安培; CallStatus =完成&安培;持续时间= 1&安培;从=%2BMYNUMBER&安培; CallDuration = 7&安培; AccountSid =糠&安培; CalledCountry = CH&安培; CallerCity =安培;主叫=%2BMYBNUMBER&安培; FromCountry = CH&安培; ToCity =安培; FromCity =安培; CalledState =库尔&安培; FromZip =安培; FromState =
有没有人知道我能做什么而不是写我自己的"转换器"从TWILIO HTTP POST获取值?或者我可能做了一些可怕的错误?
答案 0 :(得分:3)
所以,我想我理解你的问题。你做得有点错误:$webhook
数据已经是一个对象,它拥有你需要的一切:
$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]);
}
}
答案 1 :(得分:1)
Twilio开发者传道者在这里。
当Twilio向您的网址发送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提供了一个不错的实现。