Saludos, mis queridos amigos. Sí, sí, exactamente amigos. Ya me he familiarizado tanto con esta serie de artículos que aquellas personas que regularmente escriben su agradecimiento en los comentarios y/o demuestran que han leído y comprendido el material ya se han vuelto cercanas. Tú y yo avanzamos desde ambos lados hacia el mismo objetivo. Quieres entender, pero yo quiero explicar. Y tenemos el mismo objetivo final: una solicitud escrita que sea comprensible para usted de principio a fin. Es posible que ya hayas oído hablar de gran parte de lo que describiré en este artículo. No creo que les diga nada nuevo y extraordinario (pero en el marco del proyecto es necesario saber/repetir esto).
En la primavera escribí un bot para mí, así que confiaremos en sus "patrones".
A continuación, se nos pide que le demos un nombre a este bot. Dado que se trata de un bot para tareas de prueba, su nombre será apropiado: [PRUEBA] JavarushBot
Ahora es el momento de darle un nombre único por el cual siempre se pueda encontrar: su nombre de usuario: test_javarush_community
Como dije anteriormente, debes agregar el _bot sufijo para nombre de usuario, así que escribimos nuevamente: test_javarush_community_bot
¡Y listo! El bot ha sido creado. Ahora, usando nombre de usuario y token, se puede conectar a nuestro proyecto. Por supuesto, para el buen funcionamiento del servidor de prueba, no mostraré el token (esencialmente una contraseña para acceder al bot) de este bot para que lo vea el público.
Según la descripción, solo necesitamos crear una nueva clase, heredar de TelegramLongPollingBot y agregar esta clase al contexto de aplicación de nuestro SpringBoot. El contexto de la aplicación es el lugar donde se almacenan los objetos creados para ejecutar el proyecto. Para agregar una clase, debe usar una de las anotaciones: @Component, @Service, @Repository, @Controller. O la anotación @Bean si se crea a través de un método en una clase de configuración (es decir, en una clase marcada con la anotación Configuración). Entiendo que todo esto todavía pueda parecer incomprensible. Pero cuando empieces a entenderlo, verás que no hay nada complicado allí. Para comprender rápidamente Spring Boot, recomiendo un libro interesante: Spring In Action, quinta edición. Si lo deseo, puedo escribir una serie de artículos basados en este libro. Volvamos. En el paquete que contiene JavarushTelegramBotApplication, creamos el paquete bot , que contendrá nuestro bot de Telegram. Su nombre será JavaRushTelegramBot :
SpringBoot tiene una excelente anotación: @Value. Si se usa correctamente, extraerá los valores del archivo application.properties. Actualizamos el proyecto con esto:
En los registros vemos que el bot se ha iniciado. Entonces, es hora de ir a Telegram y escribirle al bot:
Hacemos clic en iniciar e inmediatamente recibimos una respuesta:
Escribamos más basura para verificar:
Y listo, en este punto podemos decir que nuestra tarea JRTB-2 está completa . Realmente no puedes escribir ninguna prueba aquí todavía, así que dejaremos todo como está. A continuación necesitas crear un nuevo compromiso:
presta atención al nombre del compromiso: nuevamente llamo tu atención sobre esto. Una confirmación primero contiene el nombre de la tarea y luego una descripción más detallada de lo que se ha hecho. Haga clic en Confirmar y enviar... y confirme haciendo clic en Enviar nuevamente :
Vaya a nuestro proyecto . Como antes, GitHub ya vio la nueva rama y ofrece crear una solicitud de extracción para main. No nos resistimos y lo creamos:
como siempre, ya hemos elegido un sello, un proyecto y me lo hemos asignado. Finalmente, haga clic en Crear solicitud de extracción. Esperemos un poco mientras se completa la compilación, y eso es todo, la solicitud de extracción está lista para fusionarse:
La versión es 0.0.1-SNAPSHOT . Esta es la versión de servicio. Y comenzaremos actualizando la versión del proyecto con cada nuevo problema resuelto. Hasta que lleguemos a MVP, la versión vendrá con el sufijo -SNAPSHOT. ¿Cuál será el esquema de versiones? XYZ-INSTANTÁNEA Donde:
Vaya al archivo RELEASE_NOTES, donde describiremos los cambios en el proyecto con cada nueva versión:
Nuestra primera entrada. Ahora, con cada actualización de versión posterior, describiremos aquí qué sucedió exactamente. Comprometemos este caso, escribimos una descripción: JRTB-2: versión del proyecto actualizada y agregada a RELEASE_NOTES Todo es exactamente igual que antes. Estamos esperando que se apruebe la compilación y podamos fusionar nuestros cambios. Sólo que aquí será un poco diferente. Quiero asegurarme de que cada tarea en la rama principal sea una confirmación separada, por lo que simplemente enviar una solicitud de extracción de combinación no funcionará para nosotros. Git tiene la opción git squash, que reúne todas las confirmaciones en una y las fusiona. Seleccionamos esta opción:
Hacemos clic en Squash and Merge, y se nos ofrece editar el mensaje, que al final será:
Muy conveniente y lo más importante, lo que hay en demanda. Por cierto, no he visto esa característica en bitbucket =/ Confirmar la fusión. Lo único que queda es cambiar el estado de la tarea a Listo en nuestro tablero, escribir un comentario con un enlace a la solicitud de extracción y cerrarlo:
Nuestro tablero ahora se ve así:
Gracias a ellos por esto! ¿Qué hacer ahora? Ya no será posible borrarlo del git, ya que incluso si subo un nuevo commit sin este token, seguirá estando en el antiguo. Pero no quiero eliminar ni revertir la confirmación. Así que fui y desactivé el token del ya mencionado BotFather. Ahora el token está ahí, pero ya no es válido. Suscríbase a mi cuenta de GitHub para ver todo el código antes de publicar el artículo. Gracias a todos por leer, nos vemos pronto.
Escribimos JRTB-2
Haremos lo mismo que hicimos en el artículo con la tarea JRTB-0 :- Actualizamos la rama principal en el proyecto local usando la combinación ctrl + t .
- Basado en la rama principal, creamos:
- Agrega un robot.
- Creamos una nueva confirmación con una descripción de lo que se ha hecho y la enviamos a GitHub.
- Cree una solicitud de extracción para la rama principal y verifíquela nuevamente. Estamos esperando que se complete la compilación (acciones de github), fusionarla con la rama principal.
- Cierra la tarea correspondiente.
¿Qué es un robot de Telegram?
Nosotros, los desarrolladores, podemos imaginarnos trabajando con un bot de Telegram como este: utilizamos su cliente para trabajar con ellos. Disponemos de una biblioteca preparada para trabajar. Hay un conjunto de acciones tras las cuales el bot de Telegram sabrá que está asociado a nuestro programa. Y ya dentro del programa aprenderemos a recibir cartas, comandos y de alguna manera procesarlos. Existe un comando en los robots de Telegram : comienza con una barra diagonal "/". Después de eso, inmediatamente escribimos la palabra juntos, y esto se considerará un comando. Por ejemplo, hay dos comandos que todo el mundo debería conocer:- /start — empieza a trabajar con el bot;
- /stop - finaliza el trabajo con el bot.
Crea un bot con BotFather
Para conectar un bot, primero debes crearlo. Telegram tiene un enfoque: crear un bot con su propio nombre único. También irá acompañado de un token (una cadena grande que funciona como una contraseña). Ya creé un bot para JavaRush: @javarush_community_bot . Este bot todavía está vacío y no puede hacer nada. Lo principal es que al final del nombre debe aparecer _bot . Para mostrar cómo hacer esto, crearé un bot en el que probaremos nuestra funcionalidad. En términos de proyectos reales, este sería un entorno de prueba. Y nuestro principal será el entorno de producción (prod - producción, es decir, el entorno real en el que se ejecutará el proyecto). Por supuesto, sería posible agregar otro entorno: un entorno sandbox: un entorno sandbox común, más modificable y accesible para todos los participantes en el desarrollo. Pero esto sólo complicará la situación en la etapa de creación del proyecto. Por ahora, creemos dos bots más para prueba y para entorno sandbox. El primer paso es crear (registrar) un bot en Telegram. Necesitamos encontrar el bot: @BotFather y escribirle el comando: /newbot.!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 4](https://cdn.javarush.com/images/article/da251e55-7d65-405d-8269-eae59ddec3fd/1080.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 5](https://cdn.javarush.com/images/article/cf774e29-d1bd-45ac-be63-4eec1ace7c8b/1080.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 6](https://cdn.javarush.com/images/article/bc2012c9-a5fd-409c-9afb-d731c2498ba9/1080.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 7](https://cdn.javarush.com/images/article/fb211e24-7ad5-4826-93ac-131f48bec30b/1080.jpeg)
Conectamos el bot al proyecto.
No incluiremos la biblioteca como de costumbre, pero aprovecharemos inmediatamente nuestro esqueleto: SpringBoot. Tiene algo llamado Starter. Al incluir la biblioteca, podemos usarla para hacerle saber a SpringBoot que queremos configurar el proyecto correctamente. Si siguiéramos la ruta habitual, que se describe en muchos lugares, necesitaríamos crear una configuración en algún lugar que tuviera algo como esto:ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
telegramBotsApi.registerBot(Bot.getBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
Aquí se crea un objeto con el que puedes establecer una conexión con el bot. En nuestro caso, el motor de arranque que queremos conectar hará todo por nosotros en algún lugar "debajo del capó" (esta es también una traducción de una frase de uso frecuente en TI: debajo del capó). Aquí hay un enlace a este iniciador . Puede ver inmediatamente en el archivo README.md qué es, por qué y cómo usarlo. Para conectarlo, sólo necesitas agregar esta dependencia a la memoria. Eso es todo :) Aquí está la dependencia requerida:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.0.1</version>
</dependency>
Lo agregamos a nuestra memoria. Instalamos la versión como se esperaba y actualizamos el proyecto Maven. !["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 8](https://cdn.javarush.com/images/article/f4f45c30-c562-4961-b5c7-c08d60352a05/800.jpeg)
package com.github.javarushcommunity.jrtb.bot;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;
/**
* Telegrambot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {
@Override
public void onUpdateReceived(Update update) {
}
@Override
public String getBotUsername() {
return null;
}
@Override
public String getBotToken() {
return null;
}
}
Esta clase era abstracta y se debían implementar tres métodos. Hablemos de ellos con más detalle:
- onUpdateReceived(Actualización de actualización) : este es el punto de entrada al que llegarán los mensajes de los usuarios. Toda nueva lógica vendrá de aquí;
- getBotUsername() : aquí debe agregar el nombre de usuario de nuestro bot al que nos conectaremos;
- getBotToken() - y este, en consecuencia, es el token del bot.
- bot.nombre de usuario ;
- token.bot .
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 9](https://cdn.javarush.com/images/article/f49789c6-3378-42d7-9da2-c7e7ec38b72c/512.jpeg)
package com.github.javarushcommunity.jrtb.bot;
import org.springframework.beans.factory.annotation.Value;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;
/**
* Telegram bot for Javarush Community from Javarush community.
*/
@Component
public class JavarushTelegramBot extends TelegramLongPollingBot {
@Value("${bot.username}")
private String username;
@Value("${bot.token}")
private String token;
@Override
public void onUpdateReceived(Update update) {
}
@Override
public String getBotUsername() {
return username;
}
@Override
public String getBotToken() {
return token;
}
}
Se puede ver que pasamos el valor de la variable a la anotación. Y cuando SpringBoot crea nuestro objeto bot, los valores se tomarán de las propiedades (nuevamente, papel de calco del inglés - propiedades). Casi estámos allí. Necesitas hacer que el bot responda algo. Por lo tanto, actualicemos el método onUpdateReceived . Necesitamos recuperar el mensaje que llegó al bot y devolverlo. De esta forma sabremos que el bot está funcionando. Para ello, escribiremos de forma aproximada y rápida lo que se necesita:
@Override
public void onUpdateReceived(Update update) {
if(update.hasMessage() && update.getMessage().hasText()) {
String message = update.getMessage().getText().trim();
String chatId = update.getMessage().getChatId().toString();
SendMessage sm = new SendMessage();
sm.setChatId(chatId);
sm.setText(message);
try {
execute(sm);
} catch (TelegramApiException e) {
//todo add logging to the project.
e.printStackTrace();
}
}
}
Aquí todo es extremadamente simple: comprobamos que el mensaje realmente existe, por lo que extraemos el mensaje en sí ( mensaje ) y el ID del chat ( chatId ) en el que se produce la correspondencia. A continuación, creamos un objeto para enviar un mensaje SendMessage , le pasamos el mensaje en sí y la ID del chat, es decir, qué enviar al bot y dónde. Ya tenemos suficiente de esto. A continuación, ejecutamos el método principal en la clase JavarushTelegramBotApplication y buscamos nuestro bot en Telegram: !["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 10](https://cdn.javarush.com/images/article/0e5175c2-2cea-4294-b6d8-2d7b42e5d0ec/1080.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 11](https://cdn.javarush.com/images/article/1bed4559-f9bf-43e5-b4b8-dcdd4eb4a2ed/512.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 12](https://cdn.javarush.com/images/article/392c2361-b04e-411e-8750-44ff8ac05b56/512.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 13](https://cdn.javarush.com/images/article/42578b38-d572-40a1-8c58-b56c9848dba3/512.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 14](https://cdn.javarush.com/images/article/fab24536-9f78-4d76-87aa-94662b19ad7b/512.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 15](https://cdn.javarush.com/images/article/bb41a8e6-2dee-4b14-be36-460e23b60ace/512.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 16](https://cdn.javarush.com/images/article/75880a98-5812-49e7-bc02-09d2d4fb5ff5/800.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 17](https://cdn.javarush.com/images/article/f63be8c4-31ec-47fb-af9b-dc621e0f3489/800.jpeg)
Versionado
De alguna manera no entendí el punto de que necesitamos hacer versiones. Para hacer esto, haremos algunos cambios más en nuestra rama. Volvemos a IDEA y miramos la versión del proyecto en la memoria:!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 18](https://cdn.javarush.com/images/article/5637da0d-2fe8-4d59-8674-f1790d03a305/512.jpeg)
- X: actualización de la versión principal, a menudo contiene problemas de compatibilidad con la versión anterior;
- Y - cambios no muy grandes, totalmente compatible con la versión anterior;
- Z es un contador de defectos que encontramos y reparamos.
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 19](https://cdn.javarush.com/images/article/44e2a45c-6291-4fdf-bda5-042e6a7ba595/800.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 20](https://cdn.javarush.com/images/article/138e13d9-499b-45d4-a2e7-e20d81cdf3a5/800.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 21](https://cdn.javarush.com/images/article/24112b77-07f4-4eb6-b649-5faf70bcf2d6/800.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 22](https://cdn.javarush.com/images/article/a583cdfc-9d42-4f03-b956-feeda0294423/800.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 23](https://cdn.javarush.com/images/article/d04861f7-8bc2-45c1-b589-6c9b328c2afb/800.jpeg)
!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 24](https://cdn.javarush.com/images/article/9a32e01a-6370-4fae-b8a5-ba7203aa5c89/800.jpeg)
Conclusión
Hoy creamos un bot de Telegram paso a paso y lo implementamos en nuestro proyecto SpringBoot. El bot funciona y da respuestas. Inmediatamente accedimos a los datos del bot a través de propiedades. Más por venir: haremos una gran pieza, realizaremos JRTB-3 , y agregaremos un patrón de comando para nuestro proyecto. Ah, una cosa más... Les dije que no publicaría el token para que no fuera utilizado. Pero como estaba escribiendo el artículo cerca de la medianoche y después del trabajo, resultó que había publicado un token válido en el repositorio, y GitGuardian me lo contó en una carta: ¡!["Proyecto Java de la A a la Z": agregar un bot de Telegram al proyecto - 25](https://cdn.javarush.com/images/article/573a85c7-ed5f-4f7a-84b4-daf515eedb33/512.jpeg)
GO TO FULL VERSION