Ilustración con un robot y icono de Telegram

En este artículo se explica cómo desarrollar un bot básico para Telegram usando Node.js y la librería Telegraph. Este bot podrá responder a comandos, manejar eventos, guardar imágenes enviadas y enviar archivos o mensajes personalizados.

¿Qué es Telegraph?

Telegraph es una librería que funciona como un wrapper  de la API de Telegram. Esto quiere decir que simplifica la interacción con la API al ofrecer funciones ya preparadas para realizar tareas comunes, como manejar comandos o enviar mensajes, reduciendo el código necesario.

Requisitos previos

  1. Node.js instalado en tu sistema. Puedes descargarlo desde Descargar Node
  2. Un editor de código, como Visual Studio Code.
  3. Cuenta de Telegram para crear y administrar el bot.

Paso 1: Crear el bot en Telegram

  1. Abre Telegram y busca el bot BotFather.

Captura de telegram

  • Escribe /newbot y sigue las instrucciones:

Captura de telegram 

  • Ingresa un nombre para el bot
  • Proporciona un nombre de usuario que termine en "bot" (en este caso, "codeinprogress_bot").
  • BotFather te entregará un token. Este será necesario para conectar tu bot con la API de Telegram.

Captura de Telegram

Paso 2: Configurar el proyecto

  1. Crea una carpeta para el proyecto y ábrela en tu editor de código.
  2. Inicializa un proyecto de Node.js con:
    npm init -y
     
    Captura de la terminal
  3. Instala las dependencias necesarias:
    npm install telegraf axios
 

Captura de la terminal

Paso 3: Configuración básica del bot

  • Crea un archivo llamado main.js se configura las dependencias.

Captura de codigo

  • Luego, se crean las variables para almacenar el token y help.

Captura de codigo

Paso 4: Manejar eventos básicos

  • /start Este comando se usa para iniciar la interacción con el bot.
  • /help Este comando viene predeterminado para la opción de ayuda. 
  • /random Este comando es personalizado. 

Captura de los eventos en visual code

  • Puedes crear comandos para realizar tareas específicas, en este caso con el comando personalizado /random  para generar un número aleatorio: 
  • Primero se define la función random, que genera un número aleatorio entre 0 y un número máximo especificado, y la utiliza en un comando /random

Captura de la funcion random en visual stude code

Recuerda, guarda los cambios y ejecuta el archivo:

node main.js

Paso 5: Manejar eventos personalizados

En este paso se añaden funcionalidades personalizadas al bot, en este caso: un comando avanzado para generar números aleatorios, la detección de imágenes enviadas por el usuario, y la devolución de una imagen desde el local.

1. Comando avanzado /advancerandom

El comando /advancerandom permite al usuario generar un número aleatorio dentro de un rango específico. Para usarlo, el usuario escribe el comando seguido de un número, como por ejemplo /advancerandom 50. El bot verifica si el número ingresado es válido:

  • Si el número es menor o igual a 0, o si no es un número, el bot responde con un mensaje explicando cómo usar el comando correctamente.
  • Si el número es válido, el bot genera un número aleatorio entre 0 y el número ingresado, y lo devuelve al usuario.

2. Manejo de imágenes enviadas por el usuario

Cuando el usuario envía una foto al bot, este detecta la imagen y guarda una copia en el servidor. Para lograr esto:

  • El bot selecciona la última versión de la foto enviada.
  • Obtiene un enlace directo al archivo utilizando la API de Telegram.
  • Descarga la imagen al servidor en una ubicación predefinida. Finalmente, el bot confirma al usuario que la imagen ha sido recibida correctamente.

3. Devolver una imagen al usuario

El bot  /sendphoto que permite al usuario recibir una imagen específica almacenada en el local. Cuando el comando es ejecutado, el bot envía la imagen predefinida al chat del usuario.

Captura de codigo

Con este bot ya tienes una base para empezar a experimentar y agregarle más cosas según lo que necesites o quieras probar.  También puedes encontrar el tutorial completo en el siguiente link Como crear un bot de Telegram usando JavaScript con NodeJS y la librería Telegraf
Te comparto el código para que puedas explorarlo. 

const { Telegraf } = require('telegraf');
const axios = require('axios');
const fs = require('fs');
const { resolve } = require('path');
const { rejects } = require('assert');

const bot = new Telegraf('Tu Api');

const helpMessage = 'Este es un bot de tutorial para codeInProgress'

const downloadImage = (url, image_path, ctx) =>
    axios({ url, responseType: 'stream' }).then((response) => {
        response.data
            .pipe(fs.createWriteStream(image_path))
            .on('finish', () => {
                ctx.reply('Almacenada correctamente');
                resolve();
            })
            .on('error', (e) => {
                ctx.reply('No pude almacenarla correctamente :(');
                reject(e);
            });
    });

function random(number) {
    return Math.floor(Math.random() * (number + 1));
}

bot.start((ctx)=>{
    ctx.reply('Bienvenido a CodeInProgress')
})

bot.help((ctx)=>{
    ctx.reply(helpMessage)
})

bot.command('random', (ctx)=>{
    ctx.reply(random(100));

})
 bot.command('advancerandom', (ctx)=>{
    const message = ctx.update.message.text
    const randomNumber = Number(message.split(' ')[1])

    if(isNaN(randomNumber) || randomNumber <=8){
        ctx.reply('Por favor escribe /advancerandom seguido de un numero mayor de 0, ejemplo: advancerandom 10')
    } else{
        ctx.reply(random(randomNumber));
    }
 })
 bot.on('photo', (ctx)=>{
    const fileid =ctx.update.message.photo.pop().file_id
    ctx.telegram.getFileLink(fileid).then((response)=>{
        downloadImage(response.href, './photo.jpg', ctx);
    })
    ctx.reply('Me has enviado una foto')
 }
)
bot.command('sendphoto', (ctx)=>{
    ctx.replyWithPhoto({source:'resp.webp' })
})

bot.launch()

 

 

Code In Progress with ❤️ by Juan Pablo Amador