12/04/2017: He actualizado el tutorial a la nueva versión de la API.

Si por algo se diferencia Telegram de WhatsApp es por el afán de los creadores de experimentar con nuevas adiciones al programa que lo diferencian no sólo de su competidor más directo, sino también del resto de aplicaciones de mensajería existentes. Y para mí, una de las adiciones que más útiles me han resultado han sido sin duda los bots, estos perfiles especiales llevados por un ordenador y cuyos usos pueden ser infinitos gracias a la poderosa API que han puesto a disposición del público.

Sin embargo, en Bytelix hemos pensado que en lugar de hacer una lista de bots que podéis utilizar, podemos enseñaros directamente cómo hacer vuestro propio bot mostrándoos las bases de cómo funcionan y lo que necesitáis para hacerlos.

Requisitos

Como todo, necesitamos previamente una serie de requisitos para realizar nuestro bot, en este caso se reducen básicamente a tener un ordenador, tablet o móvil con acceso internet, aunque os recomiendo que sea un ordenador, ya que para que nuestro bot funcione tendremos que programar, y creedme que programar sin teclado físico es un tanto engorroso.

Dicho esto, ¡comencemos con lo divertido!

Qué vamos a utilizar

Para programar nuestro bot vamos a utilizar una librería de Python llamada python-telegram-bot. Aquellos que sepan de programación sabrán lo que es Python y lo que es una librería, pero para aquellos que no hayan tocado código en su vida se estarán preguntando qué es cada cosa. Bien, vamos a ello.

¿Qué es Python? Básicamente es un lenguaje de programación. Podría tirarme horas hablando sobre las bondades del lenguaje y sobre cómo es, sin embargo aburriría a más de uno y esto da para más de un artículo. Lo que debéis de saber es que es un lenguaje de programación que vamos a utilizar para indicarle a nuestro bot qué y cómo hacer las cosas. También hay otros lenguajes con los que hacer lo mismo, pero he elegido Python principalmente por la sencillez del lenguaje en sí.

¿Qué es una librería? A la hora de programar siempre nos enfocamos en resolver un problema, en nuestro caso es hacer un bot para Telegram. Una librería nos va a facilitar esto poniendo en nuestra mano una serie de procedimientos para que no nos tengamos que preocupar nosotros de ellos. Por ejemplo, en nuestro pequeño proyecto va a surgir más de una vez el ¿cómo hago para que mi bot esté atento a los comandos que le llegan? Pues esta librería nos permite hacer esto simplemente llamando a un procedimiento que la otra persona ya ha hecho y probado, de modo que sólo nos tendremos que enfocar en hacer lo que nos interesa en lugar de tener que hacer también toda la parte de interactuar con los servidores de Telegram.

Una vez hablada la parte de programación, toca hablar de dónde vamos a tener corriendo nuestro bot, ya que necesitaremos un servidor (un ordenador conectado a la red que maneje las peticiones que se le hagan al bot) donde ejecutarlo. Aquí tenemos dos opciones: podéis instalar Linux en vuestro ordenador y tenerlo encendido las 24h del día (por ejemplo, podéis seguir nuestro tutorial de cómo instalar Ubuntu) o podéis utilizar Cloud9 que nos da uno básico de forma gratuita, y es la solución que más os recomiendo.

Montando nuestro servidor con Cloud9

Primero necesitaremos una cuenta en la página, así que nos dirigimos a c9.io y pulsamos sobre Sign In en la esquina superior derecha y después sobre Sign Up, el botón verde de la esquina superior derecha de nuevo.

Ahora rellenamos los campos que nos piden y pulsamos en Create your free account. También podéis iniciar sesión con GitHub BitBucket si tenéis cuenta en alguna de las dos webs.

Cloud9

Con esto ya tendremos nuestra cuenta en la página y podremos ponernos manos a la obra. Cuando iniciemos sesión nos aparecerá un resumen de los workspaces (espacios de trabajo) que tengamos:

Cloud9

Como nos acabamos de registrar sólo tendremos Demo Project, uno que viene de ejemplo con la página y que no nos interesa, ¡así que vamos a crear el nuestro propio! Pulsamos sobre Create a new workspace, lo cual nos llevará a la página de creación de nuestro espacio de trabajo, el cual vamos a utilizar como servidor propio.

