Instruções do TelegramBot para criar funcionalidades básicas para o bot. (Parte 1)

Não faz muito tempo, sugeri que você usasse meu bot de telegrama.

Telegram Bot - Assistente de Planejamento de Eventos

Tendo recebido muitas perguntas no PM, percebi que a questão de criar bots para o Telegram é bastante popular.

Eles me perguntaram o código fonte do bot, pediram para compartilhar exemplos específicos da implementação de vários recursos do bot, me pediram para sugerir algum tipo de funcionalidade para trabalhar com o bot e as mensagens.

Decidi escrever uma série de artigos nos quais quero mostrar as coisas básicas que você precisará para escrever seu bot.
Java, Maven, TelegramAPI, Lombok e Log4j esperam por você.
Quem se importa - por favor, sob o gato ...

E eu vou direto do trunfo :)

O que foi solicitado no artigo anterior.

Você pode encontrar os códigos-fonte do projeto aqui .

No ramo " master ", haverá a versão final do bot, que escreveremos junto com você no processo de aparecimento de novos artigos.

O código fonte completo deste artigo estará na ramificação " Part1-Base ".

Nesta parte, criaremos com você um modelo básico que será capaz de:

  1. registrar bot em servidores Telegram
  2. receber mensagens gravadas no bot
  3. responda ao comando / start

Crie um projeto padrão do maven


( Vou sentir falta dos manuais sobre como trabalhar com o ambiente de desenvolvimento e as coisas básicas da programação Java. Todas essas coisas são muito fáceis de pesquisar no Google. E se não der certo, escreva perguntas ).

Vamos ver quais dependências precisaremos neste projeto.

Primeiro de tudo, este é Lombok . O que é isso e por quê - você pode ler, por exemplo, aqui .

E não se esqueça de adicionar um logger. Eu uso o log4j e um pouco mais adiante, mostrarei como ele pode ser útil ao depurar esse aplicativo e uma compreensão mais profunda da operação do TelegramAPI.

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 

E porque nós escrevemos um bot para o Telegram, então a própria biblioteca do Telegram:

 <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.5</version> </dependency> 

A estrutura do arquivo pom pode ser encontrada aqui.
A estrutura do arquivo pom.xml pode ser vista aqui .

Em seguida, adicionamos a classe base Bot.java , que implementará toda a nossa interação com os serviços de Telegram. Trabalharemos com o LongPolling, como Este método não requer certificados de criptografia e pode ser iniciado a partir de qualquer máquina que possua Java a bordo.

Para fazer isso, herdamos a classe TelegramLongPollingBot e implementamos os métodos básicos:

public void onUpdateReceived (atualização de atualização)
public String getBotUsername ()
public String getBotToken ()

E nós mesmos precisaremos adicionar um procedimento que conectará nosso bot ao TelegramAPI:

public void botConnect ()

 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.log4j.Logger; import org.telegram.telegrambots.TelegramBotsApi; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; @AllArgsConstructor @NoArgsConstructor public class Bot extends TelegramLongPollingBot { private static final Logger log = Logger.getLogger(Bot.class); final int RECONNECT_PAUSE =10000; @Setter @Getter String userName; @Setter @Getter String token; @Override public void onUpdateReceived(Update update) { // TODO: 11/18/2019     log.debug("new Update recieve"); } @Override public String getBotUsername() { return userName; } @Override public String getBotToken() { return token; } public void botConnect() { TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try { telegramBotsApi.registerBot(this); log.info("TelegramAPI started. Look for messages"); } catch (TelegramApiRequestException e) { log.error("Cant Connect. Pause " + RECONNECT_PAUSE / 1000 + "sec and try again. Error: " + e.getMessage()); try { Thread.sleep(RECONNECT_PAUSE); } catch (InterruptedException e1) { e1.printStackTrace(); return; } botConnect(); } } } 

Em princípio, tudo. Esse código pode se conectar aos servidores Telegram e, ao receber as mensagens endereçadas, ele registrará as informações no arquivo de log que recebeu a Atualização.

Vamos criar uma classe que executará nosso aplicativo.

Isso será feito pela classe App.java. Link para o arquivo: aqui

 package com.example.telegrambot; import com.example.telegrambot.bot.Bot; import org.apache.log4j.Logger; import org.telegram.telegrambots.ApiContextInitializer; public class App { private static final Logger log = Logger.getLogger(App.class); public static void main(String[] args) { ApiContextInitializer.init(); Bot test_habr_bot = new Bot("test_habr_bot", "1012522162:AAHLvPVqKF48LdqnsvS3l5YrJfvFey6dBa0"); test_habr_bot.botConnect(); } } 

Como você pode ver, para o bot funcionar, precisamos apenas do "nome do bot" e "token", que passaremos no construtor de nossa classe Bot.

Você pode obter o nome e o token do bot do pai de todos os bots :) escrevendo para ele em um telegrama.
O apelido dele: @BotFather
A comunicação com ele é muito simples e concisa.

Sob comando
/ newbot

Como resultado, você deve obter este diálogo:



Eles também escrevem aqui que é mais preciso, não mostram essas informações a ninguém, caso contrário, outra pessoa poderá controlar seu bot :)

