Contestar los WhatsApp con ChatGPT
Ya hemos recibido mensajes de WhatsApp, hemos procesado el mensaje con inteligencia artificial y guardado en la base de datos, ahora vamos a Contestar los WhatsApp con ChatGPT recibidos en Python, siguiendo estos pasos:
Instalamos las dependencias
pip install heyoo
enviar(telefonoCliente,respuesta) #RETORNAMOS EL STATUS EN UN JSON return jsonify({"status": "success"}, 200) def enviar(telefonoRecibe,respuesta): from heyoo import WhatsApp #TOKEN DE ACCESO DE FACEBOOK token='EAALDlRZBLBD4BAGIFXLcPuwwgkXMZAnCOAuvPTXRBPbi4tKavrq9PmCFuWfMvmoBHkjeKghBQhs0AExdK3Ru5NCXfWsDaIvUuVAZBDLNtKmom0pwSkA9LhUJMYrLVYTLhlWPPjg9iRuOBSpKKr7oExDHwC385UxJZCwFH2qxadMfqKQDAMMngReZBNvyJ3rLFmiOVB6xZBrwZDZD' #IDENTIFICADOR DE NÚMERO DE TELÉFONO idNumeroTeléfono='116907067953774' #INICIALIZAMOS ENVIO DE MENSAJES mensajeWa=WhatsApp(token,idNumeroTeléfono) telefonoRecibe=telefonoRecibe.replace("521","52") #ENVIAMOS UN MENSAJE DE TEXTO mensajeWa.send_message(respuesta,telefonoRecibe)
Todo el codigo seria este
#Código de Recibir WhatsApp y crear una respuesta con ChatGPT from flask import Flask, jsonify, request app = Flask(__name__) #CUANDO RECIBAMOS LAS PETICIONES EN ESTA RUTA @app.route("/webhook/", methods=["POST", "GET"]) def webhook_whatsapp(): #SI HAY DATOS RECIBIDOS VIA GET if request.method == "GET": #SI EL TOKEN ES IGUAL AL QUE RECIBIMOS if request.args.get('hub.verify_token') == "HolaNovato": #ESCRIBIMOS EN EL NAVEGADOR EL VALOR DEL RETO RECIBIDO DESDE FACEBOOK return request.args.get('hub.challenge') else: #SI NO SON IGUALES RETORNAMOS UN MENSAJE DE ERROR return "Error de autentificacion." #RECIBIMOS TODOS LOS DATOS ENVIADO VIA JSON data=request.get_json() #EXTRAEMOS EL NUMERO DE TELEFONO Y EL MANSAJE telefonoCliente=data['entry'][0]['changes'][0]['value']['messages'][0]['from'] #EXTRAEMOS EL TELEFONO DEL CLIENTE mensaje=data['entry'][0]['changes'][0]['value']['messages'][0]['text']['body'] #EXTRAEMOS EL ID DE WHATSAPP DEL ARRAY idWA=data['entry'][0]['changes'][0]['value']['messages'][0]['id'] #EXTRAEMOS EL TIEMPO DE WHATSAPP DEL ARRAY timestamp=data['entry'][0]['changes'][0]['value']['messages'][0]['timestamp'] #ESCRIBIMOS EL NUMERO DE TELEFONO Y EL MENSAJE EN EL ARCHIVO TEXTO #SI HAY UN MENSAJE if mensaje is not None: import openai # Indica el API Key openai.api_key = "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" # Uso de ChapGPT en Python model_engine = "text-davinci-003" prompt = mensaje completion = openai.Completion.create(engine=model_engine, prompt=prompt, max_tokens=1024, n=1, stop=None, temperature=0.7) respuesta="" for choice in completion.choices: respuesta=respuesta+choice.text print(f"Response: %s" % choice.text) respuesta=respuesta.replace("\\n","\\\n") respuesta=respuesta.replace("\\","") #CONECTAMOS A LA BASE DE DATOS import mysql.connector mydb = mysql.connector.connect( host = "localhost", user = "root", password = "", database='novato_chat' ) mycursor = mydb.cursor() query="SELECT count(id) AS cantidad FROM registro WHERE id_wa='" + idWA + "';" mycursor.execute(query) cantidad, = mycursor.fetchone() cantidad=str(cantidad) cantidad=int(cantidad) if cantidad==0 : sql = ("INSERT INTO registro"+ "(mensaje_recibido,mensaje_enviado,id_wa ,timestamp_wa ,telefono_wa) VALUES "+ "('"+mensaje+"' ,'"+respuesta+"','"+idWA+"' ,'"+timestamp+"','"+telefonoCliente+"');") mycursor.execute(sql) mydb.commit() enviar(telefonoCliente,respuesta) #RETORNAMOS EL STATUS EN UN JSON return jsonify({"status": "success"}, 200) def enviar(telefonoRecibe,respuesta): from heyoo import WhatsApp #TOKEN DE ACCESO DE FACEBOOK token='EAALDlRZBLBD4BAGIFXLcPuwwgkXMZAnCOAuvPTXRBPbi4tKavrq9PmCFuWfMvmoBHkjeKghBQhs0AExdK3Ru5NCXfWsDaIvUuVAZBDLNtKmom0pwSkA9LhUJMYrLVYTLhlWPPjg9iRuOBSpKKr7oExDHwC385UxJZCwFH2qxadMfqKQDAMMngReZBNvyJ3rLFmiOVB6xZBrwZDZD' #IDENTIFICADOR DE NÚMERO DE TELÉFONO idNumeroTeléfono='116907067953774' #INICIALIZAMOS ENVIO DE MENSAJES mensajeWa=WhatsApp(token,idNumeroTeléfono) telefonoRecibe=telefonoRecibe.replace("521","52") #ENVIAMOS UN MENSAJE DE TEXTO mensajeWa.send_message(respuesta,telefonoRecibe) #INICIAMSO FLASK if __name__ == "__main__": app.run(debug=True)
Código completo
conexion.php
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "chat"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname);
envia.php
<?php //enviar.php /* * RECIBIMOS LA RESPUESTA */ function enviar($recibido, $enviado, $idWA,$timestamp,$telefonoCliente) { require_once './conexion.php'; //CONSULTAMOS TODOS LOS REGISTROS CON EL ID DEL MANSAJE $sqlCantidad = "SELECT count(id) AS cantidad FROM registro WHERE id_wa='" . $idWA . "';"; $resultCantidad = $conn->query($sqlCantidad); //OBTENEMOS LA CANTIDAD DE MENSAJES ENCONTRADOS (SI ES 0 LO REGISTRAMOS SI NO NO) $cantidad = 0; //SI LA CONSULTA ARROJA RESULTADOS if ($resultCantidad) { //OBTENEMOS EL PRIMER REGISTRO $rowCantidad = $resultCantidad->fetch_row(); //OBTENEMOS LA CANTIDAD DE REGISTROS $cantidad = $rowCantidad[0]; } //SI LA CANTIDAD DE REGISTROS ES 0 ENVIAMOS EL MENSAJE DE LO CONTRARIO NO LO ENVIAMOS PORQUE YA SE ENVIO if ($cantidad == 0) { //TOKEN QUE NOS DA FACEBOOK $token = 'EAAx2HnFSmF0BAFLiJfLtYauPhhTyYyAXBEPo4XZBe3tDBFclNOmEqEZAeRIxZB22EKqr1jP8vCh2NdZBctebbuQdd1HtxY5yU2k3nCSuwzQn9bgwXhd01CDV7ZCdu93f9O3oKkdZCGIf5uPr37LX29VKeATnNraz3vUKVC7x7ehGVlCnN5yIbyZBbXIZAlMUMRZAjCOSxDaw9mAZDZD'; //NUESTRO TELEFONO $telefono = '527121122441'; //IDENTIFICADOR DE NÚMERO DE TELÉFONO $telefonoID = '110476218612328'; //URL A DONDE SE MANDARA EL MENSAJE $url = 'https://graph.facebook.com/v15.0/' . $telefonoID . '/messages'; //CONFIGURACION DEL MENSAJE $mensaje = '' . '{' . '"messaging_product": "whatsapp", ' . '"recipient_type": "individual",' . '"to": "' . $telefono . '", ' . '"type": "text", ' . '"text": ' . '{' . ' "body":"' . $enviado . '",' . ' "preview_url": true, ' . '} ' . '}'; //DECLARAMOS LAS CABECERAS $header = array("Authorization: Bearer " . $token, "Content-Type: application/json",); //INICIAMOS EL CURL $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POSTFIELDS, $mensaje); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //OBTENEMOS LA RESPUESTA DEL ENVIO DE INFORMACION $response = json_decode(curl_exec($curl), true); //OBTENEMOS EL CODIGO DE LA RESPUESTA $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); //CERRAMOS EL CURL curl_close($curl); //INSERTAMOS LOS REGISTROS DEL ENVIO DEL WHATSAPP $sql = "INSERT INTO registro " . "(mensaje_recibido ,mensaje_enviado ,id_wa ,timestamp_wa , telefono_wa) VALUES " . "('" . $recibido . "' ,'" . $enviado . "','" . $idWA . "','" . $timestamp . "','" . $telefonoCliente . "');"; $conn->query($sql); $conn->close(); } }
index.php
<?php //DESHABILITAMOS EL MOSTRAR ERRORES ini_set('display_errors', 0); ini_set('display_startup_errors', 0); error_reporting(-1); require 'vendor/autoload.php'; //IMPORTAMOS LAS LIBRERIRAS DE Rivescript use \Axiom\Rivescript\Rivescript; /* * VERIFICACION DEL WEBHOOK */ //TOQUEN QUE QUERRAMOS PONER $token = 'HolaNovato'; //RETO QUE RECIBIREMOS DE FACEBOOK $palabraReto = $_GET['hub_challenge']; //TOQUEN DE VERIFICACION QUE RECIBIREMOS DE FACEBOOK $tokenVerificacion = $_GET['hub_verify_token']; //SI EL TOKEN QUE GENERAMOS ES EL MISMO QUE NOS ENVIA FACEBOOK RETORNAMOS EL RETO PARA VALIDAR QUE SOMOS NOSOTROS if ($token === $tokenVerificacion) { echo $palabraReto; exit; } /* * RECEPCION DE MENSAJES */ //LEEMOS LOS DATOS ENVIADOS POR WHATSAPP $respuesta = file_get_contents("php://input"); //CONVERTIMOS EL JSON EN ARRAY DE PHP $respuesta = json_decode($respuesta, true); //EXTRAEMOS EL MENSAJE DEL ARRAY $mensaje=$respuesta['entry'][0]['changes'][0]['value']['messages'][0]['text']['body']; //EXTRAEMOS EL TELEFONO DEL ARRAY $telefonoCliente=$respuesta['entry'][0]['changes'][0]['value']['messages'][0]['from']; //EXTRAEMOS EL ID DE WHATSAPP DEL ARRAY $id=$respuesta['entry'][0]['changes'][0]['value']['messages'][0]['id']; //EXTRAEMOS EL TIEMPO DE WHATSAPP DEL ARRAY $timestamp=$respuesta['entry'][0]['changes'][0]['value']['messages'][0]['timestamp']; //SI HAY UN MENSAJE if($mensaje!=null){ //file_put_contents("text.txt", $mensaje); //INICIALIZAMOS RIVESCRIPT Y CARGAMOS LA CONVERSACION $rivescript = new Rivescript(); $rivescript->load('restaurante.rive'); //OBTENEMOS LA RESPUESTA $respuesta= $rivescript->reply($mensaje); //ESCRIBIMOS LA RESPUESTA //file_put_contents("text.txt", $respuesta); require_once "envia.php"; //ENVIAMOS LA RESPUESTA VIA WHATSAPP enviar($mensaje,$respuesta,$id,$timestamp,$telefonoCliente); }
restaurante.rive
+ hola - Hola, Soy un robot, esta es la informacion que te puedo ofrecer\nNuestros telefonos\nNuestra direccion\nEntregas\nPagina web\nHorarios\nMenu\n ! var lunes = Menu del Lunes \nChiles en nogada 20.50 \nChilaquiles 15.50 \n ! var martes = Menu del Martes \nPambasos 20.50 \nHuitlacoche 15.50 \n ! var miercoles = Menu del Miercoles \nEnchiladas 120.50 \nCaldo de olla 15.50 \n ! var jueves = Menu del Jueves \nTacos 120.50 \nQuesadillas 15.50 \n ! var viernes = Menu del Viernes \nTortas 20.50 \nTacos 15.50 \n ! var sabado = Menu del Sabado \nEnchiladas 120.50 \nHuitlacoche 15.50 \n ! var domingo = Los domingo esta cerrado ! var horario = Lunes abrimos de 08:00 a 18:00\nMartes abrimos de 08:00 a 18:00\nMiercoles abrimos de 08:00 a 18:00\nJueves abrimos de 08:00 a 18:00\nViernes abrimos de 08:00 a 18:00\nSabados abrimos de 08:00 a 12:00\nDomingos Cerrado\n + lunes * - <bot lunes> + martes * - <bot martes> + miercoles * - <bot miercoles> + jueves * - <bot jueves> + viernes * - <bot viernes> + sabado * - <bot sabado> + domingo * - <bot domingo> + (menu|carta) * - <bot lunes> \n <bot martes> \n <bot miercoles> \n <bot jueves> \n <bot viernes> \n <bot sabado> \n <bot domingo> + como estas @ hola + hay alguien* @ hola + (telefono|celular|cel) * - Nuestro telefono es 725648221 + (direccion|ubicacion|lugar) * - Nuestra direccion Colonia Emiliano Zapata Acapulco Gro - Nos encontramos ubicados en la Colonia Emiliano Zapata Acapulco Gro + (entregas|a domicilio) * - Realizamos entregas a domicilio solo de lunes a viernes de 12:00 a 15:00 + (pagina web|web|pagina) * - Visitanos en https://www.programadornovato.com + (hora|horarios|dias|abierto) * - <bot horario> + * - Recuerda que soy un robot, me podrías preguntar de otra forma - Intenta hacer tu pregunta de otra manera.
🔗 Codigo: Contestar los WhatsApp con ChatGPT · programadornovato/ChatgptWhatsApp@b15b501 (github.com)
Ave que vuela, a la cazuela.