Le ponemos un nombre, una descripción y nos aseguramos de que marcamos la casilla de Private, de este modo será privado y sólo nosotros podremos acceder al código y al bot en sí. Bajo Choose a template elegimos lo que muestro en la captura, Blank. Y pulsamos sobre Create workspace:

 

Captura de pantalla 2016-05-03 a las 11.45.44

Con esto ya tendremos creado nuestro pequeño servidor y ahora nos aparecerá en la lista anterior, desde donde pulsando en Open podremos ir a nuestra zona de trabajo para empezar a programar nuestro bot.

Cloud9

Preparando la zona de trabajo para el bot

Cloud9

Tal y como lo muestro en la captura de arriba debéis ver vosotros también vuestra zona de trabajo. ¡Ya estamos más cerca!

Ahora necesitamos por un lado poner Python 3 como nuestro intérprete por defecto (podéis utilizar Python 2 también si queréis y sabéis, aunque recomiendo la versión 3), instalar la librería y ponernos a programar nuestro bot.

Así que lo primero que haremos será ejecutar estos dos comandos (uno detrás de otro) en la consola que nos aparece más abajo:

sudo mv /usr/bin/python /usr/bin/python2
sudo ln -s /usr/bin/python3 /usr/bin/python

Una vez ejecutados estos comandos comprobamos que efectivamente sea Python 3 ejecutando python –version. Esto debería devolvernos Python 3.4.3 (o cualquiera que sea Python 3.x nos vale):

Cloud9

Ahora pasaremos a instalar la librería que necesitamos con este comando, justo en el mismo lugar donde hemos puesto los anteriores:

sudo pip3 install python-telegram-bot

Lo cual nos mostrará lo siguiente en pantalla si todo ha salido bien:

Captura de pantalla 2016-05-03 a las 12.38.07

Y con esto ya podemos ponernos a picar código para hacer nuestro bot.

Creando el bot

Ahora que ya tenemos toda nuestra zona de trabajo hecha nos hace falta registrar el bot en los servidores de Telegram para que los usuarios puedan llegar a él e interactuar. Para ello abriremos una conversación con un bot llamado BotFather, que será el encargado de crear, modificar y eliminar los bots que nosotros creemos.

Pulsamos sobre iniciar:

BotFather

Ahora pondremos el comando /newbot para que se lance el asistente de creación de bots. Este nos pedirá una serie de datos básicos sobre nuestro bot, en primer lugar el nombre y después el apodo que queremos asignarle, el cual debe acabar en bot:

BotFather

Una vez que hayamos dado la información que nos pide nos felicitará y nos dará un código de acceso al bot para utilizar con la API. Guardadlo, pues este código lo utilizaremos más adelante para conectar la librería que nos hemos descargado con el bot.

Ahora si pulsamos sobre el link que nos ha dado podemos ver que efectivamente nuestro bot ya aparece en Telegram y que podemos utilizarlo:

Bot

Pero sin embargo no hace absolutamente nada, ¡ni siquiera tiene comandos que podamos poner! Así que vamos a cambiar eso con BotFather. Volvemos a nuestra conversación con el padre de los bots para crear un par de comandos para nuestro bot.

Enviamos el comando /setcommands, el cual nos permite establecer los comandos de nuestro bot para que se muestren en la lista. Nos preguntará el bot al que queremos cambiar los comandos, así que seleccionamos el único que tenemos:

BotFather

Y ahora viene lo divertido: establecer los comandos. Para ello sólo tendremos que mandarle una lista con los comandos que queramos en el formato que nos especifican, el cual es el siguiente:

nombredelcomando - descripción

Por ejemplo, para nuestro bot de ejemplo de Bytelix vamos a poner dos comandos: holamundo, el cual saludará al que esté usando nuestro botlogo, que mandará una foto con el logo de Bytelix:

BotFather

Con esto nuestro bot ya tendrá asignada la lista de comandos que hemos puesto, como podemos comprobar si vamos de nuevo a la conversación con nuestro bot y pulsamos en Iniciar:

Bot

Ojo: A veces en el cliente de escritorio no aparecen al principio la lista de comandos, por eso la captura que he puesto arriba está hecha desde el móvil, porque allí aparecen al instante. Así que comprobadlo mejor desde la versión móvil de Telegram.

