JavaRush /Blogue Java /Random-PT /Criando um bot de telegrama usando Spring Boot
Whiskels
Nível 41
Москва

Criando um bot de telegrama usando Spring Boot

Publicado no grupo Random-PT
Olá a todos! Em algum momento de seus estudos, você deseja passar da solução de problemas para a criação de projetos reais que formarão a base do seu portfólio. Quando comecei meu estágio (que recomendo fortemente a todos), recebi uma oferta para escrever um bot de telegramas como freelancer. Devido ao meu pouco conhecimento, escrevi um bot bastante simples ( o último commit antes de migrar para o Spring ), que continha três threads:
  • thread de recebimento de mensagens;
  • thread de envio de mensagem;
  • thread de agendamento de eventos (verificou mensagens agendadas e atualizou dados em cache do JSON).
Ao escrever esta funcionalidade, confiei muito neste artigo . Tudo funcionou muito bem, mas quanto mais me aprofundei no Spring, mais tive vontade de refatorar tudo para reduzir a coerência do programa e melhorar a qualidade do código. SonarLint (um plugin para verificar automaticamente a qualidade do código) continuou tentando me convencer de que não é muito bom ter loops while infinitos. Em algum momento, me decidi e reescrevi tudo, e agora quero compartilhar com vocês o conhecimento que adquiri durante o processo de refatoração. Vamos começar com o básico, e mais especificamente - com TelegramBots-Spring-Boot-Starter Então, vamos lá! Vamos criar um bot que diga olá em resposta a qualquer mensagem. Primeiro, precisamos criar um novo projeto Maven. Vamos adicionar as dependências necessárias ao pom.xml. Adicione versões Java e TelegramBots-Spring-Boot-Starter às propriedades. E registramos dependências - aqui teremos o já mencionado TelegramBots-Spring-Boot-Starter e Telegram API : Criando um bot de telegrama usando Spring Boot - 1A biblioteca TelegramBots-Spring-Boot-Starter inclui Spring Boot e Telegram API. Usá-lo nos permite declarar um bot em nosso código de uma forma bastante simples, e o próprio Spring criará o Bean e ativará o bot. Se você estiver interessado no que está acontecendo nos bastidores neste momento, consulte as fontes da biblioteca (no ambiente de desenvolvimento ou no Github ). Também adicionamos parâmetros de compilação: Criando um bot de telegrama usando Spring Boot - 2 Não se esqueça de atualizar todas as dependências após preencher o pom! Vamos criar duas classes - App e Bot, bem como um arquivo application.yaml na pasta de recursos. A estrutura do meu projeto é assim: Criando um bot de telegrama usando Spring Boot - 3Nesta fase, vamos adicionar as credenciais do nosso bot ao application.yaml:
bot:
  name: JavaRushTelegramBot
  token: 22313424:AAF4gck4D8gDhq68E7k0UH8vlyQADhxQhYo
A notação hierárquica nos permite evitar repetições (bot.name, bot.token) e melhorar a legibilidade. Se você ainda não criou um bot, você pode criar um seguindo as instruções oficiais . Se você não quiser exibir as credenciais do bot em application.yaml (que está correto), use variáveis ​​de ambiente ao implantar:
bot:
  name: ${BOT_NAME}
  token: ${BOT_TOKEN}
Preenchendo a 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;
    }
}
Preencha a 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 fizermos tudo corretamente, podemos executar main e dizer olá ao nosso bot. Criando um bot de telegrama usando Spring Boot - 4Preparar! Escrevemos e lançamos com sucesso um bot de telegrama que diz olá a todas as mensagens recebidas. Se este artigo foi útil para você, então o melhor agradecimento seria se você olhasse meu repositório e deixasse uma estrela. Lá você também encontrará minha versão do bot de telegramas, que possui muitos recursos interessantes:
  • armazenar usuários em um banco de dados Postgres;
  • autorização de acesso a comandos com base em funções de usuário;
  • uso de anotações personalizadas @BotCommand e @RequiredRoles para criar manipuladores de mensagens e verificar os direitos do usuário;
  • suporte para criação de um cronograma de notificação.
Se alguma dessas funcionalidades lhe interessar, escreva nos comentários e tentarei responder ou escrever um artigo detalhado sobre como recriá-la. PS Este é meu primeiro artigo sobre JavaRush e gostaria de mergulhar na natureza das anotações Spring JPA e @Scheduled, mas primeiro pensei que valeria a pena escrever este guia sobre como construir um bot de maneira geral usando Spring Boot. Vários artigos já foram escritos sobre bots, mas a busca não encontrou esse guia, então resolvi preencher esse nicho :) Também gostaria de citar o Miroha - obrigado pela ideia do UpdateHandlers, roubei para eu mesmo :) PARTE 2 PARTE 3
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION