同一父响应标记下的多个Gather标记

时间:2017-11-07 17:10:50

标签: python api twilio ivr

继续 the question I had raised before,我遇到了另一个问题。我花了很多时间尝试各种组合来解决问题,但我没有提出任何问题。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say>Hello Monkey</Say>
    <Gather action="/user-A-input" method="POST">
        <Say>Please press the input A.</Say>
    </Gather>
    <Gather action="/user-B-input" method="POST">
        <Say>Please press the input B.</Say>
    </Gather>
</Response> 

但是,当我尝试输入输入A时,它会立即挂断,并且不会执行输入B聚集部分。据我所搜索,没有任何其他人正在使用这个相同逻辑的文档。

这是我的代码的Route.py中用户A输入和用户B输入的样子:

@app.route("/user-A-input", methods=['GET', 'POST'])
def UserAInput():
    """Handle key press from a user."""
    # Get the digit pressed by the user
    #The below logs are not printed, so somehow this method isn't called
    logger.debug('before considering user input A')
    strA = request.values.get('Digits', None)
    logger.debug('In side A| A:' + strA)
    resp = VoiceResponse()
    return str(resp) #Something feels wrong here

@app.route("/user-B-input", methods=['GET', 'POST'])
def UserBInput():
    """Handle key press from a user."""
    # Get the digit pressed by the user
    #The below logs are not printed, so somehow this method isn't called
    logger.debug('before considering user input B')
    strB = request.values.get('Digits', None)
    logger.debug('In side B| B:' + strB)
    resp = VoiceResponse()
    return str(resp) #Something feels wrong here

我真的很感激,如果有人能帮助我理解我在这里搞砸了什么。可能它与回归有关,但我不确定。或者可能是问题的解决方法。我计划使用输入A和B并进行API调用以获取数据并将其反馈给用户。

2 个答案:

答案 0 :(得分:0)

Twilio开发者传道者在这里。

您不能在同一回复中使用两个<Gather>标记。但是,您可以通过一些更改来获得所需的结果。

让我解释一下先发生的事情。当Twilio在某些TwiML中达到<Gather>时,它会等待收集用户的响应,然后将响应提交到action URL并将呼叫定向到该URL。在一个动作<Gather>之后,任何事情都将被发现。

要做的是从您的<Gather>返回第二个/user-A-input

这样的事情:

First TwiML

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say>Hello Monkey</Say>
    <Gather action="/user-A-input" method="POST">
        <Say>Please press the input A.</Say>
    </Gather>
</Response>

用户A输入

@app.route("/user-A-input", methods=['GET', 'POST'])
def UserAInput():
    """Handle key press from a user."""
    logger.debug('before considering user input A')
    strA = request.values.get('Digits', None)
    logger.debug('In side A| A:' + strA)
    resp = VoiceResponse()
    gather = Gather(action='/user-B-input')
    gather.say('Please press the input B.')
    resp.append(gather)
    return str(resp)

然后用户B输入应该可以正常工作。

最后一点,您目前依赖于<Gather>的默认超时,这意味着在用户停止输入5秒或按下{{1}后将提交Digits钥匙。如果您需要一定数量的输入,可以使用numDigits attribute of <Gather>。您还可以使用finishOnKey attribute设置其他完成键。

如果有帮助,请告诉我。

答案 1 :(得分:0)

虽然我无法提出道德和正确的解决方案,但我仍然想办法通过放置用户A输入,用户B输入和API调用请求(一个)的逻辑来解决问题。在用户A输入法中我需要A和B输入。在接收输入A的末尾,我将调用重定向到main方法(“/”),而main方法再次调用user-A-input,但是有一些标志帮助我跳过输入A部分并直接进入输入B部分,我确保我在正确的变量中记录它,然后将输入A和B传递给另一个API以获得响应。它可能听起来有点模糊和复杂,但如果你检查my git repo,你肯定会明白。我希望有一个更好的解决方案。