如何使用 Python 从出站 Twilio 调用中检索信息?

How to retrieve information from outbound Twilio call with Python?

我是 Twilio 的新手,我正在尝试弄清楚如何从我使用 Python 成功进行的出站呼叫中检索数据 3. 我希望能够检索诸如按下什么按钮之类的内容来自收件人。

稍微阅读了 Twilio 文档(然后有点迷茫)后,我想我理解了 Twilio 的工作原理以及为什么我无法从 phone 调用中检索数据。我认为 Python 程序只是建立了从 Twilio 到 phone 数字的连接。收件人可以拨打任何号码,我可以使用标签获取一些信息。但是我如何将该信息定向到我的 Python 程序?我的想法是让 Twilio(以某种方式)将信息发送回我的 Python 程序,然后我可以采取行动(比如更新数据库)。

我猜测 Twilio 会将数据扔到其他地方,然后我的 Python 程序可以去那里检索,但我不知道在哪里可以学习该技能。我有 Python 3 的基础知识,但对 Web 开发了解不多。只是一些基本的 HTML5 和 CSS3.

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

您可能在呼入电话中看到过这个 documentation on gathering user input via keypad in Python

当您接到呼入电话时,Twilio 会发出 webhook 请求以了解下一步要做什么,然后您会使用 TwiML 进行响应,例如,当您想要获取信息时 <Gather>

当您拨打出站电话时,您 initiate the call with the REST API 然后当电话接通时,Twilio 向您的 URL 发出网络钩子请求。然后您可以使用 TwiML 进行响应以告诉 Twilio 要做什么,您也可以在此阶段使用 <Gather> 进行响应。

让我们收集来自 outbound call as shown in this documentation 的输入。

首先,您购买一个 Twilio phone 号码并使用 Ngrok 配置它 URL:这是一个方便的工具,可以通过 public URL。当你打出电话时,你传递给它 URL: your-ngrok-url.ngrok.io/voice

from twilio.rest import Client
account_sid = 'your-account-sid'
auth_token = 'your-auth-token'
client = Client(account_sid, auth_token)

call = client.calls.create(
    url='https://your-ngrok-url.ngrok.io/voice',
    to='phone-number-to-call',
    from_='your-twilio-number'
)

client.calls.create returns TwiML 中的 URL 说明了当用户接听 phone 呼叫时应该发生什么。让我们创建一个 Flask 应用程序,其中包含在用户接听电话时 运行 的代码。

from flask import Flask, request
from twilio.twiml.voice_response import VoiceResponse, Gather

app = Flask(__name__)

@app.route("/voice", methods=['GET', 'POST'])
def voice():
    # Start a TwiML response
    resp = VoiceResponse()

您将通过带有 TwiML 的键盘接收用户输入 Gather verb which is used to collect digits or transcribe speech during a phone call. The Action attribute 采用绝对值或相对值 URL 作为 Twilio 在调用者完成输入数字(或超时)后发出 HTTP 请求的值到达了)。该请求包括用户的数据和 Twilio 的标准请求参数。

如果您从呼叫者那里收集数字,Twilio 会包含 Digits 参数,其中包含呼叫者输入的数字。

    gather = Gather(num_digits=1, action='/gather')
    gather.say('For sales, press 1. For support, press 2.')
    resp.append(gather)

如果收件人没有select选项,让他们循环回到开头,以便他们可以再次听到指示。

    resp.redirect('/voice')
    return str(resp)

但是,如果他们执行 select 一个选项并在键盘中键入一个数字,Twilio 将向 URL 托管您的 TwiML 的 URL 发送一个 POST 请求,其中包含他们提供的数字键入。这就是您如何通过按下按钮从收件人那里获得用户输入并将其定向回您的 Python 程序:使用 request.values['Digits']。基于该值(在 choice 变量中,您可以相应地更新数据库或其他内容,如下面的条件所示。

@app.route('/gather', methods=['GET', 'POST'])
def gather():
    """Processes results from the <Gather> prompt in /voice"""
    # Start TwiML response
    resp = VoiceResponse()

    # If Twilio's request to our app included already gathered digits,
    # process them
    if 'Digits' in request.values:
        # Get which digit the caller chose
        choice = request.values['Digits']

        # <Say> a different message depending on the caller's choice
        if choice == '1':
            resp.say('You selected sales. Good for you!')
            return str(resp)
        elif choice == '2':
            resp.say('You need support. We will help!')
            return str(resp)
        else:
            # If the caller didn't choose 1 or 2, apologize and ask them again
            resp.say("Sorry, I don't understand that choice.")

    # If the user didn't choose 1 or 2 (or anything), send them back to /voice
    resp.redirect('/voice')

    return str(resp)

希望对您有所帮助!

@lizziepika - 出色的指导 - 非常感谢!

我正在尝试做一个实时转录系统,该系统在 twilio 号码和用户之间的 twilio 对话中使用语音到文本和文本到语音。

  1. 我一直在关注流媒体流程,以便接收用户 在我的网络套接字(烧瓶套接字)中响应 link (https://github.com/twilio/media-streams/tree/master/python/realtime-transcriptions)。在这里,我面临一个问题,即我什么时候应该考虑用户有 停止说话并暂停让 twilio 回应。
  2. 如果我将 twiml gatherinput=speech 一起使用并得到 request.values 正如你提到的 在你的回答中,那么需要给出 2 秒的间隔 确定用户已停止说话并等待 twilio 回复。问题是,只有在这 2 秒之后 系统可以开始处理来自用户的响应。这是一个 我相信很多延迟的反应。

我应该从上面选择哪个建议选项,以便它在 twilio 和用户之间提供接近正常的对话。