API Twilio на Python для WhatsApp не работает с операторами условного потока на основе ответов

#python #twilio

#python #twilio

Вопрос:

Я экспериментирую с API Twilio для WhatsApp с помощью Python, но условный поток не работает. Когда я ввожу слово «office» после получения ответа «Что бы вы хотели распечатать?», я не получаю ожидаемого ответа «Открытие …». Мне потребуется некоторая помощь в этом отношении.

 from twilio.rest import Client
from flask import Flask, request, redirect
from twilio.twiml.messaging_response import MessagingResponse

app = Flask(__name__)
@app.route("/", methods=['GET', 'POST'])
def wa_print():
    """Respond to incoming messages with a simple text message."""
    question = request.values.get('Body')
    print(question)
    # Start our TwiML response
    resp = MessagingResponse()
    if (question == 'print'):
        resp.message('What would you like to print?')
        doc = request.values.get('Body')

        if (doc == 'office'):
            resp.message('Opening...')

    return str(resp)


if __name__ == "__main__":
    app.run()
  

Ответ №1:

Евангелист-разработчик Twilio здесь.

Каждый раз, когда пользователь отправляет сообщение на ваш номер WhatsApp, вы получите новый запрос на конечную точку webhook. Новый ответ будет содержать новое сообщение пользователя в Body параметре.

В вашем примере кода вы всегда работаете с одним ответом, поэтому переменные question и doc одинаковы.

 def wa_print():
    """Respond to incoming messages with a simple text message."""
    question = request.values.get('Body')
    print(question)
    # Start our TwiML response
    resp = MessagingResponse()
    if (question == 'print'):
        resp.message('What would you like to print?')
        doc = request.values.get('Body')

        if (doc == 'office'):
            resp.message('Opening...')

    return str(resp)
  

Вместо того, чтобы вкладывать свои условные выражения, вы можете сгладить их следующим образом:

 def wa_print():
    """Respond to incoming messages with a simple text message."""
    question = request.values.get('Body')
    print(question)
    # Start our TwiML response
    resp = MessagingResponse()
    if (question == 'print'):
        resp.message('What would you like to print?')

    elif (question == 'office'):
        resp.message('Opening...')

    return str(resp)
  

С помощью приведенного выше кода, если кто-то отправит сообщение «печать», ваше приложение ответит «Что бы вы хотели распечатать?», А если они отправят сообщение «office», приложение ответит «Открытие …».

Если вы хотите больше контролировать разговор, вы можете сохранить состояние в HTTP cookies. Я рекомендую проверить эту статью о создании SMS-переписки на Python, чтобы узнать об этом более подробно.

Дайте мне знать, если это вообще поможет.

Комментарии:

1. Да, пожалуйста, взгляните на учебник, на который я ссылался, по SMS-разговорам на Python (в данном случае SMS и WhatsApp — это один и тот же API).

2. Пробуя ваше решение, я получаю следующую ошибку: UnboundLocalError: локальная переменная ‘doc’, на которую ссылаются перед назначением. Как я могу это решить?

3. Ах, моя ошибка, этого не должно быть doc в этот момент. Это действительно просто question . Я обновил код в своем ответе.

4. Значит, нет способа получить два разных ответа и обработать их отдельно?

5. Все ответы на ваш номер WhatsApp вызовут запрос webhook к вашей конечной точке. Вы можете обрабатывать ответы по-разному, сохраняя данные в файлах cookie, как в руководстве, на которое я ссылался. Таким образом, вы можете получить первый ответ «печать» и сохранить что-то, что сообщает вам, что пользователь в последний раз сказал «печать». Затем в следующем ответе вы можете проверить, есть ли что-нибудь в файлах cookie о предыдущем ответе, и если в нем указано «печать», тогда вы можете перейти. Я рекомендую вам самостоятельно выполнить руководство, чтобы увидеть, как все это работает.