Instrucciones de TelegramBot para crear funcionalidades básicas para el bot. (Parte 1)

No hace mucho tiempo, le sugerí que usara mi bot de telegramas.

Telegram Bot - Asistente de planificación de eventos

Habiendo recibido muchas preguntas en PM, me di cuenta de que la cuestión de crear bots para Telegram es bastante popular.

Me pidieron el código fuente del bot, me pidieron que compartiera ejemplos específicos de la implementación de varias características del bot, me pidieron que sugiriera algún tipo de funcionalidad para trabajar con el bot y los mensajes.

Decidí escribir una serie de artículos en los que quiero mostrar las cosas básicas que necesitará para escribir su bot.
Java, Maven, TelegramAPI, Lombok y Log4j te esperan.
A quién le importa, por favor, debajo del gato ...

Y voy directamente de la carta de triunfo :)

Lo solicitado en el artículo anterior.

Puede encontrar los códigos fuente para el proyecto aquí .

En la rama " maestra " habrá la versión final del bot, que escribiremos junto con usted, en el proceso de aparición de nuevos artículos.

La fuente completa de este artículo estará en la rama " Part1-Base ".

En esta parte, crearemos con usted una plantilla básica que podrá:

  1. registrarse bot en los servidores de Telegram
  2. recibir mensajes escritos al bot
  3. responder al comando / start

Crear un proyecto maven estándar


( Echaré de menos los manuales sobre cómo trabajar con el entorno de desarrollo y las cosas básicas de la programación Java. Todas estas cosas son bastante fáciles de google. Y si no funciona, escriba preguntas ).

Veamos qué dependencias necesitaremos en este proyecto.

En primer lugar, este es Lombok . ¿Qué es esto y por qué? Puede leer, por ejemplo, aquí .

Y asegúrese de agregar un registrador. Uso log4j y, un poco más, le mostraré lo útil que puede usarse al depurar esta aplicación y una comprensión más profunda del funcionamiento de 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> 

Y porque escribimos un bot para Telegram, luego la biblioteca misma de Telegram:

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

La estructura del archivo pom se puede encontrar aquí.
La estructura del archivo pom.xml se puede ver aquí .

A continuación, agregamos la clase base Bot.java , que implementará toda nuestra interacción con los servicios de Telegram. Trabajaremos con LongPolling, como Este método no requiere certificados de cifrado y puede iniciarse desde cualquier máquina que tenga Java a bordo.

Para hacer esto, heredamos de la clase TelegramLongPollingBot e implementamos los métodos básicos:

public void onUpdateReceived (Actualizar actualización)
public String getBotUsername ()
public String getBotToken ()

Y de nosotros mismos necesitaremos agregar un procedimiento que conecte nuestro bot a 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(); } } } 

En principio, todo. Este código puede conectarse a los servidores de Telegram y al recibir los mensajes dirigidos a él, registrará la información en el archivo de registro que recibió la Actualización.

Creemos una clase que ejecute nuestra aplicación.

Esto lo hará la clase App.java. Enlace al archivo: aquí

 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 puede ver, para que el bot funcione, solo necesitamos el "nombre del bot" y el "token", que pasaremos en el constructor de nuestra clase de Bot.

Puedes obtener el nombre y la ficha del bot del padre de todos los bots :) escribiéndole en un telegrama.
Su apodo: @BotFather
La comunicación con él es muy simple y concisa.

En comando
/ newbot

Como resultado, debería obtener este diálogo:



También escriben aquí que es más preciso, no muestre esta información a nadie, de lo contrario, otra persona podrá controlar su bot :)

Dirás que no soy muy preciso ... Tal vez, pero el padre de los robots nos permite cambiar los tokens y recuperar los que están en acceso público. Por lo tanto, cuando intente conectarse con mis datos, recibirá el siguiente mensaje:

 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 

Entonces con mis datos no puedes conectarte. Registra el tuyo. Especifique nuevos datos en la clase App.java

Ahora, al ejecutar el método principal en la clase App, dejamos que nuestro bot se conecte y esperemos nuevos mensajes. Nos escribirá sobre sus acciones e intentos en la consola.

Log4j


Recuerde, anteriormente hablé sobre la utilidad de la biblioteca log4j. Y aquí, para los curiosos, se abre un klondike de datos útiles.

El archivo log4j.properties ya contiene configuraciones básicas para el registro y niveles de registro específicos para clases de terceros y para aquellos que trabajan en nuestro bot.

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

El nivel básico de registro se indica como Error.

Para las clases Bot y App, se indica la salida del registro en el nivel de depuración.

¿Cuáles son estos niveles y en qué se diferencian? Puede encontrarlos fácilmente en Google.

Si desea ver cómo y en qué orden la biblioteca de Telegram realiza todas sus acciones, cambie el modo de registro general a un nivel inferior: información o depuración.

Y cuando inicie la aplicación, verá en la consola cuántas cosas interesantes suceden en el proceso de conexión y funcionamiento. ¿Cuántas veces se encuesta sus funciones con el nombre del bot y el token?

Los niveles de registro cambian con esta línea:
Para obtener los registros de acuerdo con el nivel de información, póngalo así:

 log4j.rootLogger= info, file 

Para el nivel de depuración, así:

 log4j.rootLogger= debug, file 

Y en conclusión


Ahora tenemos un bot: se conecta, nos muestra hermosos registros e informa que llegan mensajes.

Pero arriba, te prometí que el bot responderá al comando de inicio. Cambiemos un poco el procedimiento responsable de procesar los mensajes recibidos.

 @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 puede ver en el código, el bot hace lo siguiente:

  • Recibe una actualización y captura su número de identificación en el registro.
  • Recupera la ID de chat y el texto del mensaje del mensaje transmitido
  • Comprueba si este texto es un comando "/ start"
  • Y en caso de una comparación exitosa, crea un mensaje en respuesta y lo envía al chat, con la identificación recibida anteriormente

Espero que lo encuentres útil e interesante.

En el futuro te mostraré cómo se implementa en mis bots:

  • uso de varios equipos
  • vincular estos comandos a los controladores
  • multihilo: recibe y envía mensajes de forma independiente
  • formato de mensaje
  • trabajar con botones y devoluciones de llamada
  • edición de publicaciones antiguas

Sobre esta base, en acceso público, 2 de mis bots ahora funcionan para mí.

Una cosa que sabes es un asistente de planificación de eventos .

Y el segundo: fanático de las películas . Le encantan las películas y sabe mucho sobre ellas. Y aún más, le gusta compartir sus conocimientos contigo. Dirige su canal en un telegrama , en el que decide qué películas le gustan y se las ofrece. Él sabe cómo crear selecciones individuales por género y crear una suscripción a recomendaciones personalizadas. Él sabe cómo encontrar obras maestras de las que nunca has oído hablar y ni siquiera sabía cómo se pueden encontrar esas películas.

Por ejemplo, ¿crees que hay películas con una combinación de géneros tan "salvaje" como: documental, terror, comedia.

Pero el bot al mando

      2010- 

Él dirá que desde 2010 hasta el momento presente tales películas han sido rodadas hasta 6 piezas :)

Cómo trabajar con comandos similares, cómo analizar cadenas y secuencias de comandos que discutiremos con usted en las siguientes publicaciones.

Gracias por su atencion La programación es divertida :)

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


All Articles