Un Bot para Telegram: Caraotas con Mayonesa

Antes de empezar, quiero aclarar que este post se origina porque un amigo dijo “hacer un bot para Telegram debe ser difícil y debe llevar tiempo configurarlo”. A raíz de ello, aquí explico una forma sencilla y fácil, quizás no la forma eficiente, quizás no la estándar, pero es una manera funcional 😊.

Un bot (derivación de robot, así como ama de mamá) es un programa que ejecuta tareas repetitivas, tediosas o que simplemente un ser humano no quiere realizar. Existen bots para buscar información en la red, bots para dar respuestas rápidas a usuarios o hasta mantener conversaciones (chatbots). Dependiendo de las características del bot, su complejidad puede varias. Actualmente, diversas plataformas permiten la creación de bots como Facebook, Slack, Skype, Messenger, Telegram y muchos otros.

Existen diversos websites que permiten construir estos bots con unos cuantos clicks. Sin embargo, siempre es más divertido programarlos.

El punto inicial es la documentación oficial de Bots de Telegram, sin embargo, allí hay mucha información y puede ser complicado ubicarse.

Primer paso: BotFather

Debes tener Telegram instalado, y buscar a botfather. Obviamente hay muchas cosas que se pueden hacer, en todo caso puedes revisar la ayuda escribiendo (es decir, enviándole un mensaje) /help

Para crear un nuevo bot, escribir /newbot y seguir las instrucciones (ver la siguiente imagen). En este caso, nuestro bot se llamará Caraotas con Mayonesa, y su username (i.e. id) será caraotas_bot.

Ya para este punto, el bot está creado. Es importante destacar que se generó un token para tener acceso al API, en mi caso es 541274016:AAE_0V1biPLCuf-jBDTY9Br7B3Xc81bOo1g. Ya el bot está disponible en Telegram, y se puede buscar. Sin embargo, no responde a ningún mensaje: este es el siguiente paso.

Segundo Paso: Configurar el bot

Cuando el bot recibe un mensaje, este mensaje se envía al servidor como una invocación al API de Telegram. Este servidor es quien procesa y envía las respuestas a los mensajes. Principalmente, hay dos formas de manejar estos mensajes:

  1. Long pollings: De forma periódica se revisan los mensajes enviados (asíncrono).
  2. Webhooks: Cada vez que el bot recibe un mensaje, se hace una llamada al API (síncrono).

El ejemplo de este post es con webhooks, tambien llamado update object, donde se requiere de un servidor para verificar que el código que escribimos no tenga errores. Para ello, se utilizará node.js con npm.

Se procede a crear una carpeta para el proyecto y ejecutar npm init en dicha carpeta. Al ejecutar dicho comando, es recomendable llenar los campos que irán solicitando que son las características del proyecto como nombre del paquete, versión, descripción, punto de entrada (archivo al cual accederá, aka el main), entre otros. En la carpeta, se creará el archivo package.json, si es así todo marcha bien.

Luego se debe instalar algunos paquetes, en este caso, express, axios y body-parser

npm install --save express axios body-parser

Ahora, se crea el archivo identificado como punto de entrada (en mi caso, index.js), y copiamos lo siguiente:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
const axios = require('axios')

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({
  extended: true
})); // for parsing application/x-www-form-urlencoded

//This is the route the API will call
app.post('/new-message', function(req, res) {
  const {message} = req.body
  //Each message contains "text" and a "chat" object, which has an "id" which is the chat id
  if (!message)
    return res.end();

  var strMsg = message.text.toLowerCase().trim();  // remove spaces at begin and end, also lowercase
  
  if (strMsg.indexOf('hola') >= 0 || strMsg.indexOf('hello') >= 0)
  {
    // Respond by hitting the telegram bot API and responding to the approprite chat_id
    // "https://api.telegram.org/bot<your_api_token>/sendMessage"
  axios.post('https://api.telegram.org/bot541274016:AAE_0V1biPLCuf-jBDTY9Br7B3Xc81bOo1g/sendMessage', {
    chat_id: message.chat.id,
    text: strMsg + ' back my friend :-)'
  })
    .then(response => {
      // We get here if the message was successfully posted
      console.log('Message posted')
      res.end('ok')
    })
    .catch(err => {
      // ...and here if it was not
      console.log('Error :', err)
      res.end('Error :' + err)
    })
  }

});

// Finally, start our server
app.listen(6666, function() {
  console.log('Telegram app working well! (6666)!');
});

Este código se puede ejecutar con node, como

node index.js

Debería aparecer el mensaje “Telegram app working well! (6666)!” en la consola donde se ejecutó la instrucción anterior. Este código ahora debe ser público (y ejecutándolo de localserver no servirá). Entonces, es necesario hacer un deploy de este código para colocarlo en un servidor público.

Tercer paso: Deployment

Para el deploy, usaremos el servicio now

npm install -g now

Ahora, se debe indicar cuál archivo es el punto inicial de ese deploy. Para ello se modifica el archivo package.json, y debería quedar como el siguiente:

{
  "name": "caraotas",
  "version": "1.0.0",
  "description": "testing the telegram bot",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node index.js"
  },
  "author": "esmitt",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.17.1",
    "body-parser": "^1.18.2",
    "express": "^4.16.2"
  }
}

El cambio respecto al original, es la línea donde se indica cómo se debe ejecutar (“start”: node index.js).

Perfecto, ahora ejecutar now. Si es la primera vez que se ejecuta, no existirán credenciales para utilizarlo por lo que debes crearlas. Para ello, debes colocar tu email y llegará a tu inbox un mensaje de now@zeit.com con un código (realmente es un string). Si aceptas, ¡verificas que realmente existes! Es posible que en el futuro el email llegue de otro remitente.

Luego, vuelve a escribir now y esta vez hará el deploy de tu código, y desde este momento todas las acciones que hagan serán públicas. es decir, está disponible para cualquiera. Lo importante es conocer la dirección donde se almacena. Debería aparecer algo como https://caraotas-zxspanrzex.now.sh el cual es el deploy actual (esto aparece al lado derecho de la frase> Ready!. De hecho, tú API está en https://caraotas- zxspanrzex/new-message como se colocó en index.js

Cada instrucción now, crea un deploy. Hay un número limitado de deploys que puedes realizar, y los ves haciendo now ls.

Si tienes más de 3 deploys, he intentas crear uno nuevo te aparecerá el mensaje Too many active deployment instances. En ese caso, debes eliminar alguno con now rm <url>, donde <url> es alguno de los listados con now ls. Claro, esta limitación es solo porque estamos usando el plan gratuito (OSS plan).

Cuarto paso: Ejecutarlo

Ya el bot existe, y un servicio que responde mensajes. Sin embargo, ¡todo esto no lo sabe Telegram! Para ello usamos curl:

curl -F "url= https://caraotas-zxspanrzex.now.sh/new-message" https://api.telegram.org/bot<your_api_token>/setWebhook

 

¡Y listo! Ya puedes hablar con tu bot. Dile hola o hello y te responderá con codigo hecho por tí. Obviamente hay cosas mucho más complejas de las mostradas aquí, pero es un buen inicio.

El código de este bot, puedes descargarlo de https://github.com/esmitt/TelegramBot.

Esta es mi implementación, como mencione, existen muchas otras formas, pero esta fue divertida.

Resumen: ¡Piensa un reto tecnológico, y hazlo! Aún sea “pequeño”, será un logro.

Anuncios

Acerca de smittynpro

Escribiendo algunas cosas de computación gráfica
Esta entrada fue publicada en Bibliotecas, Código y etiquetada , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s