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)