Azure Automation Webhook - Twilio StatusCallback未到达JSON

时间:2017-02-10 10:03:27

标签: json powershell twilio webhooks azure-automation

我试图实现一个解决方案,该解决方案基于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获取值?或者我可能做了一些可怕的错误?

2 个答案:

答案 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提供了一个不错的实现。