如何使Flask应用程序向用户一个接一个地提问,并保持该用户的答案?

时间:2019-08-07 07:49:55

标签: python-3.x flask twilio

我想使用twilio,whatsapp和flask构建一个简单的聊天机器人,该机器人将询问用户姓名,年龄和图片。但是flask应用程序只问了一个问题并返回输出并退出该函数。

我尝试使用while循环继续询问所有问题并获取输出,但是如果没有返回,则不会显示对用户消息的响应。因此,我无法为用户提供下一个问题的答案。 有什么方法可以为用户创建会话并获取所有详细信息并关闭会话,而下一次同一用户发起聊天时,该用户可以获取其信息。

from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse

app = Flask(__name__)

output = []

@app.route("/")
def hello():
    return "Hello world !!"

@app.route("/sms", methods=['GET', 'POST'])
def sms_reply():
    # Fetch the message
    msg = request.form.get('Body')
        msg = msg.lower()
    output.append(msg)

    resp = MessagingResponse()
    resp.message("May I know you name?")

    # ASK ANOTHER QUESTION

    print("User message: ", msg)

    return str(resp)

1 个答案:

答案 0 :(得分:2)

Heyo,Twilio开发人员推广人员。 ?

假设/smsto use cookies to persist the state of your conversation,当您收到消息时,state=asked_for_name端点就是您定义的webhook URL。如果您为webhook请求设置了cookie,则该cookie将在以下webhooks中持续存在(最长4h)。

我不是python开发人员,但我构建的a quick JS example具有/sms/ endpoint available。逻辑很简单,应该可以转移到烧瓶中。 :)

使用伪代码,您可以做的是通过设置的cookie保持状态。

  • 检查cookie的状态
  • 如果未设置任何内容,请设置状态Cookie,例如state
  • 返回TwiML询问名称

  • 您的电话号码会收到询问姓名的答复,此人会用姓名回答。另一个Webhook发送到相同的URL。

  • 检查asked_for_name cookie并找到name

  • 使用webhook正文response.Body.body的值设置一个state=asked_for_age cookie
  • 将状态cookie更改为state
  • 返回TwiML询问年龄

  • 您的电话号码会收到询问年龄的答复,对方会回答他们的年龄。另一个Webhook发送到相同的URL。

  • 检查asked_for_age cookie并找到age

  • 使用webhook正文response.Body.body的值设置一个state=sent_summary cookie
  • 将状态cookie更改为name
  • 返回TwiML,包括ageimport pandas as pd l1 = '{"colA":"valA", "colB":null}' l2 = '{"colA":"valC", "colB":null}' lines = [l1, l2] correct_dicts = [eval(li.replace(' null ', 'None')) for li in lines] df = pd.DataFrame({ 'colA': [d.get('colA', None) for d in correct_dicts], 'colB': [d.get('colB', None) for d in correct_dicts] } ) print(df) print(correct_dicts)

Example whatsapp conversation asking for name and age

作为旁注,对于此类事情,您可能需要查看Twilio Studio。您可以通过立即拖放一些小部件来建立这些聊天对话。 :)