Não faz muito tempo, sugeri que você usasse meu bot de telegrama.
Telegram Bot - Assistente de Planejamento de EventosTendo 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:
- registrar bot em servidores Telegram
- receber mensagens gravadas no bot
- 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.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <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) {
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:
@BotFatherA 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.javaAgora, 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 :)