用Twilio打电话给某人然后断开我并向其他人播放消息

时间:2017-07-27 20:48:32

标签: twilio

我正在尝试在网页上(在我的预设PHP网络服务器上)创建一个按钮,该按钮应该连接我(可以通过我的手机或通过网络客户端),然后拨打一个号码,然后我想要选择挂断电话,或者只是断开我,但是给另一个人播放mp3,然后挂机。

我不确定该怎么做。我创建了一个TwiML,但是如何将其连接到现有的调用?或者有不同的方法吗?

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Play>https://something-something.twil.io/assets/recording1.mp3</Play>
  <Hangup/>
</Response>

提前致谢。

2 个答案:

答案 0 :(得分:2)

Twilio开发者传道者在这里。

这是Answering Machine Detection的理想用例。使用Twilio的应答机检测,您可以将其设置为EnabledDetectMessageEnd,这意味着您可以使用Twilio来确定机器是否已应答呼叫并等待消息结束然后发挥消息。否则,您可以将呼叫连接到自己。

使用PHP,您可以生成如下调用:

use Twilio\Rest\Client;

// Your Account Sid and Auth Token from twilio.com/console
$sid = "YOUR_ACCOUNT_SID";
$token = "YOUR_AUTH_TOKEN";
$client = new Client($sid, $token);

$call = $client->calls->create(
    "+14155551212", "+14158675309",
    array(
      "url" => "http://example.com/calls",
      "MachineDetection" => "DetectMessageEnd"
    )
);

然后,对于您的URL,您需要根据计算机检测到的内容来响应呼叫。您可以使用AnsweredBy parameter执行此操作。这样的话,dials如果某人在机器应答时使用<Say>回复或说出消息,则Twilio Client JS为您的号码:

<?php
  if ($_REQUEST['AnsweredBy'] == "human") {
    echo "<Response><Dial><Number>YOUR_NUMBER</Number></Dial></Response>";
  } else {
    echo "<Response><Say>Hello, this is my message</Say></Response>";
  }

让我知道这是否有帮助。

修改

无应答机检测

好的,要在没有应答机器检测的情况下执行此操作,我建议您使用quickstart guide here构建自己的拨号器。有一个Twilio.Device.activeConnection().disconnect(),所以我不知道如何在这里工作。

有了拨号器,您就可以用它来发起电话了。问题是然后移动语音邮件呼叫以播放消息。我会建立两个按钮,一个挂起,好像你已经成功完成了通话而另一个按钮播放了消息。第一个按钮是对use the REST API to get the other call的简单函数调用。

第二个需要一些东西。我们的想法是,它会调用您的服务器将另一个调用重定向到一组新的TwiML。

首先,您需要您创建的呼叫的SID。您可以从响应调用connect的接收对象中获取该内容。

var connection = Twilio.Device.connect({ number: "+1234567890" });
var callSid = connection.parameters.CallSid;

当您想要挂断并播放消息时,您需要将其发送到您的服务器。这是父母呼叫的SID,你需要接听子呼叫,另一条腿。因此,在您的服务器上,您需要redirect it,然后<Say>

use Twilio\Rest\Client;

// Your Account Sid and Auth Token from twilio.com/console
$sid = "YOUR_ACCOUNT_SID";
$token = "YOUR_AUTH_TOKEN";
$client = new Client($sid, $token);

$calls = $client->calls->read(
    array("ParentCallSid" => $_REQUEST['CallSid'])
);
// Loop over the list of calls, it should only have one call in it, and redirect the call to a URL that has the message TwiML
foreach ($calls as $call) {
    $call->update(array(
        "url" => "http://example.com/message.xml"
    ));
}

当您重定向子呼叫时,将不再连接父呼叫,因此它将挂断。您重定向子呼叫的URL应包含使用<Play>或{{3}}向计算机播放消息所需的TwiML。

答案 1 :(得分:1)

我想我得到了你想做的事。您有一个您要拨打电话的人员列表。该应用程序将呼叫他们并连接您。如果您听到应答机,则需要按一个键然后挂断并继续拨打下一个电话。但挂机后,第一个外拨电话保持在线状态并向该收件人留下.mp3消息?

我相信一个解决方案是用机器人创建一个会议。

您的应用会向您,机器人和收件人拨打电话,并将所有人都放入名为“room-timestamp”的会议室,其中时间戳是当前时间。机器人是一个twilio数字,听取收集dtmf。如果按1,它将播放消息1然后挂断。但是因为这是一个会议,你可以随时挂机并继续下一个电话。 机器人可以循环几次,如果没有检测到dtmf,它会自行挂起。 使用新的出站会议API可以更轻松地完成此操作,您可以在其中传递会议名称而不是会议SID:

https://www.twilio.com/docs/api/rest/participant#list-post

编辑:

将三个号码连接到会议室:

$uniqueid = time();
$call = $client->account->calls->create($officeline,$twilionum,

array(“url”=&gt;“http://yourdomain/conference.php?id= $ uniqueid”));

$call = $client->account->calls->create($botline,$twilionum,

array(“url”=&gt;“http://yourdomain/conference.php?id= $ uniqueid”));

$call = $client->account->calls->create($customerline,$twilionum,

array(“url”=&gt;“http://yourdomain/conference.php?id= $ uniqueid”));

这会将三个号码连接到会议室:

  • $ officeline(您的号码),
  • $ botline(响应dtmf的机器人的twilio phone#)
  • $ customerline(您正在致电的客户)

conference.php只返回呼叫连接到的会议ID:

header('Content-Type: text/xml');

$confid = $_REQUEST['id'];
echo<<<XMLOUT
<?xml version="1.0" encoding="ISO-8859-1"?>

<Response>
<Dial>
<Conference statusCallbackEvent="leave" statusCallback="killconference.php">$confid</Conference>
</Dial>
</Response>

XMLOUT;

调用killconference.php,以便在只剩下一个人时终止会议。只需确保你的机器人在玩完东西后挂机。

killconference.php

 $theconference = $_REQUEST['ConferenceSid'];

 $participants = $client
    ->conferences($theconference)
    ->participants
    ->read();


 if (count($participants) == 1) {

   $conference = $client
    ->conferences($theconference)
    ->fetch();

   $conference->update(array(
        "Status" => "completed"
    ));

 }

你的botline twilio号码将指向响应dtmf的bot.php:

bot.php

   header('Content-Type: text/xml');

   $dtmf = isset($_REQUEST["Digits"]) ? $_REQUEST["Digits"] : "";
   $playmore = "";
   if ($dtmf == "1") {
       $playmore = "<Say>Hey I just wanted to leave you a message </Say><Hangup/>\n";
   }
   if ($dtmf == "2") {
       $playmore = "<Play>http://www.soundboard.com/mediafiles/22/224470-33a9f640-d998-45a3-b0c1-31c1687c2ae4.mp3</Play><Hangup/>\n";
   }


echo<<<XMLOUT
<?xml version="1.0" encoding="ISO-8859-1"?>
<Response>

$playmore
<Gather action="bot.php" numDigits="1" timeout="30">
</Gather>
<Hangup/>

</Response>

XMLOUT;

机器人将在线上停留30秒,如果没有输入dtmf,它会自行挂起。按1给客户留言2,Leroy Jenkins