JavaRush /Java Blog /Random-IT /Creazione di un bot di Telegram utilizzando Spring Boot
Whiskels
Livello 41
Москва

Creazione di un bot di Telegram utilizzando Spring Boot

Pubblicato nel gruppo Random-IT
Ciao a tutti! Ad un certo punto dei tuoi studi, vorrai passare dalla risoluzione dei problemi alla creazione di progetti reali che costituiranno la base del tuo portfolio. Quando ho iniziato il mio stage (che consiglio vivamente a tutti), ho ricevuto un'offerta per scrivere un bot di Telegram come libero professionista. Vista la mia scarsa conoscenza, ho scritto un bot abbastanza semplice ( l'ultimo commit prima della migrazione a Spring ), che conteneva tre thread:
  • thread di ricezione dei messaggi;
  • thread di invio del messaggio;
  • thread di pianificazione degli eventi (verifica la presenza di messaggi pianificati e dati aggiornati memorizzati nella cache da JSON).
Durante la scrittura di questa funzionalità, ho fatto molto affidamento su questo articolo . Tutto ha funzionato abbastanza bene, ma più mi immergevo in Spring, più volevo rifattorizzare tutto per ridurre la coerenza del programma e migliorare la qualità del codice. SonarLint (un plugin per il controllo automatico della qualità del codice) ha continuato a cercare di convincermi che non è molto utile avere cicli while infiniti. Ad un certo punto, ho deciso e ho riscritto tutto, e ora voglio condividere con voi la conoscenza che ho acquisito durante il processo di refactoring. Cominciamo con le basi e, più specificamente, con TelegramBots-Spring-Boot-Starter Quindi, andiamo! Creiamo un bot che saluterà in risposta a qualsiasi messaggio. Innanzitutto, dobbiamo creare un nuovo progetto Maven. Aggiungiamo le dipendenze necessarie a pom.xml. Aggiungi le versioni Java e TelegramBots-Spring-Boot-Starter alle proprietà. E registriamo le dipendenze: qui avremo il già menzionato TelegramBots-Spring-Boot-Starter e l'API Telegram : Creare un bot di Telegram utilizzando Spring Boot - 1la libreria TelegramBots-Spring-Boot-Starter include Spring Boot e l'API Telegram. Usarlo ci permette di dichiarare un bot nel nostro codice in modo abbastanza semplice, e Spring stessa creerà il Bean e attiverà il bot. Se sei interessato a cosa sta succedendo dietro le quinte in questo momento, guarda i sorgenti della libreria (nell'ambiente di sviluppo o su Github ). Aggiungiamo anche i parametri di compilazione: Creazione di un bot di Telegram utilizzando Spring Boot - 2 non dimenticare di aggiornare tutte le dipendenze dopo aver compilato il pom! Creiamo due classi: App e Bot, nonché un file application.yaml nella cartella delle risorse. La struttura del mio progetto è simile a questa: Creazione di un bot di Telegram utilizzando Spring Boot - 3In questa fase, aggiungiamo le credenziali del nostro bot a application.yaml:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
La notazione gerarchica ci consente di evitare ripetizioni (bot.name, bot.token) e migliorare la leggibilità. Se non hai ancora creato un bot, puoi crearne uno seguendo le istruzioni ufficiali . Se non desideri visualizzare le credenziali del bot in application.yaml (che è corretto), utilizza le variabili di ambiente durante la distribuzione:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Compilazione della classe 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, How полноправный Bean
@Component
// Наследуемся от TelegramLongPollingBot - абстрактного класса Telegram API
public class Bot extends TelegramLongPollingBot {
    // Аннотация @Value позволяет задавать meaning полю путем считывания из application.yaml
    @Value("${bot.name}")
    private String botUsername;

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

    /* Перегружаем метод интерфейса LongPollingBot
    Теперь при получении messages наш бот будет отвечать сообщением 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;
    }
}
Compila la classe App:
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) {
        // Здесь code написан по заветам
        // https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter
        ApiContextInitializer.init();

        SpringApplication.run(App.class, args);
    }
}
Se abbiamo fatto tutto correttamente, possiamo eseguire main e salutare il nostro bot. Creazione di un bot di Telegram utilizzando Spring Boot - 4Pronto! Abbiamo scritto e lanciato con successo un bot di Telegram che saluta ogni messaggio in arrivo. Se questo articolo ti è stato utile, il miglior ringraziamento sarebbe se guardassi il mio repository e lasciassi una stella. Lì troverai anche la mia versione del bot di Telegram, che ha molte caratteristiche interessanti:
  • memorizzare gli utenti in un database Postgres;
  • autorizzazione all'accesso ai comandi in base ai ruoli utente;
  • utilizzo delle annotazioni personalizzate @BotCommand e @RequiredRoles per creare gestori di messaggi e verificare i diritti utente;
  • supporto per la creazione di un programma di notifica.
Se qualcuna di queste funzionalità ti interessa, scrivi nei commenti e cercherò di rispondere o di scrivere un articolo dettagliato su come ricrearla. PS Questo è il mio primo articolo su JavaRush e vorrei tuffarmi nelle terre selvagge delle annotazioni Spring JPA e @Scheduled, ma prima ho pensato che valesse la pena scrivere questa guida su come costruire in generale un bot utilizzando Spring Boot. Sono già stati scritti diversi articoli sui bot, ma la ricerca non ha prodotto una guida del genere, quindi ho deciso di riempire questa nicchia :) Vorrei anche menzionare Miroha - grazie per l'idea di UpdateHandlers, l'ho rubata per me stesso :) PARTE 2 PARTE 3
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION