#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 о предыдущем ответе, и если в нем указано «печать», тогда вы можете перейти. Я рекомендую вам самостоятельно выполнить руководство, чтобы увидеть, как все это работает.