NestJS: Integrando un bot de Telegram en tu aplicación

Hola a todos, hoy os voy a explicar como podemos crear un bot de telegram y manejarlo con NestJs.

En NestJS, puede sernos muy útil tener un bot telegram para informar en un grupo o canal alertas o notificaciones que deba atender alguien de ese grupo, además de otras muchas utilidades.

Creando nuestro bot de telegram

Lo primero que necesitamos es tener una cuenta de telegram, ya sea descargando la app o desde su web. Obviamente, necesitarás un número de teléfono.

Usando el buscador, buscamos al usuario @botfather y abrimos una conversación con este usuario.

nestjs-bot-telegram

Escribimos /start para que nos dé una serie de comandos para crear nuevos bots o gestionar los que tenemos.

nestjs-bot-telegram

A continuación, crearemos un bot con /newbots, escribiremos el nombre del bot y su nombre de usuario.

nestjs-bot-telegram

Guarda ese token porque lo necesitaremos.

Creamos un nuevo canal y le damos un nombre.

nestjs-bot-telegram nestjs-bot-telegram

Es importante añadir nuestro bot como administrador en ese canal/grupo.

nestjs-bot-telegram

Nuestro bot ya esta preparado, pero antes de empezar con nestjs, necesitamos el chatId de ese canal. Si usas la web de telegram veras su id en la URL.

nestjs-bot-telegram

Guárdalo que lo usaremos mas tarde.

Integrando nuestro bot con NestJS

Vamos con la parte de nestjs, lo primero creamos nuestro proyecto, te dejo un tutorial sobre como hacerlo.

Como crear un proyecto con NestJS

Os aconsejo crear una carpeta modules dentro de src y nos posicionamos en ella.

Ejecutamos los siguientes comandos:

$ nest g mo bot-telegram
$ nest g co bot-telegram
$ nest g s bot-telegram

nestjs-bot-telegram

Asimismo crearemos una carpeta dto, con un fichero message-dto.ts


export class MessageDto {
    message: string;
    chatId: number;
}

No olvides importar el modulo creado en app.module.ts.


import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { BotTelegramModule } from './modules/bot-telegram/bot-telegram.module';

@Module({
  imports: [BotTelegramModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Antes de tocar más ficheros, necesitamos instalar la siguiente dependencia:

$ npm i nestjs-telegram

En el modulo, debemos importar el modulo de Telegram y poner el token que hemos que hemos obtenido de @botfather usando el método forRoot.

import { Module } from '@nestjs/common';
import { BotTelegramController } from './bot-telegram.controller';
import { BotTelegramService } from './bot-telegram.service';
import { TelegramModule } from 'nestjs-telegram';

@Module({
  imports: [TelegramModule.forRoot({
    botKey: '6240638505:AAFwcBi9Z2D9frb9F2TqG-3MHvwtu1n_5Ys' // <- Tu Token aqui
  })],
  controllers: [BotTelegramController],
  providers: [BotTelegramService]
})
export class BotTelegramModule { }

Vamos al controlador y pegaremos el siguiente código:

import { Body, Controller, Post } from '@nestjs/common';
import { MessageDto } from './dto/message-dto';
import { BotTelegramService } from './bot-telegram.service';

@Controller('bot-telegram')
export class BotTelegramController {

    constructor(private telegramService: BotTelegramService) { }

    @Post()
    sendMessage(@Body() messageDto: MessageDto) {
        return this.telegramService.sendMessage(messageDto.chatId, messageDto.message);
    }

}

Lo que estamos haciendo es crear un endpoint donde llamamos al método sendMessage del servicio BotTelegramService pasándole vía body un objeto del tipo MessageDto.

Ahora, con el servicio, pegamos el siguiente código:

import { Injectable } from '@nestjs/common';
import { TelegramSendMessageParams, TelegramService } from 'nestjs-telegram';

@Injectable()
export class BotTelegramService {

    constructor(private telegram: TelegramService) { }

    sendMessage(chatId: number, text: string) {

        const params: TelegramSendMessageParams = {
            chat_id: chatId,
            text
        };

        this.telegram.sendMessage(params).subscribe((result) => {
            if (result) {
                console.log("Mensaje enviado correctamente");
            } else {
                console.log("No se envio el mensaje");
            }
        }, (error) => {
            console.error("Error: ", error);
        })
    }

}

Injectamos el servicio TelegramService de la dependencia que hemos instalado.

En el método sendMessage, le pasamos el id del chat y el texto a insertar y al subscribirnos al sendMessage nos indicará si se mando o no el mensaje.

Con esto ya lo tenemos todo para probarlo, arranca el proyecto con el siguiente comando:

$ npm run start:dev

Probando nuestro bot con Postman

Con nuestro proyecto ya arrancado, podemos probar usando postman el resultado.

Le pasamos un objeto de tipo MessageDto que vimos antes, en texto del mensaje pon el que quieras.

El chatId, debemos poner el que guardamos antes pero poniendo un 100 delante.

Por ejemplo, si mi id es -1959258083 mi chat id es -1001959258083

nestjs-bot-telegram

Si enviamos la petición correctamente, veremos que en nuestro chat ese mensaje.

nestjs-bot-telegram

Por último, te dejo el repositorio donde tienes todo el código.

 

También te dejo un video explicando todo el proceso.

 

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *