Antes de empezar con nada del proyecto, os adelanto que para este howto vamos a necesitar un espacio donde publicar la lógica de nuestro bot, yo uso heroku, porque lo tengo enlazado a mi repositorio de Github, así que tan solo tengo que hacer commit a mi rama master y la magia del desligue se produce.
Os comento que es lo que voy a mostraros, mi hermano me preguntó por algún bot que te permitiese el envío de un email a un destinatario, él había localizado @todolist_bot, pero no se fiaba mucho. Así que me puse manos a la obra para hacerle un bot muy simple con una función muy concreta.
He intentado usar el menor número de paquetes posible, tanto es así que tan sólo he usado dos node-telegram-bot-api y nodemailer.
Node-telegram-bot-api
Este paquete es la primera la vez que lo uso, me ha gustado la verdad, porque tiene lo que se le pide a un paquete de Node.js, que sea claro ligero y conciso.
Tiene un tutorial bastante simple, pero ya os adelanto que más o menos tiene las cosas más comunes, si no os gusta hay como 20 paquetes para hacer bots para telegram con Node.js
Nodemailer
El el paquete más común para el envío de correos electrónicos con Node.js. Ojo si usas una cuenta de gmail para el envio de correo electrónico, recuerda que debes de aceptar el acceso a tu cuenta desde herramientas de terceros.
Accede a esta url para poder cambiar la configuración de tu cuenta de correo. https://myaccount.google.com/lesssecureapps?pli=1
Creación de proyecto
Vamos a meternos en faena, como siempre debemos inicializar nuestro proyecto.
A mi personalmente me gusta hacerlo responiendo las preguntas del npm-cli, así que siempre uso la sentencia:
1 |
npm init |
Si es muy molesto pues ya sabeis, usar la instrucción que os crea todo automáticamente y ya lo tocais lo que no os guste.
1 |
npm init -y |
Ahora es momento de añadir los dos paquetes que hemos mencionado, recordar poner al final –save para que se edite nuestro package.json
1 |
npm i node-telegram-bot-api nodemailer --save |
Se debería quedar el apartado dependencias más o menos como esto (teniendo en cuenta que las versiones pueden variar)

Consideraciones de los bots de Telegram
Debes de tener una cosa muy importante cuándo programes un bot para telegram con Node.js o con cualquier lenguaje de programación. Se debe usar desde un servidor con certificado. Tienes dos opciones, montarte en local uno con un certificado o usar un servicio de alojamiento para aplicaciones Node.js.
Yo me he decantado por la segunda opción porque es más rápido y porque estoy acostumbrado a usar heroku para mis pruebas de concepto.
Por otro lado tenemos que tener en cuenta que debemos precrear nuestro bot en el ecosistema de telegram.
Usar Botfather

El padre de todos los bot en telegram es @Botfather. En el debemos de crear nuestro bot dándole un nombre público y un nombre de usuario, teniendo en cuenta que es obligatorio que el nombre de usuario tenga la palabra bot. Esto se hace para detectar claramente que está tratando con un robot.
A parte de darnos nuestro token de bot, desde @Botfather podremos definir los comandos que usara nuestro bot en telegram, biografía o imagen.
El código
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
const TelegramBot = require('node-telegram-bot-api'); const Nodemailer = require('nodemailer'); // replace the value below with the Telegram token you receive from @BotFather const token = process.env.FEDETOKEN; // Create a bot that uses 'polling' to fetch new updates const bot = new TelegramBot(token, {polling: true}); //Autorizar el acceso a tu cuenta por terceros. //https://myaccount.google.com/lesssecureapps?pli=1 const transporter = Nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.MAILUSER || 'tucorreo@gmail.com', pass: process.env.MAILPASS || 'tucontraseña' } }); let mensaje = ""; let mailOptions = { from: process.env.MAILUSER ||'tucorreo@gmail.com', to: process.env.MAILTODO ||'mi-amigo@yahoo.com', subject: 'Hola', text: mensaje }; // Matches "/echo [whatever]" bot.onText(/\/echo (.+)/, (msg, match) => { // 'msg' is the received Message from Telegram // 'match' is the result of executing the regexp above on the text content // of the message const chatId = msg.chat.id; const resp = match[1]; // the captured "whatever" // send back the matched "whatever" to the chat bot.sendMessage(chatId, resp); }); bot.onText(/\/test/, (msg, match) => { const chatId = msg.chat.id; bot.sendMessage(chatId, "Hola " + msg.from.username); }); bot.onText(/\/todo (.+)/, (msg, match) =>{ const newItemTODO = match[1]; mailOptions.subject = newItemTODO; if(isUserAtorizated(msg.from.username)){ transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log('Email enviado: ' + info.response); bot.sendMessage(chatId, 'Tarea '+ newItemTODO +' registrada'); } }); } }); function isUserAtorizated(username){ switch(username){ case 'josemasf': return true; default: return false; } } |
Para salvaguardar mi bot programado en Node.js para telegram, he hecho uso de las variables de entorno.
Mediante la función isUserAtorizated controlo el acceso a mi bot, para evitar que lo usen usuarios no autorizados. Como podeis ver no tiene mucha historia y es muy sencillo de implementar, con tan solo 70 lineas tenemos un bot que manda email cuando usamos el comando /todo en telegram con él.
Ya solo nos quedaría subirlo a heroku y lo tendremos funcionando.