Files
Agendamento-Servicos-V1/Main_Receiver-Twilio01.py

261 lines
9.3 KiB
Python

import os
from flask import Flask, request, jsonify
from twilio.rest import Client
from twilio.twiml.messaging_response import MessagingResponse
from dotenv import load_dotenv
from datetime import datetime
###
from BD_manager_Mysql import inserir_acompanhamento, buscar_ultimo_chat, atualizar_acompanhamento, inserir_evento, listar_agenda, atualizar_agenda
###
load_dotenv()
app = Flask(__name__)
# Credenciais
ACCOUNT_SID = os.getenv("TWILIO_ACCOUNT_SID")
AUTH_TOKEN = os.getenv("TWILIO_AUTH_TOKEN")
TWILIO_WHATSAPP_NUMBER = os.getenv("TWILIO_WHATSAPP_NUMBER")
client = Client(ACCOUNT_SID, AUTH_TOKEN)
#Funções de fluxo
def MostrarPeriodos(chat_id, name, status):
#
if(status == "10" or status == "null"):
inserir_acompanhamento(chat_id, "2", name)
else:
atualizar_acompanhamento(chat_id, "status", "2")
resposta = f"Qual periodo você gostaria de agendar ?\n1-Manhã\n2-Tarde\n3-Noite"
return resposta
def MostrarHorarios(texto_recebido, chat_id):
print("Entrou na função de consultar os horarios")
z = ""
try:
if(texto_recebido == "1"):
horarios = listar_agenda("periodo","manhã")
resposta = horarios
for horario in horarios:
z = z + str(horario['id'])+" - "+horario['data'].strftime("%d/%m/%Y")+" as "+str(horario['horario'])+"\n"
resposta = f"Qual horario você gostaria de agendar ?\n"+z+"\n0 - Voltar"
atualizar_acompanhamento(chat_id, "status", "3")
return resposta
elif(texto_recebido == "2"):
horarios = listar_agenda("periodo","tarde")
resposta = horarios
for horario in horarios:
z = z + str(horario['id'])+" - "+horario['data'].strftime("%d/%m/%Y")+" as "+str(horario['horario'])+"\n"
resposta = f"Qual horario você gostaria de agendar ?\n"+z+"\n0 - Voltar"
atualizar_acompanhamento(chat_id, "status", "3")
return resposta
elif(texto_recebido == "3"):
horarios = listar_agenda("periodo","noite")
resposta = horarios
for horario in horarios:
z = z + str(horario['id'])+" - "+horario['data'].strftime("%d/%m/%Y")+" as "+str(horario['horario'])+"\n"
resposta = f"Qual horario você gostaria de agendar ?\n"+z+"\n0 - Voltar"
atualizar_acompanhamento(chat_id, "status", "3")
return resposta
else:
resposta = "Opção inválida, por favor digite um periodo válido\n1 - manhã\n2 - tarde\n3 - noite"
return resposta
except ValueError:
resposta = f"Você não digitou uma opção válida"
return resposta
###############
# ==========================
# WEBHOOK (receber mensagem)
# ==========================
@app.route("/webhook", methods=["POST"])
def webhook():
texto_recebido = request.form.get("Body", "").strip().lower()
name = request.form.get("ProfileName")
sender = request.form.get("From")
print(f"Mensagem recebida de {name}: {sender}: {texto_recebido}")
chat_id = sender
response = MessagingResponse()
resposta = response.message()
print(f"Mensagem recebida de {chat_id}: {texto_recebido}")
# Remove sufixo "@c.us" do número
#numero_remetente = numero_remetente.replace("@c.us", "")
chat_id = chat_id.replace("@c.us", "")
try:
status = buscar_ultimo_chat(chat_id)['status']
except:
status = "null"
print("Status: ", status)
#Começo do atendimento (Fluxo iniciado)
'''if(texto_recebido.lower() == "oi" or texto_recebido.lower() == "sim"):
resposta = f"Olá! você gostaria de agendar um horário?\n Digite\n1-SIM\n2-NÃO"
inserir_acompanhamento(chat_id, "1", name)'''
if(texto_recebido == "2" and status == "10") :
resposta.body("Sem problemas, qualquer coisa estou aqui")
print("ChatID: ", chat_id)
print("Status: ", status)
print("Status type: ", type(status))
#Mostrar periodos Manhã, tarde e Noite
elif(texto_recebido == "1" and status == "10" or texto_recebido == "1" and status == "null") :
print("Mostrar os periodos manhã, tarde e noite")
resposta.body(MostrarPeriodos(chat_id, name, status))
'''atualizar_acompanhamento(chat_id, "status", "2")
resposta = f"Qual periodo você gostaria de agendar ?\n1-Manhã\n2-Tarde\n3-Noite"'''
##mostrar horarios
elif(status == "2") :
print("mostrar os horarios disponiveis")
resposta.body(MostrarHorarios(texto_recebido, chat_id))
#Seleção dos horarios disponiveis
elif(texto_recebido != "0" and status == "3") :
try:
#converter data
id = texto_recebido
data_horario_agenda = listar_agenda("id",id)
print("Data Agenda: ",data_horario_agenda)
print("Data agenda data: ",data_horario_agenda[0]['data'])
#sqlite
#data_convertida = datetime.strptime(data_horario_agenda[0]['data'], "%d/%m/%Y").strftime("%Y-%m-%d")
#mysql
data_convertida = data_horario_agenda[0]['data'].strftime("%Y-%m-%d")
datetime.strptime(data_convertida, "%Y-%m-%d")
atualizar_acompanhamento(chat_id, "data_event", data_convertida)
atualizar_acompanhamento(chat_id, "time_event", data_horario_agenda[0]['horario'])
atualizar_acompanhamento(chat_id, "status", "4")
#atualizar a disponibilidade da agenda para não aparecer depois da data ser agendada
atualizar_agenda(int(texto_recebido), "disponibilidade", "'nao'")
resposta.body(f"Você gostaria de adicionar algum comentários ?\n1 - Sim\n2 -Não")
except ValueError:
resposta.body(f"A data que você digitou não está no formato correto.\nDigite a data no seguinte formato dd/mm/yyyy")
except IndexError:
resposta.body("Nenhum evento encontrado para esse ID, por favor, selecione uma das datas que lhe enviei.")
#Adicionar comentário caso a resposta seja sim para adicionar
elif(texto_recebido == "1" and status == "4"):
atualizar_acompanhamento(chat_id, "status", "5")
resposta.body("Por favor, escreva o seu comentário")
#Capturando a mensagem para ser inserida no banco
elif(status == "5"):
atualizar_acompanhamento(chat_id, "status", "10")
data_agendada = buscar_ultimo_chat(chat_id)["data_event"]
#data_agendada = datetime.strptime(data_agendada, "%Y-%m-%d")
data_agendada_formatada = data_agendada.strftime("%d/%m/%Y")
horario_agendado = buscar_ultimo_chat(chat_id)["time_event"]
inserir_evento(buscar_ultimo_chat(chat_id)["data_event"],buscar_ultimo_chat(chat_id)["time_event"],"00:30:00","Padão Titulo",texto_recebido,chat_id,name,"Whatsapp")
resposta.body(f"Então agendamos para {data_agendada_formatada} as {horario_agendado} !\nObrigado !")
#Caso a resposta de inserir uma mensagem seja "Não"
elif(texto_recebido == "2" and status == "4"):
atualizar_acompanhamento(chat_id, "status", "10")
data_agendada = buscar_ultimo_chat(chat_id)["data_event"]
#data_agendada = datetime.strptime(data_agendada, "%Y-%m-%d")
data_agendada_formatada = data_agendada.strftime("%d/%m/%Y")
horario_agendado = buscar_ultimo_chat(chat_id)["time_event"]
inserir_evento(buscar_ultimo_chat(chat_id)["data_event"],buscar_ultimo_chat(chat_id)["time_event"],"00:30:00","Padão Titulo",texto_recebido,chat_id,name,"Whatsapp")
resposta.body(f"Então agendamos para {data_agendada_formatada} as {horario_agendado} !\nObrigado !")
#voltar para priodo
elif(texto_recebido == "0" and status == "3"):
atualizar_acompanhamento(chat_id, "status", "2")
resposta.body(MostrarPeriodos(chat_id, name, status))
#Tratamento de mensagem inválida ao bot
elif(texto_recebido.lower() == "quem é você?" or texto_recebido.lower() == "quem e você?"):
resposta.body(f"Eu sou um Bot de agendamento!")
#await update.message.reply_text(resposta)
#resposta = f"Você escreveu: {texto_recebido}"
elif(texto_recebido.lower() == "2" and status == "null" or texto_recebido.lower() == "2" and status == "10"):
resposta.body(f"Então tudo bem !\nSe precisar é só me chamar.")
else:
resposta.body(f"Olá, você gostaria de agendar um horario ?\n1 - Sim\n2 - Não")
return str(response)
# ==========================
# ENVIO ATIVO (via API REST)
# ==========================
@app.route("/send", methods=["POST"])
def send_message():
data = request.json
to_number = data.get("to")
message_text = data.get("message")
try:
message = client.messages.create(
from_=TWILIO_WHATSAPP_NUMBER,
body=message_text,
to=f"whatsapp:{to_number}"
)
return jsonify({
"status": "success",
"sid": message.sid
}), 200
except Exception as e:
return jsonify({
"status": "error",
"message": str(e)
}), 500
if __name__ == "__main__":
app.run(port=5000, debug=True)