繁体   English   中英

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

[英]How to retrieve information from outbound Twilio call with Python?

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

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

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

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

您可能已经看过有关在入站呼叫中通过 Python中的键盘收集用户输入的文档

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

当您进行出站呼叫时,您使用 REST API 发起呼叫,然后当呼叫连接时,Twilio 会向您的 URL 发出 Webhook 请求。 然后,您可以使用 TwiML 进行响应以告诉 Twilio 要做什么,并且您也可以在此阶段使用<Gather>进行响应。

让我们从出站呼叫中收集输入, 如本文档中所示

首先,您购买 Twilio 电话号码并使用Ngrok URL 对其进行配置:这是一个方便的工具,可通过公共 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的 URL 返回 TwiML,其中包含有关用户接听电话时应该发生的情况的说明。 让我们创建一个 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动词的键盘接收用户输入,该动词用于在电话通话期间收集数字或转录语音。 Action 属性将绝对或相对 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)

如果收件人没有选择选项,让我们将它们循环回到开头,以便他们再次听到方向。

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

但是,如果他们确实选择了一个选项并在键盘中输入了一个数字,Twilio 将使用他们输入的数字向托管您的 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. 我一直在关注流媒体过程,以便通过此链接( https://github.com/twilio/media-streams/tree/master/python/realtime-transcriptions )在我的网络套接字(烧瓶套接字)中收到用户响应)。 在这里,我面临一个问题,即我应该何时考虑用户已停止说话并暂停以等待 twilio 响应。
  2. 如果我使用带有input=speech twiml gather并获取您在回答中提到的request.values ,则需要给出 2 秒的间隔来识别用户已停止说话并等待 twilio 响应。 问题在于,只有在这 2 秒后,系统才能开始处理来自用户的响应。 我相信这是一个非常延迟的响应。

这是我应该从上面选择的建议选项,以便在 twilio 和用户之间进行接近正常的对话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM