通过出站呼叫收集用户的 DTMF 输入

问题描述 投票:0回答:2

我有一个非常简单的问题,关于通过向用户拨打的出站电话收集 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-api twilio-twiml twilio-programmable-voice
2个回答
0
投票

这里是 Twilio 开发者布道者。

通过 Twilio 与电话交互的方式有很多种,但是当您尝试通过

<Gather>
获取用户输入时,所有这些方式都需要 Twilio 能够通知您用户按下的数字。由于这是一个异步操作,因此执行此操作的基本方法是通过 Webhook(HTTP 请求)发送到您控制的 Web 应用程序。

如果您不想自己托管响应 webhook 的应用程序,您可以使用 Twilio Studio(用于通信流的拖放编辑器)或使用 Twilio Functions(无服务器环境)来实现此流程您可以在其中使用 JavaScript 函数响应传入的 HTTP 请求。


0
投票

我也有同样的问题。首先,正如之前所回答的,语音通话是异步的,拨打电话时您不能再做任何事情。您需要定义一个 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 作为对初始请求的响应发送,并且呼叫完成。

© www.soinside.com 2019 - 2024. All rights reserved.