0

我想拨打我的 Twilio 号码,该号码立即挂断,然后给我回电。这与我之前的问题相似(但不完全相同)。

问题在于迫使 Twilio 挂断电话。

红宝石代码是:

    get '/callback' do
    to = params['From']
    from = 'my Twilio number'
    "<Response><Hangup/></Response>"
    sleep 5
    # set up a client to talk to the Twilio REST API
    @client = Twilio::REST::Client.new account_sid, auth_token
    @call = @client.account.calls.create(
    :from => from, # From your Twilio number
    :to => to, # To any number
    # Fetch instructions from this URL when the call connects
    :url => 'https://dl.dropboxusercontent.com/u/85088004/twilio/twilio.xml'
    ) 
end

这会产生一条消息:“我们很抱歉,但发生了系统错误”。问题在于挂断指令。我已经尝试过如上所述

<Response><Hangup/></Response> #without enclosing double or single quotes

Twilio::TwiML::Response.new do |r|
r.Hangup
end.text

两者都不会产生预期的挂断结果。

怎么了?

提前谢谢了!

4

2 回答 2

0

您应该在 twilio.com/user/account/debugger 上检查您的 Twilio 调试器。这将提供有关失败的更多信息。

于 2013-08-25T15:30:58.197 回答
0

绝对听从@Kevin 的建议,并与 Twilio 支持人员取得联系。但我想补充一条评论。在您的/callback操作结束时,最后一个值是@call您在创建调用时分配的变量,Ruby 将尝试将该值作为 HTTP 请求的结果返回。

Ruby 返回在方法结束时计算的最后一个值。在这种情况下,该值是 Sinatra 默认使用的响应 HTTP Get 请求的值。

从您拥有的文字字符串来看<Response><Hangup/></Response>,我猜您没有使用视图,并希望这是获取请求的结果。你应该把它放在你方法的最后,如下所示。我还添加了一个content_type只设置响应标头来表示响应是 XML 的。

get '/callback' do
    to = params['From']
    from = 'my Twilio number'
    # set up a client to talk to the Twilio REST API
    @client = Twilio::REST::Client.new account_sid, auth_token
    @call = @client.account.calls.create(
      :from => from, # From your Twilio number
      :to => to, # To any number
      # Fetch instructions from this URL when the call connects
      :url => 'https://dl.dropboxusercontent.com/u/85088004/twilio/twilio.xml') 
    #ruby returns the last value in a method:
    content_type 'text/xml'
    "<Response><Hangup/></Response>"
end

确保您也将 Twilio 语音回调设置为 Get 请求(默认为 post)。

我还删除了sleep 5您在其中的内容。我可以看到你要去哪里。使用hangupTwiML 响应,等待几秒钟,然后拨打新电话。可悲的是,Sinatra 并不是这样工作的。在方法结束之前,它不会响应 HTTP 请求。所以你只是让它坐下来等待 5 秒钟,没有任何理由。

这确实带来了一些问题,因为您告诉 Twilio 向您即将挂断的号码进行出站呼叫,因此您基本上有一个竞争条件。呼叫是先断开,还是出站开始响铃到占线号码。

有很多方法可以做到这一点,但我建议一个线程。这有点棘手,但是这个SO 答案很详细。

于 2013-08-27T09:49:46.937 回答