【问题标题】:Azure Automation Webhook - Twilio StatusCallback not arriving in JSONAzure 自动化 Webhook - Twilio StatusCallback 未到达 JSON
【发布时间】:2017-06-28 15:09:33
【问题描述】:

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

Twilio 帐户/电话号码已设置并且工作正常。当我调用 Twilio Number 时,我在 Azure 自动化 Webhook 上成功接收到 HTTP POST,并触发了 Runbook。

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

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

ConvertFrom-JSON:无效的 JSON 原语:已调用。在行:13 字符:11 + $Inputs = ConvertFrom-JSON $webhookdata.RequestBody + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [ConvertFrom-Json], ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

这是从 Twilio 到达 Azure 自动化 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 = 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":{"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 看起来有些奇怪(虽然 Head 看起来不错):

$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-签名: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=CALLS8To=0&&CallSid=CALLS8ToID =&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=>

有没有人知道我可以做什么而不是编写自己的“转换器”来从 TWILIO HTTP POST 获取值?或者我可能做错了什么?

【问题讨论】:

    标签: json powershell twilio webhooks azure-automation


    【解决方案1】:

    所以,我想我理解了你的问题。你做的有点不对:$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]);
        }
    }
    

    【讨论】:

    • 工作就像一个魅力!非常感谢您提供的功能:)
    • 在这种情况下,您应该将此标记为答案;)@y_maurer
    • 谢谢,我正在尝试,但我想现在我找到了按钮;)
    • 我猜你已经将另一个答案标记为正确的答案;))@y_maurer
    【解决方案2】:

    这里是 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 提供了一个不错的实现。

    【讨论】:

    • 非常感谢!我想这样我可能会对 Twilios 响应/请求产生误解。
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 2013-11-05
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多