2013-08-25 51 views
0

我想打電話給我的Twilio號碼,立即掛斷,然後回電話給我。這與我以前的一個問題類似(但不完全相同)。twilio,sinatra ruby​​強制掛斷,然後回撥

問題在於迫使Twilio掛斷。

的Ruby代碼是:

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 

既不產生掛機的期望的結果。

怎麼了?

非常感謝提前!

回答

0

肯定會與@凱文的建議,並與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。我可以看到你要去哪裏。回覆TwiML hangup,等待幾秒鐘,然後撥打新電話。可悲的是,Sinatra並沒有這樣工作。直到方法結束,它纔會響應HTTP請求。所以你只要坐下來等5秒就沒有任何理由。

這確實會引起一些問題,因爲您告訴Twilio對您要掛斷的號碼進行呼出呼叫,因此您基本上有競爭狀態。呼叫是否首先斷開,或出站是否開始響鈴到繁忙的號碼。

有很多方法可以做到這一點,但我會建議一個線程。這有點棘手,但這SO answer進入一些細節。

+0

非常感謝,我感謝你的深思熟慮的答案。我會給它一個鏡頭,讓你知道。我已經知道需要將我的Twilio url設置爲「get」,這可能是一個真正的「陷阱」,但是要感謝您的注意。凱文,謝謝! – user1903663

+0

謝謝xmjw,它工作的很棒。我不能讓我的頭腦發現,掛斷xml出現後,它應該叫我回來,而不是之前!爲什麼是這樣? – user1903663

+0

這是因爲缺乏併發性。您有一個接收HTTP GET請求的單線程,對Twilio的REST API執行另一個HTTP調用,然後將一些TwiML寫回到原始GET請求的響應流中。所以它不會寫響應數據,直到它從Twilio的REST API獲得一個回覆,說明出站呼叫已經啓動。一切都在順序發生。 – xmjw

0

你應該在twilio.com/user/account/debugger檢查你的Twilio調試器。這將提供有關失敗的更多信息。

+0

謝謝,我做了,但我無法將信息與解決方案聯繫起來。我將在這裏發佈調試。在你看來,代碼是否正確? – user1903663

+0

這很難說。調試器是否報告無法訪問您的服務器?它是否報告TwiML無效? –

+0

謝謝,它可能是「文檔分析失敗」或「http檢索錯誤」。我相信問題是強制掛斷,但我不確定正確的代碼是什麼。 – user1903663