05. CITAS AUTOMATICO

Contestar los mensajes vía WhatsApp

¡Bienvenido de nuevo! Ha sido un viaje emocionante hasta ahora. Hemos recorrido desde la instalación de nuestro sistema de citas, a recibir mensajes de WhatsApp, pasando por la conexión a la base de datos y luego aprendiendo a responder automáticamente a nuestros clientes con la ayuda de ChatGPT. Ahora, estamos listos para dar el próximo paso en nuestra serie de tutoriales.

En este quinto tutorial del curso, titulado “Contestar los mensajes vía WhatsApp”, vamos a explorar cómo nuestro sistema de citas puede interactuar de manera activa y efectiva con nuestros clientes a través de WhatsApp. Este tutorial marcará una mejora significativa en la capacidad de nuestro sistema para comunicarse de manera eficaz y en tiempo real.

Aquí está lo que vamos a cubrir en este tutorial:

  1. Exploraremos la API de WhatsApp y cómo podemos usarla para enviar respuestas a nuestros clientes.
  2. Te guiaré a través del proceso de configuración de esta funcionalidad en nuestro sistema de citas.
  3. Finalmente, pondremos a prueba nuestra implementación, asegurándonos de que nuestro sistema puede responder de manera adecuada y oportuna a los mensajes de WhatsApp.

Esperamos que estés emocionado por la posibilidad de ampliar la capacidad de tu sistema de citas. ¡Prepárate para aprender, implementar y mejorar la forma en que te comunicas con tus clientes a través de WhatsApp! ¡Nos vemos en el tutorial!

image 21
Vamos al area de primeros pasos de WhatsApp y copiamos el token de acceso y el identificador de numero telefonico

image 22
En el archivo config.php Pegamos el el token y el id de telefono

<?php
class Config {
    public $apiKeyChatgpt;
    public $tokenWa;
    public $telefonoIDWa;
    public $remoto;

    public function __construct() {
        $remoto=true;
        if ($remoto) {
            // Coloca estos valores si remoto es true
            $this->apiKeyChatgpt = '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';
            $this->tokenWa = 'EAANIQCCaMQIBAEy04T3GZAyeyuq9xF86U2aF03gbbeKsskTCiDgEOAyyojgLTYdJeKrKMiw1ZCnfZB6pwy1GjCq8STvDNFoNwULIenq4silHFobn0AUsHUInucvqZAyTLqexYMQskQZAtNQyaIGCzLwMIx5n3EwprbRoZC9Kc04qZArlcFTNZCebKptfQerwreZCl6HL9ACr1dwZDZD';
            $this->telefonoIDWa = '116907067953774';
        } else {
            // Coloca estos valores si remoto es false
            $this->apiKeyChatgpt = 'otro_valor';
            $this->tokenWa = 'otro_valor';
            $this->telefonoIDWa = 'otro_valor';
        }
    }
}

Creamos el archivo whatsapp.php

Este archivo va a recibir las respuestas de ChatGPT y va a enviar esa respuesta vía WhatsApp al cliente.

<?php
//enviar.php
/*
 * RECIBIMOS LA RESPUESTA
*/
function enviar($recibido, $enviadoWa, $idWA, $timestamp, $telefonoCliente)
{
    global $conn;
    global $textoCita;
    //CONSULTAMOS TODOS LOS REGISTROS CON EL ID DEL MANSAJE
    $sqlCantidad = "SELECT count(id) AS cantidad FROM kimai2_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) {
        $enviado = str_replace("\n", "", $enviadoWa);
        //TOKEN QUE NOS DA FACEBOOK
        $config = new Config();
        $token = $config->tokenWa;
        //NUESTRO TELEFONO
        $telefono = str_replace("521", "52", $telefonoCliente);
        //IDENTIFICADOR DE NÚMERO DE TELÉFONO
        $telefonoID = $config->telefonoIDWa;

        //URL A DONDE SE MANDARA EL MENSAJE
        $url = 'https://graph.facebook.com/v16.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
        $responseString = curl_exec($curl);
        $response = json_decode($responseString, true);
        $fecha = date("Y-m-d H:i:s");
        file_put_contents('responseWhatsapp.txt', $fecha . "-" . $responseString);
        //OBTENEMOS EL CODIGO DE LA RESPUESTA
        $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        //CERRAMOS EL CURL
        curl_close($curl);
        global $textoCita;
        if (strpos($enviado, $textoCita) !== false) {
            $cita_creada = "1";
        } else {
            $cita_creada = "0";
        }
        try {
            //Cambiar el texto de la cita para que chatgpt no detecte que fue una cita
            $enviado = str_replace($textoCita, "Un asesor se pondrá en contacto con usted el día", $enviado);
            //INSERTAMOS LOS REGISTROS DEL ENVIO DEL WHATSAPP
            $sql = "INSERT INTO kimai2_registro 
        (mensaje_recibido, mensaje_enviado, id_wa, timestamp_wa, telefono_wa,cita_creada) 
        VALUES (?, ?, ?, ?, ?, ?)";
            $stmt = $conn->prepare($sql);
            $stmt->bind_param('ssssss', $recibido, $enviado, $idWA, $timestamp, $telefono, $cita_creada);
            $result = $stmt->execute();
            if ($result) {
                echo "El registro se insertó correctamente";
            } else {
                $error = $stmt->error;
                echo "Error al insertar el registro: " . $error;
            }
        } catch (Exception $e) {
            $error = $e->getMessage();
            echo "Error al insertar el registro: " . $error;
        }
    }
}