Você dirá que não sou muito preciso ... Talvez, mas o pai dos bots nos permite alterar os tokens e lembrar aqueles que têm acesso público. Portanto, ao tentar se conectar aos meus dados, você receberá a seguinte mensagem:

 2019-12-04 13:44:25,252[DEBUG][main ][ com.example.telegrambot.bot.Bot] - Bot token: 1012522162:AAF5D49N4NreEJfCk0aOsC-UnmIu_GLkoyc 2019-12-04 13:44:26,613[ERROR][main ][ com.example.telegrambot.bot.Bot] - Cant Connect. Pause 10sec and try again. Error: Error removing old webhook 

Portanto, com meus dados, você não pode se conectar. Registre o seu. Especifique novos dados na classe App.java

Agora, executando o método principal na classe App, deixamos nosso bot se conectar e aguardamos novas mensagens. Ele nos escreverá sobre suas ações e tentativas no console.

Log4j


Lembre-se, acima, eu falei sobre o utilitário da biblioteca log4j. E aqui, para os curiosos, uma infinidade de dados úteis se abre.

O arquivo log4j.properties já contém configurações básicas para registro e níveis específicos de registro para classes de terceiros e para aqueles que funcionam em nosso bot.

 log4j.rootLogger= error, file log4j.logger.com.example.telegrambot.App = debug, stdout log4j.logger.com.example.telegrambot.bot.Bot = debug, stdout 

O nível básico de log é indicado como Erro.

Para as classes Bot e App, a saída do log no nível Debug é indicada.

Quais são esses níveis e como eles diferem - você pode encontrar facilmente no Google.

Se você quiser ver como e em que ordem a biblioteca do Telegram executa todas as suas ações, alterne o modo de registro geral para um nível inferior: informações ou depuração.

E quando você inicia o aplicativo, verá no console quantas coisas interessantes acontecem no processo de conexão e funcionamento. Quantas vezes suas funções são pesquisadas com o nome e o token do bot.

Os níveis de log mudam com esta linha:
Para obter os logs de acordo com o nível de informação, coloque o seguinte:

 log4j.rootLogger= info, file 

Para o nível de depuração, assim:

 log4j.rootLogger= debug, file 

E em conclusão


Agora temos um bot: ele se conecta, mostra belos registros e relata que as mensagens estão chegando.

Mas, acima, prometi que o bot responderia ao comando start. Vamos mudar um pouco o procedimento responsável pelo processamento das mensagens recebidas.

 @Override public void onUpdateReceived(Update update) { log.debug("Receive new Update. updateID: " + update.getUpdateId()); Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); if (inputText.startsWith("/start")) { SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText("Hello. This is start message"); try { execute(message); } catch (TelegramApiException e) { e.printStackTrace(); } } } 

Como você pode ver no código, o bot faz o seguinte:

  • Ele recebe uma atualização e captura seu número de identificação no log.
  • Recupera o ID do bate-papo e o texto da mensagem da mensagem transmitida
  • Verifica se este texto é um comando "/ start"
  • E, no caso de uma comparação bem-sucedida, ela cria uma mensagem em resposta e a envia para o bate-papo, com o ID recebido anteriormente

Espero que você ache útil e interessante.

No futuro, mostrarei como é implementado nos meus bots:

  • uso de várias equipes
  • vinculando esses comandos aos manipuladores
  • multithreading: recebe e envia mensagens independentemente
  • formatação de mensagem
  • trabalhar com botões e retornos de chamada
  • editando postagens antigas

Nesta base, no acesso público, 2 dos meus bots agora trabalham para mim.

Uma coisa que você sabe é um assistente de planejamento de eventos .

E o segundo - fã de cinema atrevido . Ele adora filmes e sabe muito sobre eles. E ainda mais, ele gosta de compartilhar seu conhecimento com você. Ele lidera seu canal em um telegrama , no qual decide quais filmes ele gosta e os oferece a você. Ele sabe como criar seleções individuais por gênero e criar uma assinatura para recomendações personalizadas. Ele sabe como encontrar obras-primas das quais você nunca ouviu falar e nem sabia como esses filmes podem ser encontrados.

Por exemplo, você acha que existem filmes com uma combinação "selvagem" de gêneros como: documentário, horror, comédia.

Mas o bot sob comando

      2010- 

Ele dirá que de 2010 até o presente momento, esses filmes foram filmados em até 6 peças :)

Como trabalhar com comandos semelhantes, como analisar seqüências de caracteres e seqüências de comandos, discutiremos com você nas seguintes publicações.

Obrigado pela atenção. A programação é divertida :)

Source: https://habr.com/ru/post/pt476306/


All Articles