我有一个非常简单的问题,关于通过向用户拨打的出站电话收集 DTMF 输入。我在下面描述要求。
主要要求 我有一个 python 脚本,可以对特定号码进行出站呼叫。此人接听电话。我通过配置的 twiml 向他们说出信息。该人听到该信息并按下手机上的按键。我想捕获该按键输入并使用我的脚本将其打印为输出。
问题 我可以使用此处描述的 client.calls.create 方法进行出站呼叫。 https://www.twilio.com/docs/voice/tutorials/how-to-make-outbound-phone-calls-python 但我无法收集数字。我在网上看到的示例描述了如何通过正在运行的 Web 应用程序来收集输入。我没有使用这种方法。 我希望通过一个简单的脚本来完成此任务。我通过脚本从 Twilio 号码发起拨出呼叫。我不打算在这里使用任何网络应用程序或网络钩子。
我将代码放在下面,该代码在拨打电话并向用户复述选项之前一直有效。
我怎样才能完成这件事?这可能吗?非常感谢。
import os
from twilio.rest import Client
from twilio.twiml.voice_response import Gather, VoiceResponse, Say
account_sid = os.environ['TWILIO_ACCOUNT_SID']='XXXXX'
auth_token = os.environ['TWILIO_AUTH_TOKEN']='YYYYY'
client = Client(account_sid, auth_token)
call = client.calls.create(
twiml='<?xml version="1.0" encoding="UTF-8"?><Response><Gather input="dtmf" timeout="5" numDigits="1"><Say>Please press 1 for sales</Say></Gather></Response>',
to='Destination_Number',
from_='My_Twilio_Number'
)
#TODO - How to Gather Digits from the user????
这里是 Twilio 开发者布道者。
通过 Twilio 与电话交互的方式有很多种,但是当您尝试通过
<Gather>
获取用户输入时,所有这些方式都需要 Twilio 能够通知您用户按下的数字。由于这是一个异步操作,因此执行此操作的基本方法是通过 Webhook(HTTP 请求)发送到您控制的 Web 应用程序。
如果您不想自己托管响应 webhook 的应用程序,您可以使用 Twilio Studio(用于通信流的拖放编辑器)或使用 Twilio Functions(无服务器环境)来实现此流程您可以在其中使用 JavaScript 函数响应传入的 HTTP 请求。
我也有同样的问题。首先,正如之前所回答的,语音通话是异步的,拨打电话时您不能再做任何事情。您需要定义一个 Webhook:一个 URL,它将引导 Twillio 到一段可以管理调用的代码。
在我的测试中,这就是我所做的。首先,我对 TwiML 代码做了一些更改:
twiml='<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather input="dtmf" timeout="5" numDigits="1"
action="<url_to_your_code_absolute_or_relative>/myvoicewebhook" method="POST">
<Say>Please press 1 for sales</Say>
</Gather>
</Response>',
此处使用的 URL 可以是绝对的,也可以是相对于这段代码所在位置的。
此后,您必须创建充当 Webhook 的代码。在路线文件中,您将看到如下内容:
router.post('/myvoicewebhook', controller.myVoiceWebhookMethod);
这里重要的是您使用之前在 TwiML 代码中使用的相同 HTTP 方法来定义它。
最后你的代码将是这样的:
controller.myVoiceWebhookMethod = (request, response) => {
const twiml = new VoiceResponse();
switch (request.body.Digits) {
case 1:
twiml.say("You have pushed button 1");
break;
....
default:
twiml.say("I didn't understand you");
break;
}
response.type('xml');
response.send(twiml.toString());
return;
};
当用户单击数字面板时,您将获得请求中包含的正文的
Digits
属性中的数字。您需要将其添加到您的 app.js
文件中才能更轻松地访问此属性
const urlencoded = require('body-parser').urlencoded;
[...]
const express = require('express');
app.use(urlencoded({extended: false}));
[...]
当用户听到要求按键的消息,并且用户单击某个数字时,Twillio 会将其重定向到代码初始 TwiML 部分定义的
action
URL。然后,此操作会检索用户在 Digits
属性中单击的数字。请注意开头的大写字母,它必须是大写的,否则您将引用未知的属性。当您将您希望用户知道的内容添加到 TwiML 响应后,您最终会将此 TwiML 作为对初始请求的响应发送,并且呼叫完成。