Agregamos la función de whatsapp en index.php

    require_once "whatsapp.php";
    //ENVIAMOS LA RESPUESTA VIA WHATSAPP
    enviar($mensaje, $respuesta, $id, $timestamp, $telefonoCliente);

De tal suerte que tu archivo index.php quede asi:

<?php
/*
 * 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;
}
$textoCita="He creado su cita para el dia";
/*
 * 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) {
    $pregunta = $mensaje;
    require_once("conexion.php");
    // Prepara la consulta SQL
    $queryCompania = 'SELECT company, address, contact FROM kimai2_invoice_templates WHERE id = ?';
    $stmtCompania = $conn->prepare($queryCompania);
    // Vincula el parámetro "id" a la consulta SQL
    $id_inv = 1;
    $stmtCompania->bind_param('i', $id_inv);
    // Ejecuta la consulta
    $stmtCompania->execute();
    // Obtiene el resultado
    $resultCompania = $stmtCompania->get_result();
    // Obtiene los datos del registro
    $rowCompania = $resultCompania->fetch_assoc();
    // Prepara la consulta SQL
    // Crea la consulta SQL
    $queryCategoria = "SELECT alias FROM kimai2_users WHERE enabled = 1 AND id != 1";
    // Prepara la consulta
    $stmtCategoria = $conn->prepare($queryCategoria);
    // Ejecuta la consulta
    $stmtCategoria->execute();
    // Obtiene el resultado
    $resultCategoria = $stmtCategoria->get_result();
    // Crea un array para guardar los alias
    $listaCategorias = "";
    // Recorre los resultados y añade cada alias al array
    while ($row = $resultCategoria->fetch_assoc()) {
        $listaCategorias = $listaCategorias.$row['alias'].",";
    }
    $listaCategorias = rtrim($listaCategorias, ",");
    $system="Hola, soy un asesor de Información de la clínica ".$rowCompania['company'].
    ", no proporciono citas pero genero reportes para que posteriormente un experto agende una cita, no doy recomendaciones para curar, recomiendo solo mi clínica y pido un dato a la vez.".
    " Mis tareas incluyen recibir información, escribir reportes y no hay necesidad de que el paciente lo sepa. Aquí está el procedimiento que sigo: ".
    "1. Primero, pido el nombre. ".
    "2. Luego, pido la edad. ".
    "3. Después, pregunto qué sintomas tiene y en base a las respuestas defino en cuál de estas especialidades cae: ".
    $listaCategorias.".".
    "Si no cae en ninguna especialidad colocarlo en Medico general.".
    "Una vez recolectada la información sobre los síntomas, no programo ninguna cita. En cambio, escribo un reporte con este formato: ".
    "||paciente||etapa_edad||especialidad||sintomas|| (reemplaza el contenido entre || por la información recolectada).".
    //"||cliente||datos_auto||categoria_falla||descripcion_falla|| (reemplaza el contenido entre || por la información recolectada).".
    "Es vital que siempre que detecte sintomas, escriba el reporte en el formato mencionado para que un experto agende una cita. ".
    "Si el paciente me pide una cita le debo escribir el reporte con el formato mencionado. ".
    "Importante: No invento ni añado ninguna información que no se me haya proporcionado. Todo mi trabajo se basa en los datos que recibo.";
    "Solo si me lo piden doy informacion de la empresa, Nombre de la empresa: " . $rowCompania['company'] . ", Ubicación: " . $rowCompania['address'] . " " . $rowCompania['contact'] . ". ";

    require_once "chatgpt.php";
    $respuesta = preguntaChatgpt($system, $pregunta, $telefonoCliente,$listaCategorias);
    //ESCRIBIMOS LA RESPUESTA
    file_put_contents("respuesta.txt", $respuesta);
    require_once "whatsapp.php";
    //ENVIAMOS LA RESPUESTA VIA WHATSAPP
    enviar($mensaje, $respuesta, $id, $timestamp, $telefonoCliente);

}

Los comentarios están cerrados.