Contestar los WhatsApp recibidos en C#
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 recibidos en C#, siguiendo estos pasos:
namespace ChatBotWa.Models { using MySqlConnector; public class Datos { MySqlConnection connection = null; public Datos() { connection = new MySqlConnection("Server=localhost;User ID=root;Password=;Database=chat"); connection.Open(); } public void insertar(string mensaje_recibido,string mensaje_enviado , string id_wa, string telefono_wa) { try { var command = connection.CreateCommand(); command.CommandText = "INSERT INTO `registro` " + "(`mensaje_recibido` ,`mensaje_enviado` ,`id_wa` , `telefono_wa`) VALUES " + "('" + mensaje_recibido + "','" + mensaje_enviado + "', '" + id_wa + "', '" + telefono_wa + "');"; command.ExecuteNonQuery(); } catch (Exception ex) { } } //VALIDAMOS SI EL ID DE WA YA EXISTE public Boolean idWaExiste(string id_wa) { try { var command = connection.CreateCommand(); command.CommandText = "SELECT * FROM `registro` WHERE `id_wa` = '"+ id_wa + "'"; using MySqlDataReader rdr = command.ExecuteReader(); if (rdr.Read()) { return true; } else { return false; } } catch (Exception ex) { } return false; } } public class WebHookResponseModel { public Entry[] entry { get; set; } } public class Entry { public Change[] changes { get; set; } } public class Change { public Value value { get; set; } } public class Value { public int ad_id { get; set; } public long form_id { get; set; } public long leadgen_id { get; set; } public int created_time { get; set; } public long page_id { get; set; } public int adgroup_id { get; set; } public Messages[] messages { get; set; } } public class Messages { public string id { get; set; } public string from { get; set; } public Text text { get; set; } } public class Text { public string body { get; set; } } }
using ChatBotWa.Models; using Microsoft.AspNetCore.Mvc; using System.IO; using System.Net; using System.Net.Http.Headers; using System.Xml.Linq; using RiveScript; namespace ChatBotWa.Controllers { public class RecibirController { //RECIBIMOS LOS DATOS DE VALIDACION VIA GET [HttpGet] //DENTRO DE LA RUTA webhook [Route("webhook")] //RECIBIMOS LOS PARAMETROS QUE NOS ENVIA WHATSAPP PARA VALIDAR NUESTRA URL public string Webhook( [FromQuery(Name = "hub.mode")] string mode, [FromQuery(Name = "hub.challenge")] string challenge, [FromQuery(Name = "hub.verify_token")] string verify_token ) { //SI EL TOKEN ES hola (O EL QUE COLOQUEMOS EN FACEBOOK) if (verify_token.Equals("hola")) { return challenge; } else { return ""; } } //RECIBIMOS LOS DATOS DE VIA POST [HttpPost] //DENTRO DE LA RUTA webhook [Route("webhook")] //RECIBIMOS LOS DATOS Y LOS GUARDAMOS EN EL MODELO WebHookResponseModel public dynamic datos([FromBody] WebHookResponseModel entry) { //ESTRAEMOS EL MENSAJE RECIBIDO string mensaje_recibido = entry.entry[0].changes[0].value.messages[0].text.body; //ESTRAEMOS EL ID UNICO DEL MENSAJE string id_wa = entry.entry[0].changes[0].value.messages[0].id; //ESTRAEMOS EL NUMERO DE TELEFONO DEL CUAL RECIBIMOS EL MENSAJE string telefono_wa = entry.entry[0].changes[0].value.messages[0].from; Datos dt = new Datos(); var existeId = dt.idWaExiste(id_wa); if (existeId==false) { //INICIALIZAMOS EL BOT DE RIVESCRIPT var bot = new RiveScript.RiveScript(true); //CARGAMOS EL ARCHIVO DONDE ESTA LA CONFIGURACION DE LA IA bot.loadFile("restaurante.rive"); bot.sortReplies(); //OBTENEMOS LA RESPUESTA DEPENDIENDO DEL MENSAJE RECIBIDO var mensaje_enviado = bot.reply("local-user", mensaje_recibido); //CREAMOS EL TEXTO DEL ARCHIVO string texto = "mensaje_recibido=" + mensaje_recibido + Environment.NewLine; texto = texto + "id_wa=" + id_wa + Environment.NewLine; texto = texto + "telefono_wa=" + telefono_wa + Environment.NewLine; texto = texto + "mensaje_enviado=" + mensaje_enviado + Environment.NewLine; dt.insertar(mensaje_recibido, mensaje_enviado, id_wa, telefono_wa); enviaAsync(telefono_wa, mensaje_enviado); } //File.WriteAllText("texto.txt", texto); //SI NO HAY ERROR RETORNAMOS UN OK var response = new HttpResponseMessage(HttpStatusCode.OK); response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain"); return response; } public async Task enviaAsync(string telefono, string mensaje) { telefono = telefono.Replace("521", "52"); string token = "EABY2XYgjGo4BANdeZBqoJ11edwLjusQ4zSFsDpdn6IVxjuHKdWhN7RL188QKsyU9xoFvGPQG78FySQP7WOZB5uiojzv6kLhJkxZCYQGmSJPpuDUtrwcf7iUOVAyUbOYQNVpS25sYXUid7POpBZAEqsikp1UNSNQOPG2KWrZC66Drd71c8DVa3fhfg1wq6c125bkO0OmmusQZDZD"; //Identificador de número de teléfono string idTelefono = "111290641852610"; HttpClient client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://graph.facebook.com/v15.0/" + idTelefono + "/messages"); request.Headers.Add("Authorization", "Bearer " + token); string json = "{\"messaging_product\": \"whatsapp\",\"recipient_type\": \"individual\",\"to\": \"" + telefono + "\",\"type\": \"text\",\"text\": {\"body\": \"" + mensaje + "\"}}"; request.Content = new StringContent(json); request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); HttpResponseMessage response = await client.SendAsync(request); //response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); } } }
Ave que vuela, a la cazuela.