Con esto ya tenemos la lista de comandos del bot actualizada y todo listo para ponernos a programarlo, sin embargo nos hace falta un pequeño detalle: todavía no le hemos puesto ninguna foto al bot ni una descripción, así que lo cambiamos desde BotFather. En primer lugar pondremos la nueva foto con el comando /setuserpic, seleccionando nuestro bot y después enviándole la foto que queramos poner. Para la descripción basta con poner /setabouttext, seleccionar nuestro bot y después enviarle el texto que queremos que aparezca como descripción.

Y con esto ya tendremos nuestro bot listo:

Bot

Y ahora sí, ¡vamos manos a la obra con la programación!

Programando el bot

Ahora es donde empieza la parte realmente complicada de todo el tutorial, ya que tenemos que ponernos a programar el bot utilizando Python y la librería que os he indicado antes. Como hacer una introducción a la programación ahora sería una locura, pues el tutorial se nos haría eterno, voy a explicar en el propio código mediante comentarios algunas cosas básicas de cómo funciona cada línea que escribo, de modo que aquellos que no sepan mucho de programación pero tengan nociones básicas puedan seguir el tutorial. Pero sin embargo aquellos que no tengan siquiera nociones básicas no os preocupéis, podréis copiar el código tal cual os lo pongo y modificarlo para que funcione con vuestro bot, sin embargo no seréis capaces de llevarlo mucho más allá.

Si de verdad os interesa el mundillo y queréis aprender programación tras esto: ¡felicidades! Hay miles de libros, páginas web y recursos por dónde aprender. Si os interesa en especial Python podéis utilizar este tutorial interactivo online que han desarrollado los chicos de Codecademy que os explicará lo básico de la programación y de Python de una forma muy entretenida.

Dicho esto, ¡vamos manos a la obra! Vamos a crear el archivo donde pondremos el código de nuestro bot en Cloud9, para ello haremos click derecho sobre el nombre de nuestro workspace en la columna de la izquierda y pulsaremos sobre New file:

Cloud9

Le ponemos un nombre acabado en .py (en mi caso bot.py), pulsamos intro y damos doble click sobre él, lo cual nos abrirá un editor de código a la derecha vacío donde podremos empezar a escribir nuestro código.

Dentro pegaremos el siguiente código, el cual tengo explicado dentro del mismo:

# Importamos las librerías necesarias
from telegram.ext import Updater

# Método que imprimirá por pantalla la información que reciba
def listener(bot, update):
    id = update.message.chat_id
    mensaje = update.message.text

    print("ID: " + str(id) + " MENSAJE: " + mensaje)

# Método que utilizaremos para cuando se mande el comando de "start"
def start(bot, update):
    bot.sendMessage(chat_id=update.message.chat_id, text='¡Bienvenido al bot de Bytelix!')

# Método que mandará el mensaje "¡Hola, lector de Bytelix!"
def hola_mundo(bot, update):
    bot.sendMessage(chat_id=update.message.chat_id, text='¡Hola, lector de Bytelix!')

# Método que mandará el logo de la página
def logo(bot, update):
    # Enviamos de vuelta una foto. Primero indicamos el ID del chat a donde
    # enviarla y después llamamos al método open() indicando la dónde se encuentra
    # el archivo y la forma en que queremos abrirlo (rb = read binary)
    bot.sendPhoto(chat_id=update.message.chat_id, photo=open('Icono.png', 'rb'))

def main():
    # Creamos el Updater, objeto que se encargará de mandarnos las peticiones del bot
    # Por supuesto no os olvidéis de cambiar donde pone "TOKEN" por el token que os ha dado BotFather
    updater = Updater("TOKEN")

    # Cogemos el Dispatcher, en el cual registraremos los comandos del bot y su funcionalidad
    dispatcher = updater.dispatcher

    # Registramos el método que hemos definido antes como listener para que muestre la información de cada mensaje
    listener_handler = MessageHandler(Filters.text, listener)
    dispatcher.add_handler(listener_handler)

    # Ahora registramos cada método a los comandos necesarios
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("holamundo", hola_mundo))
    dispatcher.add_handler(CommandHandler("logo", logo))

    # Y comenzamos la ejecución del bot a las peticiones
    updater.start_polling()
    updater.idle()

