Programar un Bot para WhatsApp en Java

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

Crear Agente de dialogflow
  • 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.
Crear un nuevo agente

Creamos un intent para el Chatbot en WhatsApp

Crear intent

Colocamos el nombre al intent y damos click en “Add Training phrases”

Agregamos el área de preguntas

Agregamos algunas expresiones

  • ¿A como?
  • ¿Cuanto sale?
  • ¿Cuanto cuesta?
  • ¿Cual es el precio?
Agregamos preguntas a nuestros clientes

Damos click en “ADD RESPONSE”

Preparamos el área de respuestas

Agregamos una respuesta que será:

A 20 el chico, 30 el mediano, 40 el grande, ¿Cuál quieres? y Click en Save

Agregamos las respuestas a nuestros clientes

Configurar una respuesta en caso de no entender

Damos click en intents y clicamos en “Default Fallback intent”

Configuramos el area de “No entiendo”

Bajamos hasta el área de Response y borramos todas las respuestas que están “por default” (Si quieres)

Borrar respuestas default

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.
Agregar respuestas

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

Programar un Bot para WhatsApp en Java

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/

Los comentarios están cerrados.

Salir de la versión móvil