logo principal

Bots simples en Java

Vamos a ver como crear una pequeña aplicación que simule utilizar el teclado.

Para realizar este tipo de tareas automatizada tenemos una clase llamada Robot. Se trata de una clase muy simple que nos permite simular inputs por teclado y ratón, añadiendo alguna funcionalidad extra como la de realizar una captura de pantalla o indicar el color que contiene un pixel en la pantalla. Para bots con mas complejidad y que requieran más funcionalidades, pueden utilizar la libreria de Selenium, que contiene más características que esta clase.

criptografia

A continuación vamos a ver un ejemplo en el que crearemos un pequeño bot que abrirá una consola cmd y ejecutará el comando netstat -ano, para ver las conexiones activas en nuestro PC.

Para este ejemplo vamos a crear nosotros una clase propia, en mi caso la llamaré BotTexto y extenderá de la clase Robot del paquete AWT.



public class BotTexto extends Robot{

    /*  Creamos un constructor vacio que pondra el delay en 100 ms,
    *   este delay es el tiempo que pasa entre cada acción
    */
    public BotTexto() throws AWTException{
        this.setAutoDelay(100);
    }

}
                    
                

Atención: Introducir tiempos demasiado bajos en setAutoDelay(int) puede provocar que en ocasiones no se introduzcan las teclas correctamente.

Una vez creada la clase vamos a almacenar todas las teclas que necesitemos en un Map. En mi caso yo he almacenado las siguientes:

Mapeo de teclas.

Por último crear un par de métodos que nos facilitaran la tarea al ejecutar el bot.



public void write(String sentence){

    /*  Convertimos la cadena de texto en caracteres y los mapeamos, para 
    *   cada char llamamos al método write(char) que se encargara de pulsar la tecla
    */
    sentence
        .chars()
        .mapToObj(i -> (char)i)
        .forEach((t) -> write(t));
}

public void write(char letter){

    //  Obtenemos la combinacion de teclas que requiere esa letra del Map
    Integer[] keys = map.get(String.valueOf(letter));

    /*  Si es null, significa que esta tecla no se encuentra en nuestro Map, 
    *   por lo que le asignamos un valor por defecto, en estre caso será "_"
    */
    if(keys == null){
        write('_');
        return;
    }
    
    //  Presionamos el combo de letras Ejemplo: M = shift + m
    for(Integer key : keys){
        this.keyPress(key);
    }

    //  Una vez presionadas las liberamos
    for(Integer key : keys){
        this.keyRelease(key);
    }
    
}

                

Y ya estaría lista la clase para utilizarse. A continuación vamos a ver el ejemplo de abrir una cmd e introducir un comando.



public static void main(String[] args) throws AWTException {
    BotTexto bot = new BotTexto();
    
    //  Paramos el hilo durante 3 segundos antes de ejecutar el bot
    try {
        Thread.sleep(3000);
    } catch (InterruptedException ex) {
        System.out.println(ex);
    }

    /*  > = windows key, <‍ = enter key;
    *   Presiona la tecla windows, escribe cmd, pulsa intro, escribe 
    *   netstat -ano, pulsa intro
    */
    bot.write(">cmd<‍ netstat -ano<‍");
}
                    
                

A continuación dejaré el código completo de la clase creada.

Código completo.