JavaRush /Blog Java /Random-ES /Creando un bot de Telegram usando Spring Boot
Whiskels
Nivel 41
Москва

Creando un bot de Telegram usando Spring Boot

Publicado en el grupo Random-ES
¡Hola a todos! En algún momento de tus estudios, querrás pasar de resolver problemas a crear proyectos reales que formarán la base de tu portafolio. Cuando comencé mis prácticas (que recomiendo encarecidamente a todos), recibí una oferta para escribir un bot de Telegram como autónomo. Debido a mi poco conocimiento, escribí un bot bastante simple ( el último compromiso antes de migrar a Spring ), que contenía tres subprocesos:
  • hilo de recepción de mensajes;
  • hilo de envío de mensajes;
  • Hilo de programación de eventos (verificó mensajes programados y actualizó los datos almacenados en caché desde JSON).
Al escribir esta funcionalidad, me basé en gran medida en este artículo . Todo funcionó bastante bien, pero cuanto más profundizaba en Spring, más quería refactorizar todo para reducir la coherencia del programa y mejorar la calidad del código. SonarLint (un complemento para verificar automáticamente la calidad del código) siguió intentando convencerme de que no es muy bueno tener bucles while interminables. En algún momento, tomé una decisión y reescribí todo, y ahora quiero compartir con ustedes el conocimiento que adquirí durante el proceso de refactorización. Comencemos con lo básico y, más específicamente, con TelegramBots-Spring-Boot-Starter. Entonces, ¡vamos! Creemos un bot que saludará en respuesta a cualquier mensaje. Primero, necesitamos crear un nuevo proyecto Maven. Agreguemos las dependencias necesarias a pom.xml. Agregue versiones de Java y TelegramBots-Spring-Boot-Starter a las propiedades. Y registramos dependencias: aquí tendremos los TelegramBots-Spring-Boot-Starter y Telegram API ya mencionados anteriormente : Creando un bot de Telegram usando Spring Boot - 1la biblioteca TelegramBots-Spring-Boot-Starter incluye Spring Boot y Telegram API. Usarlo nos permite declarar un bot en nuestro código de una manera bastante simple, y el propio Spring creará el Bean y activará el bot. Si está interesado en lo que está sucediendo bajo el capó en este momento, consulte las fuentes de la biblioteca (en el entorno de desarrollo o en Github ). También agregamos parámetros de compilación: Creando un bot de Telegram usando Spring Boot - 2 ¡no olvides actualizar todas las dependencias después de completar el pom! Creemos dos clases: App y Bot, así como un archivo application.yaml en la carpeta de recursos. La estructura de mi proyecto se ve así: Creando un bot de Telegram usando Spring Boot - 3En esta etapa, agreguemos las credenciales de nuestro bot a application.yaml:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
La notación jerárquica nos permite evitar repeticiones (bot.name, bot.token) y mejorar la legibilidad. Si aún no ha creado un bot, puede crear uno siguiendo las instrucciones oficiales . Si no desea mostrar las credenciales del bot en application.yaml (lo cual es correcto), use variables de entorno al implementar:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Completando la clase Bot:
package com.whiskels.telegram.bot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

// Аннотация @Component необходима, чтобы наш класс распознавался Spring, Cómo полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать significado полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

    @Value("${bot.token}")
    private String botToken;

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении mensajes наш бот будет отвечать сообщением Hi!
     */
    @Override
    public void onUpdateReceived(Update update) {
        try {
            execute(new SendMessage().setChatId(update.getMessage().getChatId())
            .setText("Hi!"));
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

    // Геттеры, которые необходимы для наследования от TelegramLongPollingBot
    public String getBotUsername() {
        return botUsername;
    }

    public String getBotToken() {
        return botToken;
    }
}
Complete la clase de aplicación:
package com.whiskels.telegram;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.telegram.telegrambots.ApiContextInitializer;

// Аннотация, которая объединяет в себя @Configuration, @EnableAutoConfiguration, @ComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        // Здесь código написан по заветам
        // https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter
        ApiContextInitializer.init();

        SpringApplication.run(App.class, args);
    }
}
Si hicimos todo correctamente, entonces podemos ejecutar main y saludar a nuestro bot. Creando un bot de Telegram usando Spring Boot - 4¡Listo! Hemos escrito y lanzado con éxito un bot de Telegram que saluda cada mensaje entrante. Si este artículo te resultó útil, entonces el mejor agradecimiento sería que miraras mi repositorio y dejaras una estrella. Allí también encontrarás mi versión del bot de Telegram, que tiene muchas características interesantes:
  • almacenar usuarios en una base de datos Postgres;
  • autorización de acceso a comandos según roles de usuario;
  • uso de anotaciones personalizadas @BotCommand y @RequiredRoles para crear controladores de mensajes y verificar los derechos de los usuarios;
  • soporte para crear un cronograma de notificaciones.
Si alguna de estas funciones le interesa, escriba en los comentarios e intentaré responder o escribir un artículo detallado sobre cómo recrearla. PD: Este es mi primer artículo sobre JavaRush y me gustaría sumergirme en la naturaleza de Spring JPA y las anotaciones @Scheduled, pero primero pensé que valdría la pena escribir esta guía sobre cómo construir un bot en general usando Spring Boot. Ya se han escrito varios artículos sobre bots, pero la búsqueda no produjo dicha guía, así que decidí llenar este nicho :) También me gustaría mencionar a Miroha; gracias por la idea de UpdateHandlers, lo robé para mí. :) PARTE 2 PARTE 3
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION