1

我想做以下事情:

  1. 用我的手机拨打我的 twilio 号码

  2. 我的 twilio 号码识别来电号码然后立即挂断

  3. 我的twilio号码回拨识别的号码(我的手机号码)

  4. 当我接电话时,twilio 要求我输入我想拨打的号码

  5. Twilio 收集我要呼叫的号码的输入并连接我。

所以我可以用我的手机拨打便宜的国际电话(或漫游电话)。

到目前为止,取自 twilio website api docs,我有:

require 'rubygems'
require 'sinatra'
require 'twilio-ruby'
get '/' do
account_sid = 'xxxxxxx'
auth_token = 'zzzzzzz'
to = params['From']
#to = '+447928344246'
#to = '441903773807'
from = '442033222327'
Twilio::TwiML::Response.new do |r|
r.Hangup 
end.text
# 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
:timeout => "20",
# Fetch instructions from this URL when the call connects
:url => 'https://dl.dropboxusercontent.com/u/85088004/twilio/twilio.xml'
)
end

post '/makecall' do
warn params.inspect
account_sid = ' ACaf2b951ae6f7424da036ea9dcd5b0d91'
auth_token = 'my token'
@client = Twilio::REST::Client.new account_sid, auth_token
call = @client.account.calls.create(:url => "https://dl.dropboxusercontent.com/u/85088004/twilio/callback.xml",
:to => params[:Digits],
:from => "+442033222327")
puts call.to
end

'/' 部分 url 文件中的 twilio.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="/makecall" method="POST">
<Say timeout="10">Enter the number you wish to call</Say>
</Gather>
</Response>

我收到“抱歉,出现应用程序错误”。然后它就挂断了。

warn params.inspect 

当我检查heroku日志时不会产生任何东西。所以我认为(其中一个)问题是我拨打的号码的参数没有通过。

逻辑或脚本是否还有其他显而易见的问题?

问题是否出在“/makecall”片段中的 url 上?它是:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
</Hangup>
</Response>

非常感谢!

4

2 回答 2

1

解决了!!感谢 T 布道者的帮助。这是解决方案:

require 'rubygems'
require 'sinatra'
require 'twilio-ruby'
account_sid = 'my sid'
auth_token = 'my token'

get '/' do
from = 'my T number'
to = params[:From]
Twilio::TwiML::Response.new do |r|
r.Hangup
end.text
sleep 10
# 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

# the xml file. It is VERY IMPORTANT that you have the absolute url in the action=""

<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather timeout="20" action="http://dry-journey-9071.herokuapp.com/makecall" method="GET">
<Say voice="alice">Enter the destination number, please.</Say>
</Gather>
<Say voice="alice">Input not received. Thank you</Say>
</Response>

#Back to the app:

get '/makecall' do
number = params[:Digits]
Twilio::TwiML::Response.new do |r|
r.Dial number ### Connect the caller to Koko, or your cell
r.Say 'The call failed or the remote party hung up. Goodbye.'
end.text
end

耶!

于 2013-08-16T15:14:31.437 回答
0

Twilio 开发人员布道者在这里。

当您检测到它是您自己的号码时,您想向 Twilio 返回一些 TwiML (XML),这应该足够了:<Response> <Hangup/> </Response>

然后,您需要对 Twilio 进行 REST API 调用,以便对自己进行新的出站调用:

@client.account.calls.create(to: my_number, from: "+sometiwilionumber", url: "http://example.com/make-other-call-twiml")

然后使用一些 TwiML 的 URL 到<Gather>您要拨打的号码,然后直接拨打<Dial>那个号码......

您要避免的事情是让 Twilio 在第一次通话结束之前给您回电。由于您需要先进行 API 调用,因此我们需要使用线程来绕过它。我对 Ruby/Sinatra 还不错,但我不是这里的线程专家,但这应该可行:

twilio_call_thread = Thread.new{
    sleep 3 #3 Seconds should be plenty, but you may want to experiment.
    @client.account.calls.create(to: mynumber, from: some_twilio_number, url: "http://example.com/gather-and-dial")
}
#Then return the TwiML to hangup...
"<Response><Hangup/></Response>"

您拨打您的号码,它会创建一个线程,然后进入睡眠状态。它以 a 响应<Hangup>以断开呼叫。几秒钟后,线程被唤醒,你会得到返回调用。您将需要在该呼叫中使用一些 TwiML<Gather>来获取要拨打的电话号码,然后<Dial>进行实际呼叫。

我不确定线程​​,所以在检查之前,我有两个可以使用的其他想法:

使用短信。向您发送您要拨打的其他号码的 Twilio 号码,然后让 Twilio 直接在您的号码和其他号码之间拨打电话。

其次,只需使用 URL,假设您的手机上有数据,您可以打开一个 URL,无需初始呼叫或 SMS 即可。

哦 - 第三个选项,如果您不想搞乱线程,或者这对您不起作用:在您的 Twilio 号码上设置状态回调 URL(单击“可选语音设置”)。这会在调用完成后触发,然后您可以从那里对自己进行新调用。

希望你能把它整理好,它会很棒。

于 2013-08-12T13:20:38.803 回答