# Llamamos al método main para ejecutar lo anterior
if __name__ == '__main__':
    main()

Este código que os he puesto más arriba no hace nada para el usuario (aún), pero sin embargo nos servirá para comprobar que el bot funciona de forma correcta, ya que ahora cuando lo encendamos cada vez que reciba un mensaje, imprimirá en la consola de Cloud9 (la misma que hemos utilizado para instalar la librería antes) el ID del chat junto con el texto que haya enviado el usuario que interactúa con el bot, así que vamos a ponerlo a prueba.

En la barra superior dentro de Cloud9 pulsamos en Run para que comience la ejecución del Bot:

Bot

Se abrirá una nueva ventana de ejecución en la cual se registrarán los mensajes de los que os hablaba. Así que probad a abrir una conversación con vuestro bot y mandadle mensajes, veréis que todo lo que le enviéis se registra en la consola de la página. ¡Todo funciona correctamente!

Bot

Así que vamos a comenzar a añadirle acciones a los comandos que definimos anteriormente. Primero pulsad sobre Stop para parar la ejecución del bot y así poder modificarlo.

Vamos a empezar añadiendo una acción para el comando holamundo que definimos anteriormente, para ello añadiremos este trozo de código justo después del listener que hemos definido anteriormente:

# Método que mandará el mensaje "¡Hola, lector de Bytelix!"
def hola_mundo(bot, update):
    bot.sendMessage(chat_id=update.message.chat_id, text='¡Hola, lector de Bytelix!')

Y además registramos el comando holamundo en el main, justo debajo del listener:

dispatcher.add_handler(CommandHandler("holamundo", hola_mundo))

Con este sencillo código cada vez que el usuario de nuestro bot mande el comando holamundo nuestro bot le responderá con un ¡Hola, lector de Bytelix! De modo que si iniciamos de nuevo nuestro bot y probamos a mandarle el comando funciona perfectamente:

Bot

Sin embargo nuestro comando logo aún no funciona, ¡así que vamos a solucionarlo! Para ello primero tendremos que subir la foto que queramos enviar a nuestro workspace, pulsando en File y después en Upload Local Files…

Cloud9

Pulsamos en Select Files y seleccionamos el archivo que queramos subir o directamente lo arrastramos al hueco que nos dan y comenzará a subirse. En cuanto termine, aparecerá en nuestro proyecto y ya estaremos listos para utilizarlo:

Cloud9

Ahora sólo queda definir el código que, de forma muy similar a lo último que hemos añadido, se encargará de responder al comando logo con una imagen, en nuestro caso el logo de Bytelix. Para ello os basta con añadir este código justo debajo del que hemos añadido antes:

def logo(bot, update):
    # Enviamos de vuelta una foto. Primero indicamos el ID del chat a donde
    # enviarla y después llamamos al método open() indicando la dónde se encuentra
    # el archivo y la forma en que queremos abrirlo (rb = read binary)
    bot.sendPhoto(chat_id=update.message.chat_id, photo=open('Icono.png', 'rb'))

Y al igual que antes, registramos nuestro nuevo comando al bot:

dispatcher.add_handler(CommandHandler("logo", logo))

Y ahora si ejecutamos de nuevo el bot y le mandamos el comando logo, ¡magia!

Bot

Y ya tenemos nuestro bot funcionando

Ya tenéis la segunda parte disponible aquí.

Lo bueno de alojar el bot en Cloud9 es que, mientras no paremos la ejecución a mano, el bot se seguirá ejecutando aunque cerremos el navegador e incluso si apagamos nuestro ordenador, ya que todo se está ejecutando en los servidores de Cloud9.

Con esto ya tenéis una base de cómo funcionan los bots por dentro, pero por supuesto la cosa no se queda aquí, hay miles de cosas que podéis hacer, las cuales tenéis detalladas, en inglés eso sí, en la página de la librería que hemos utilizado. Podría explicarlas aquí, pero el tutorial se haría excesivamente largo y esto da para mucho más que un artículo.

¿Os animáis ahora a crear vuestro propio bot? ¿Queréis que sigamos expandiendo el tutorial? ¡Dejadnos vuestra opinión y cualquier duda en los comentarios!

Código completo del bot