twilio,sinatra ruby​​ force hangup然后回调

时间:2013-08-25 08:49:03

标签: ruby sinatra twilio

我想打电话给我的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

两者都不会产生所需的挂断结果。

怎么了?

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

绝对符合@ Kevin的建议并与Twilio支持联系。但我想补充一点意见。在/callback操作结束时,最后一个值是您在创建调用时分配的@call变量,Ruby将尝试作为HTTP请求的结果返回此值。

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

根据你有<Response><Hangup/></Response>的文字字符串判断,我猜你没有使用视图,并期望这是get请求的结果。您应该将其置于方法的最后,如下所示。我还添加了一个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请求(默认为发布)。

我还删除了你在那里的sleep 5。我可以看到你要去哪里。回复hangup TwiML,等待几秒钟,然后拨打新电话。可悲的是,Sinatra并没有这么做。在方法结束之前,它不会响应HTTP请求。所以你只是让它静坐,等待5秒钟。

这确实会造成一些问题,因为你告诉Twilio要对你要挂断的号码进行出站呼叫,所以你基本上都有竞争条件。呼叫是先断开连接,还是出站开始振铃到忙音。

有很多方法可以做到这一点,但我建议一个帖子。这有点棘手,但SO answer详细介绍了这一点。