Cómo desarrollar una aplicación Java, usando el IDE IntelliJ IDEA, que usando un Bot de Telegram permitirá enviar y recibir mensajes. Mostramos paso a paso cómo realizar esta aplicación con el repositorio Maven, desde IntelliJ. Escribiremos un mensaje al Bot de Telegram, desde el propio Telegram, el programa Java lo leerá y contestará con otro mensaje al chat de origen.
- Requisitos para aplicación Java que envía y recibe mensajes con Bot en Telegram.
- Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram.
- Generar fichero ejecutable Java JAR para probar en Windows o Linux.
- Probar aplicación Java de lectura y envío de mensajes a Telegram en Windows y Linux.
- Descarga del código fuente Java completo del proyecto en IntelliJ IDEA.
- Ejecutar un comando del sistema operativo mediante mensaje de Telegram.
Requisitos para aplicación Java que envía y recibe mensajes con Bot en Telegram
Necesitaremos disponer de un IDE de desarrollo, en nuestro caso usaremos IntelliJ IDEA (puede servir cualquier otro como Eclipse o Netbeans). Este requisito no es obligatorio dado que el código fuente de una aplicación Java puede hacerse hasta con el bloc de notas y luego compilarse con javac. Pero el uso de un IDE y casi todos son gratuitos, facilitará y ayudará mucho en los procesos de depuración y compilación de la aplicación.
Usaremos el repositorio Maven para descargar los ficheros JAR de dependencias del paquete que usaremos para el envío y la lectura de mensajes de Telegram. Explicaremos paso a paso cómo usar Maven en IntelliJ IDEA.
Para este proceso necesitaremos un Bot de Telegram, que será el que nos proporcione el token de acceso a Telegram. En el siguiente enlace explicamos paso a paso cómo crear un Bot en Telegram y cómo obtener su token de seguridad (que necesitaremos para la conexión, como explicaremos más adelante):
Una vez creado el Bot en Telegram anotaremos el nombre del Bot y el token, la cadena de caracteres unívoca que identificará el Bot y que no debemos compartir públicamente.
Como es lógico, para las pruebas necesitaremos tener instalado Telegram o bien en el móvil o bien usando alguna de sus aplicaciones de escritorio o el propio Telegram Web.
Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram
En primer lugar crearemos el proyecto Java, para ello abriremos el IDE de desarrollo, en nuestro caso IntelliJ IDEA. Pulsaremos en «File» – «New» – «Project…»:
Elegiremos «Maven» y la versión de SDK de Java que queramos, teniendo en cuenta que según la versión con la que generemos los compilados y los JAR luego necesitaremos una versión Java igual o superior para que la aplicación funcione. Pulsaremos en «Next»:
Introduciremos los datos básicos del proyecto Java con Maven:
- Name: nombre del proyecto, por ejemplo «TelegramBotEnvioLectura».
- Location: ubicación de los archivos del proyecto (xml, java, jar, …).
- Artifact Coordinates: podremos indicar aquí los datos de bloque de código reutilizable (artifact).
Pulsaremos «Finish»:
Al ser un proyecto Maven, el asistente de IntelliJ IDEA nos deja abierto, al principio, el fichero pom.xml de Maven, que es donde podremos establecer los distintos repositorios y las dependencias de nuestro programa. Por ejemplo, si hemos añadido un Artifact, nos insertará el código XML de dicho Artifact en el pom.xml.
Aprovechando que tenemos abierto el fichero pom.xml (si no lo tenemos podemos abrirlo haciendo doble clic sobre él en la ventana de navegación del proyecto), añadiremos las dependencias necesarias para nuestra aplicación Java de envío y lectura de mensajes en Telegram. Pegaremos el siguiente código en el fichero pom.xml, antes de la etiqueta de cierre </project>:
1 2 3 4 5 6 7 |
<dependencies> <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>4.9.2</version> </dependency> </dependencies> |
Una vez agregadas las dependencias en el fichero pom.xml, nos aparecerá un botón (Load Maven Changes) para actualizar el repositorio, pulsaremos sobre él:
Crearemos una nueva clase, que será la clase principal del programa Java, la clase Main. Para ello pulsaremos con el botón derecho del ratón sobre la carpeta «Java» y en el menú emergente elegiremos «New» – «Java Class»:
Introduciremos el nombre para la clase, en nuestro caso «Main» y pulsaremos INTRO:
En una primera aproximación y para realizar las pruebas, el código Java de la clase Main que a continuación listamos completo, leerá los mensajes que se le envíen al Bot indicado en el método getBotUserName y con el token getBotToken. El programa Java permanecerá a la escucha, recibirá los mensajes y contestará a cada usuario que haya escrito al Bot un mensaje privado o bien que haya escrito en un grupo de Telegram donde esté agregado el Bot. El programa Java responderá el mismo mensaje recibido, para confirmar que le ha llegado. Pegaremos el siguiente código en la clase Main.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
import org.telegram.telegrambots.ApiContextInitializer; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; //Extendemos la clase Main a la clase TelegramLongPollingBot public class Main extends TelegramLongPollingBot { private static String token = ""; private static String usuarioBot =""; //Pasamos como atributo a TelegramLongPollingBot el nombre del Bot @Override public String getBotUsername() { return this.usuarioBot; } //Pasamos como atributo a TelegramLongPollingBot el token de seguridad //Que hemos obtenido al crear el Bot en Telegram @Override public String getBotToken() { return this.token; } //Usamos el método onUpdateReceived de TelegramLongPollingBot para recibir y enviar mensajes @Override public void onUpdateReceived(Update actualizacionEstado) { // Comprobamos si hay mensaje y si el mensaje es de texto if (actualizacionEstado.hasMessage() && actualizacionEstado.getMessage().hasText()) { //Creamos objeto SendMessage SendMessage mensaje = new SendMessage( actualizacionEstado.getMessage().getChatId(), "Este es el mensaje que has enviado: " + System.lineSeparator() + actualizacionEstado.getMessage().getText() + System.lineSeparator() + "Te responde el Bot de Telegram https://proyectoa.com"); try { execute(mensaje); //Enviamos el mensaje al chat de Telegram System.out.println (FechaActual() + " Mensaje enviado [" + mensaje.getText() + "] a chat [" + mensaje.getChatId() + "]"); } catch (TelegramApiException e) { System.out.println (FechaActual() + " Error " + e.getMessage()); } } } //Método constructor de la clase principal Main public static void main(String[] args) { //Si se pasa el nombre del usuario del Bot y el token por parámetro lo leemos if (args.length == 2) { usuarioBot = args[0]; token = args[1]; } else //En caso contrario se piden por consola { Scanner lecturaTeclado = new Scanner(System.in); System.out.print("Introduce el nombre de usuario del Bot de Telegram: "); usuarioBot = lecturaTeclado.nextLine(); System.out.print("Introduce el token del Bot de Telegram: "); token = lecturaTeclado.nextLine(); } if (token.isEmpty() || usuarioBot.isEmpty()) { System.out.print("Debe introducir un usuario y un token correctos o pasarlos como parámetro."); } else { ApiContextInitializer.init(); TelegramBotsApi botsApi = new TelegramBotsApi(); try { botsApi.registerBot(new Main()); } catch (TelegramApiException e) { System.out.println(FechaActual() + " Error " + e.getMessage()); } } } //Función que devuelve la fecha y hora actuales con // formato año-mes-dia hora:minuto:segundo:milisegundo public static String FechaActual() { Date fechaHoraActual = new Date(); return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(fechaHoraActual); } } |
El código anterior incluye comentarios explicando las partes y métodos más importantes.
Antes de compilar y probar el código anterior, conviene cambiar el language level a 6, para evitar errores de compilación con los Overrides. Para ello accederemos al menú «File» – «Project Structure»:
Pulsaremos en Modules en la parte izquierda y en la derecha, en el desplegable de Language level, elegiremos «6 – @Override in interfaces»:
El código anterior quedará en la clase Main:
Realizamos la compilación del programa Java y hacemos las primeras pruebas para ver su funcionamiento. Para ello pulsaremos en el menú «Run» y en «Run…»:
Al ser la primera vez que ejecutamos la aplicación, deberemos editar la compilación para establecer los parámetros de inicio (clase Main, versión JRE, ..). Para ello pulsaremos en «Edi Configurations…»:
Pulsaremos en + para añadir una nueva configuración, elegiremos «Application»:
Introduciremos el nombre en «Name» [1], por ejemplo «TelegramBotEnvioLectura», elegiremos la clase Main en «Main class» [2], en nuestro caso «Main». Desde esta ventana podremos configurar el resto de opciones de ejecución, por ejemplo la versión de JRE que usaremos, que condicionará la versión de JVM que necesitaremos para ejecutar el JAR en su momento. Una vez establecidas las opciones pulsaremos en «Apply» y en «Run» para ejecutarla:
Una vez configurado el inicio, podremos compilarla cada vez que queramos desde el menú «Run» – «Run TelegramBotEnvioLectura»:
La aplicación de iniciará, si le hemos pasado por parámetro el valor del nombre del usuario del Bot y el token, se pondrá a la escucha de mensajes. En caso contrario, como vemos en la siguiente imagen, nos solicitará ambos datos por pantalla. En cuanto los hayamos introducido, se pondrá a la escucha. Mostrará estos warnigs pero no suponen problema para su correcto funcionamiento, los ignoraremos:
SLF4J: Failed to load class «org.slf4j.impl.StaticLoggerBinder».
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See slf4j.org/codes.html#StaticLoggerBinder for further details.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/…/alonso/.m2/repository/com/google/inject/guice/4.2.2/guice-4.2.2.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use –illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Ahora, para comprobar que recibe los mensajes que se le envíen al Bot, abriremos Telegram y escribiremos al Bot (o en un grupo donde esté el Bot) cualquier texto:
Comprobaremos la consola del programa Java, veremos que ha recibido el mensaje y lo ha reenviado al chat origen:
Comprobaremos que ha llegado al Telegram:
Generar fichero ejecutable Java JAR para probar en Windows o Linux
Una vez que hemos depurado la aplicación y comprobado que funciona correctamente desde el IDE IntelliJ IDEA, es momento de crear el archivo JAR ejecutable para poder probar el programa en equipos Windows y Linux. Para ello abriremos el menú «File» – «Project Structure…». En la parte izquierda pulsaremos en «Artifacts» y en la derecha en el botón + (Add):
Pulsaremos en «JAR» y en «From modules with dependencies…»:
Elegiremos la Main Class, en nuestro caso «Main», dejaremos marcada la opción «extract to the target JAR» y el directorio por defecto para el fichero MANIFEST.MF:
Pulsaremos en «TelegramBotEnvioLectura.jar» y comprobaremos que aparece la clase Main en Main Class y la ruta del fichero de manifiesto correctos. Pulsaremos en OK:
Para generar el JAR pulsaremos en el menú «Build» – «Build Artifacts»:
En el menú emergente pulsaremos en «Build»:
Iniciará la generación del JAR, mostrando el siguiente resultado en la consola:
Executing pre-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Running ‘before’ tasks
Checking sources
Copying resources… [TelegramBotEnvioLectura]
Building artifact ‘TelegramBotEnvioLectura:jar’…
Building artifact ‘TelegramBotEnvioLectura:jar’: copying files…
Building archives…
Building …/alonso/IdeaProjects/TelegramBotEnvioLectura/out/artifacts/TelegramBotEnvioLectura_jar/TelegramBotEnvioLectura.jar…
Copying archives…
Running ‘after’ tasks
Finished, saving caches…
Executing post-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Synchronizing output directories…
Si todo es correcto podremos acceder a la carpeta ...TelegramBotEnvioLectura\out\artifacts\TelegramBotEnvioLectura_jar y comprobar que se ha creado el TelegramBotEnvioLectura.jar:
Este será el fichero «ejecutable» de nuestra aplicación, que podremos enviar a cualquier equipo con Windows o con Linux para su ejecución, como explicamos a continuación.
Probar aplicación Java de lectura y envío de mensajes a Telegram en Windows y Linux
A continuación os mostramos cómo ejecutar el archivo JAR generado de la aplicacación que lee y envía mensajes de Telegram. Tanto en sistemas operativos Windows como Linux. En ambos casos necesitaremos disponer de una versión de Java igual o superior a la usada en la generación del JAR. Explicamos todo esto en este artículo:
- Obtener HASH MD5 de un texto con Java y generar JAR para ejecutar aplicación Java en Windows y Linux.
Probar aplicación Java en JAR en Linux que lee y envía mensajes de Telegram
Para el caso de un equipo con sistema operativo Linux, para cualquier distribución, como siempre tendremos que comprobar que el equipo dispone de Java en una versión igual o superior a la que se ha usado para compilar el programa. Para comprobar la versión de Java es suficiente con ejecutar, en una ventana de terminal (línea de comandos), el siguiente comando:
java -version
En este artículo explicamos cómo instalar Java y comprobar la versión en Linux:
En cuanto tengamos Java a una versión igual o superior y tengamos en Linux el fichero .jar generado anteriormente, accederemos a la carpeta donde hayamos copiado el fichero TelegramBotEnvioLectura.jar y podremos ejecutar la aplicación con el siguiente comando:
java -jar TelegramBotEnvioLectura.jar
El comando anterior debería funcionar, pero da un error: «no hay ningún atributo de manifiesto principal en TelegramBotEnvioLectura.jar«. No es problema, ejecutaremos este otro comando que sí funcionará:
java -cp TelegramBotEnvioLectura.jar Main
Si no le pasamos por parámetro al comando anterior el usuario del bot y el token nos los solicitará en la línea de comandos. Introduciremos el nombre de usuario del Bot y pulsaremos INTRO. Introduciremos ahora el token de seguridad del Bot y pulsaremos INTRO. Si los datos son correctos el programa se iniciará y quedará a la escucha y espera de mensajes enviados al Bot:
Como hemos hecho en la depuración y compilación del programa, abriremos Telegram y le escribiremos al Bot o en un grupo donde esté el Bot:
Comprobaremos que la aplicación Java en el equipo Linux recibe el mensaje y lo reenvía:
Y comprobaremos en Telegram que efectivamente ha llegado el mensaje:
De esta forma hemos verificado que la aplicación funciona perfectamente en equipos Linux. Para las pruebas hemos usado un equipo con Linux CentOS 7, pero el mismo JAR el válido para cualquier otra distribución: Ubuntu, Red Hat, Suse, Mint, Fedora, Debian, etc.. Incluso funcionará en equipos con MAC, únicamente necesitarán tener la máquina virtual Java con una versión igual o superior a la usada en la compilación, como ya hemos explicado.
Probar aplicación Java en JAR en Windows que lee y envía mensajes de Telegram
Para el caso de equipos con sistemas operativos Windows (cualquier versión desde Windows XP, Windows Vista, Windows 7, Windows 8, Windows 10, Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2019, …), el proceso será el mismo que para equipos Linux, necesitaremos disponer de la misma versión de la máquina virtual Java o una superior que se haya usado en la compilación y generación del JAR.
Abriremos una ventana de línea de comandos (MS-DOS, cmd, consola) y comprobaremos la versión de Java con el comando:
java -version
Si no tenemos la versión correcta o bien el comando anterior da error, podremos seguir las instrucciones del siguiente artículo para instalar Java en el equipo Windows:
Una vez que tengamos la versión correcta de Java en Windows podremos ejecutar la aplicación con los mismos comandos que en Linux.
Accederemos desde la línea de comandos a la carpeta donde hayamos copiado el fichero TelegramBotEnvioLectura.jar (con cd ruta) y podremos ejecutar la aplicación con el siguiente comando:
java -jar TelegramBotEnvioLectura.jar
El comando anterior debería funcionar, pero da un error: «no hay ningún atributo de manifiesto principal en TelegramBotEnvioLectura.jar«. No es problema, ejecutaremos este otro comando que sí funcionará:
java -cp TelegramBotEnvioLectura.jar Main
Si no le pasamos por parámetro al comando anterior el usuario del bot y el token nos los solicitará en la línea de comandos. Introduciremos el nombre de usuario del Bot y pulsaremos INTRO. Introduciremos ahora el token de seguridad del Bot y pulsaremos INTRO. Si los datos son correctos el programa se iniciará y quedará a la escucha y espera de mensajes enviados al Bot:
Y en Telegram veremos que funciona exactamente igual que en el caso de Linux:
Si queremos pasarle el usuario y el token por parámetro, para no tener que escribirlo una y otra vez, es suficiente con ejecutar el comando anterior añadiendo al final los dos parámetros:
Descarga del código fuente Java completo del proyecto en IntelliJ IDEA
Por supuesto, os pasamos el enlace para la descarga del código fuente completo de la aplicación Java que hemos comentado en este artículo. Incluye el fichero pom.xml con las dependencias de Maven, así como el ejecutable JAR ya generado:
Ejecutar un comando del sistema operativo mediante mensaje de Telegram
Para darle una utilidad real a nuestra aplicación y una vez que hemos comprobado que funciona perfectamente tanto en Windows como en Linux, vamos a cambiar un poco el código para que en lugar de responder con el mismo mensaje que lee, ejecute un comando del sistema operativo. Es decir, escribiremos al Bot de Telegram un comando del sistema operativo (Windows o Linux según donde tengamos ejecutándose la aplicación), la aplicación Java lo leerá y lo ejecutará en el sistema operativo (en real) y devolverá el resultado de nuevo al chat de Telegram origen.
Para no alargar más este artículo abordaremos este programa Java en un nuevo tutorial: