Programar un Bot para WhatsApp en Java
En este tutorial vamos a Programar un Bot para WhatsApp en Java que nos permitirá interactuar nuestros clientes. Usaremos Herramienta y lenguajes Open Source como Java, Selenium y NetBeans, esto es para permitir que nuestra aplicación funcione en cualquier Sistema Operativo (Windows, Linux y Mac), dicho objetivo lo lograremos con estos sencillos pasos:
Crear Proyecto en Netbeans
Abrimos NetBeans y creamos un nuevo proyecto de Java
Colocamos un nombre a nuestro proyecto en este caso ChatBotWA.
Creamos un nuevo Jframe haciendo click en nuestro proyecto -> New -> JFrame Form
Dejamos este nombre y damos click en Finish
Importamos las librerías
Hacemos click en Source
Escribimos WebDriver driver; y cargamos las dependencias haciendo click en las sugerencias
Seleccionamos selenium y damos click en Add
Damos click en importar dependencias
Agregamos estos componentes
- FieldText (URL DialogFlow)
- Boton (Abrir WhatsApp)
- CheckBox (Activar chatbot)
Agregamos estas variables globales
Agregamos las librerías de WebDriver
Importamos las librerias del WebDriver
Damos doble click en el boton Abrir WA
Agregaos este código en el botón Abrir WA
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try { //Obtenemos la ubicacion de nuestro programa String localPath=new File(".").getCanonicalPath(); //Leemos el chromedriver que esta en la misma direccion del programa System.setProperty("webdriver.chrome.driver", localPath+"\\chromedriver.exe"); //Inicializamos ls opciones de chrome ChromeOptions optionsGoo = new ChromeOptions(); //Permitimos la propiedad no-sandbox para evitar problemas en linux optionsGoo.addArguments("--no-sandbox"); //Deshabilitamos las notificaciones optionsGoo.addArguments("--disable-notifications"); //Guardamos la sesion en la carpeta chromeWA optionsGoo.addArguments("--user-data-dir="+localPath+"\\chromeWA"); //Instanciamos un nuevo chromedriver driver = new ChromeDriver(optionsGoo); //Abrimos whatsapp driver.get("https://web.whatsapp.com"); } catch (IOException ex) { Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); } }
Importamos todas las librerias que nos hacen falsas
Creamos la funcion revisaWA con este codigo
public void revisaWA() { //Variable que almacena la tab de chrome que nos posicionaremos int tabSeleccionada=0; //Si hay un mensaje if(driver.findElements(By.className("aumms1qt")).size()>0){ //Buscamos el nombre del contacto String nombreContacto=driver.findElement(By.className("aumms1qt")).findElement(By.xpath("./../../../../..")).findElement(By.className("zoWT4")).getText(); //Obtenemos la cantidad mensajes enviados int cantNuevosMensajes=Integer.parseInt(driver.findElement(By.className("aumms1qt")).getText()); //Damos click en el contacto para abrir el chat driver.findElement(By.className("aumms1qt")).click(); //Obtenemos todos los mensajes List<WebElement> webElementsMsgWA = driver.findElements(By.className("_22Msk")); //Variable que almacenara los ultimos mensaje enviados String mensajeEnviar=""; //Ciclo que unira todos los ultimos mensajes for (int i=cantNuevosMensajes;i>=1;i--){ //Obtenemos cada mensaje String ultimoMensaje = webElementsMsgWA.get(webElementsMsgWA.size()-i).findElement(By.className("i0jNr")).getText(); //Unimos los mensajes mensajeEnviar=mensajeEnviar+" "+ultimoMensaje; } //Obtenemos todas las TABS ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); boolean contactoEncontrado=false; //Validamos que el nombre de contacto no este en la lista de contactos de lo contrario nos posicionamos en el id del contacto for(int tabSel=1;tabSel<=cantTabs;tabSel++){ //Si el contacto ya existe en la lista if(nombreContacto.equals(contactos[tabSel])){ //Activamos la bandera y decmos que si encontramos el contacto contactoEncontrado=true; //Abrimos el tab del contacto driver.switchTo().window(tabs.get(tabSel)); //Rompemos el ciclo break; } } //Si no se encontro el contacto lo creamos if(contactoEncontrado==false){ //aumentamos el numero de contactos cantTabs++; //Asignamos el nombre del contacto a la lista de contactos contactos[cantTabs]=nombreContacto; //Abrimos una nueva pestaña driver.switchTo().newWindow(WindowType.TAB); //Vamos a la url de nuestro dialogFlow driver.get(jTextField1.getText()); } pausa(1000); //escribimos el mensaje driver.findElement(By.id("query")).sendKeys(mensajeEnviar); //Enviamos el mensaje haciendo enter driver.findElement(By.id("query")).sendKeys(Keys.ENTER); //Esperamos 1 segundo en lo que responde pausa(1000); //Obtenemos todas las respuestas List<WebElement> webElementsMsgDF = driver.findElements(By.className("server-response")); //Sacamos la ultima respuesta String RespuestaDF = webElementsMsgDF.get(webElementsMsgDF.size()-1).getText(); //Regresamos a la pestaña de WA driver.switchTo().window(tabs.get(0)); //Escribimos el mensaje driver.findElement(By.xpath("//*[@id=\"main\"]/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]/p")).sendKeys(RespuestaDF); //Esperamos 1 segundo pausa(1000); //Precionamos enter driver.findElement(By.xpath("//*[@id=\"main\"]/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]/p")).sendKeys(Keys.ENTER); pausa(1000); //Refrescamos el WA web para esperar nuevas preguntas driver.get("https://web.whatsapp.com"); } }
Agregamos la funcion pausa
//Funcion que espera un tiempo public void pausa(long sleeptime) { try { Thread.sleep(sleeptime); } catch (InterruptedException ex) { } }
Doble click en el checkBox Activar chatbot
Agregamos estos codigo dentro del CheckBox
while (jCheckBox1.isSelected()==true) { //Revisamos que existan nuevo mensajes en el chat de WA revisaWA(); pausa(1000); }
Código completo para programar un Bot para WhatsApp en Java
/* Programar un Bot para WhatsApp en Java */ package com.mycompany.chatbotwa; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.WindowType; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; /** * * @author eucm2 */ public class NewJFrame extends javax.swing.JFrame { //Declaramos el webdriver que controlara el chrome WebDriver driver; //Lista de contactos que manejaremos String[] contactos = new String[1000]; //numero de contactos que estaremos manejando int cantTabs=0; /** * Creates new form NewJFrame */ public NewJFrame() { initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jCheckBox1 = new javax.swing.JCheckBox(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("URL de DialogFlow"); jButton1.setText("Abrir WA"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jCheckBox1.setText("Activar chatbot"); jCheckBox1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jCheckBox1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 325, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1) .addComponent(jCheckBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(65, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jButton1) .addGap(7, 7, 7) .addComponent(jCheckBox1) .addGap(0, 185, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try { //Obtenemos la ubicacion de nuestro programa String localPath=new File(".").getCanonicalPath(); //Leemos el chromedriver que esta en la misma direccion del programa System.setProperty("webdriver.chrome.driver", localPath+"\\chromedriver.exe"); //Inicializamos ls opciones de chrome ChromeOptions optionsGoo = new ChromeOptions(); //Permitimos la propiedad no-sandbox para evitar problemas en linux optionsGoo.addArguments("--no-sandbox"); //Deshabilitamos las notificaciones optionsGoo.addArguments("--disable-notifications"); //Guardamos la sesion en la carpeta chromeWA optionsGoo.addArguments("--user-data-dir="+localPath+"\\chromeWA"); //Instanciamos un nuevo chromedriver driver = new ChromeDriver(optionsGoo); //Abrimos whatsapp driver.get("https://web.whatsapp.com"); } catch (IOException ex) { Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); } } private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) { while (jCheckBox1.isSelected()==true) { //Revisamos que existan nuevo mensajes en el chat de WA revisaWA(); pausa(1000); } } public void revisaWA() { //Variable que almacena la tab de chrome que nos posicionaremos int tabSeleccionada=0; //Si hay un mensaje if(driver.findElements(By.className("aumms1qt")).size()>0){ //Buscamos el nombre del contacto String nombreContacto=driver.findElement(By.className("aumms1qt")).findElement(By.xpath("./../../../../..")).findElement(By.className("zoWT4")).getText(); //Obtenemos la cantidad mensajes enviados int cantNuevosMensajes=Integer.parseInt(driver.findElement(By.className("aumms1qt")).getText()); //Damos click en el contacto para abrir el chat driver.findElement(By.className("aumms1qt")).click(); //Obtenemos todos los mensajes List<WebElement> webElementsMsgWA = driver.findElements(By.className("_22Msk")); //Variable que almacenara los ultimos mensaje enviados String mensajeEnviar=""; //Ciclo que unira todos los ultimos mensajes for (int i=cantNuevosMensajes;i>=1;i--){ //Obtenemos cada mensaje String ultimoMensaje = webElementsMsgWA.get(webElementsMsgWA.size()-i).findElement(By.className("i0jNr")).getText(); //Unimos los mensajes mensajeEnviar=mensajeEnviar+" "+ultimoMensaje; } //Obtenemos todas las TABS ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); boolean contactoEncontrado=false; //Validamos que el nombre de contacto no este en la lista de contactos de lo contrario nos posicionamos en el id del contacto for(int tabSel=1;tabSel<=cantTabs;tabSel++){ //Si el contacto ya existe en la lista if(nombreContacto.equals(contactos[tabSel])){ //Activamos la bandera y decmos que si encontramos el contacto contactoEncontrado=true; //Abrimos el tab del contacto driver.switchTo().window(tabs.get(tabSel)); //Rompemos el ciclo break; } } //Si no se encontro el contacto lo creamos if(contactoEncontrado==false){ //aumentamos el numero de contactos cantTabs++; //Asignamos el nombre del contacto a la lista de contactos contactos[cantTabs]=nombreContacto; //Abrimos una nueva pestaña driver.switchTo().newWindow(WindowType.TAB); //Vamos a la url de nuestro dialogFlow driver.get(jTextField1.getText()); } pausa(1000); //escribimos el mensaje driver.findElement(By.id("query")).sendKeys(mensajeEnviar); //Enviamos el mensaje haciendo enter driver.findElement(By.id("query")).sendKeys(Keys.ENTER); //Esperamos 1 segundo en lo que responde pausa(1000); //Obtenemos todas las respuestas List<WebElement> webElementsMsgDF = driver.findElements(By.className("server-response")); //Sacamos la ultima respuesta String RespuestaDF = webElementsMsgDF.get(webElementsMsgDF.size()-1).getText(); //Regresamos a la pestaña de WA driver.switchTo().window(tabs.get(0)); //Escribimos el mensaje driver.findElement(By.xpath("//*[@id=\"main\"]/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]/p")).sendKeys(RespuestaDF); //Esperamos 1 segundo pausa(1000); //Precionamos enter driver.findElement(By.xpath("//*[@id=\"main\"]/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]/p")).sendKeys(Keys.ENTER); pausa(1000); //Refrescamos el WA web para esperar nuevas preguntas driver.get("https://web.whatsapp.com"); } } //Funcion que espera un tiempo public void pausa(long sleeptime) { try { Thread.sleep(sleeptime); } catch (InterruptedException ex) { } } /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JCheckBox jCheckBox1; private javax.swing.JLabel jLabel1; private javax.swing.JTextField jTextField1; // End of variables declaration }
Descargamos las dependencias
En chrome damos click en los 3 puntos, seleccionamos ayuda, informacion de google y aparecera la vercion de chrome
Vamos a https://chromedriver.chromium.org/downloads y descargamos la version de chrome que tenemos instalado
Creamos la carpeta chromeWA y nustro archivo chromedriver.exe quedaria aqui mismo
Hacemos click en play y despues obtenemos la url de DialogFlow que mostraremos mas adelante
Crear un ChatBot en DialogFlow
Vamos a dialogflow
Creamos un agente
- Clocamos nombre del agente
- Seleccionamos un lenguaje, o sea el idioma con el que se va a comunicar el agente con el cliente.
- Seleccionamos un timezone, para que nuestro agente sepa la hora con la que nos estamos comunicando con los clientes y quizás saludar dependiendo de la hora.
- Seleccionamos “Create a new project”.
- Click en Crear agente.
Creamos un intent para el Chatbot en WhatsApp
Colocamos el nombre al intent y damos click en “Add Training phrases”
Agregamos algunas expresiones
- ¿A como?
- ¿Cuanto sale?
- ¿Cuanto cuesta?
- ¿Cual es el precio?
Damos click en “ADD RESPONSE”
Agregamos una respuesta que será:
A 20 el chico, 30 el mediano, 40 el grande, ¿Cuál quieres? y Click en Save
Configurar una respuesta en caso de no entender
Damos click en intents y clicamos en “Default Fallback intent”
Bajamos hasta el área de Response y borramos todas las respuestas que están “por default” (Si quieres)
Agregamos nuestras propias respuestas en caso de que no entendamos:
- No te entiendo, me lo puedes decir de otra forma.
- No te entendí.
- ¿Cómo dices?
- No entiendo.
Integramos DialogFlow con chatbot.jar
Damos click en integrations despues Web Demo
Click en Enable
Seleccionamos la URL despues del src
Pegamos la URL y damos click en Abrir WA
Probamos el sistema
Vinculamos nuestro dispositivo
Damos click en Activar chatbot
Enviamos un mensaje desde otro telefono y esperamos que nos coneste el chatbot
WhatsApp 🚀Envío Masivo de Mensajes GRATIS🤑: https://www.youtube.com/watch?v=lttPJpdcTWY&list=PLCTD_CpMeEKSpOF-gsNE5tV9Zv4MWTLa5
Enviar mensajes de Whatsapp con PHP [Twilio tutorial en Español 2022]: https://www.youtube.com/watch?v=Y7cGTMmobAg&list=PLCTD_CpMeEKQKkzfkx3_rzT0_LvbMR583
Enviar mensajes de Whatsapp con Java [Twilio tutorial en Español 2022]: https://www.youtube.com/watch?v=amfblbVscTQ&list=PLCTD_CpMeEKR4zG9ls7hFKUr_yNsrizeV
Enviar mensajes de Whatsapp con C# [Twilio tutorial en Español 2022]: https://www.youtube.com/watch?v=EGtDF59_CnY&list=PLCTD_CpMeEKQmVW9JbtsTjAjf6RiiawMV
Enviar mensajes de Whatsapp con Javascript [Twilio tutorial en Español 2022]: https://www.youtube.com/watch?v=n4RrQf1pdCM&list=PLCTD_CpMeEKSuvdfTtBKCqbZ5xrnuEVZO
Enviar mensajes de Whatsapp con PHP [Twilio tutorial en Español 2022]: https://www.youtube.com/watch?v=Y7cGTMmobAg&list=PLCTD_CpMeEKR0WTLZG2FlCdmgpc1JdyGJ
Enviar mensajes de WhatsApp automaticamente: https://www.programadornovato.com/category/enviar-mensajes-de-whatsapp-automaticamente-twilio-tutorial-en-espanol-2022/
Ave que vuela, a la cazuela.