¿Alguien dijo bots en Telegram?

Introducción

Aprovechando el reciente post en el que hablábamos del bot BotSearchBooks he pensado que sería una buena idea desarrollar con más profundidad el tema de los bots en Telegram y qué mejor momento que tras la reciente actualización de la plataforma a su versión 2.0 donde incluyen la posibilidad de modificar mensajes ya enviados o menús integrados en el chat, permitiendo así hacer interfaces mucho más intuitivas y cómodas para el usuario.

Antes de comenzar a profundizar, dejaré una serie de enlaces bastante útiles respecto al tema que vamos a tratar.


Índice

  • Crear un bot con BotFather.
    • Crear el bot.
    • Personalizar el bot.
  • Desarrollar el bot.
    • Sin programar.
    • Programando.
      • Lenguajes.
      • Entornos de desarrollo.
      • Dónde ejecutar el bot.
  • Haciendo uso de pyTelegramBotAPI
  • Comunidades de desarrolladores.
  • Opinión personal
  • Extra

Crear un bot con BotFather

Bien, comencemos creando nuestro bot. Para ello debemos hablar con @BotFather,

· Crear el bot

Una vez iniciada la conversación con él, nos mandará un mensaje de ayuda donde listará todos sus comandos junto a una breve explicación de cada uno de ellos.

Tras mandarle /newbot nos pedirá un nombre para nuestro bot. Una vez elegido el nombre, nos pedirá un alias para este. Tras enviarle el nombre y el alias, ya estará creado el bot. Así de sencillo.

Creación del bot.

Como vemos, nos ha devuelto un token para acceder a la API. Este es el que usaremos a la hora de programar el bot.

· Personalizar el bot

BotFather no sólo nos permite crear bots sino que también nos deja personalizarlos añadiéndole imagen de perfil, descripción, atajos a los comandos que le añadamos y mucho más. Empecemos utilizando /setuserpic para añadirle una foto a nuestro bot.

Añadir imagen


Desarrollar el bot.

Una vez creado el bot, realmente este no hará nada hasta que lo programemos o utilicemos alguna herramienta que sirve para desarrollar bots sin tener que programar absolutamente nada.

· Sin programar.

Como estudiante de ingeniería informática, no me gusta desarrollar bots de esta manera, por lo que no profundizaré mucho aquí pero como comprendo que no todo el mundo siente esa pasión por programarse su propio bot, hablaré brevemente de un bot que te ayudará a crear tu bot. Si, has leido bien, bots que programan bots.

Supongo que aquí el rey es @chatfuelbot. La verdad es que está bastante conseguido, y permite bastante personalización respecto a los bots creados. Cuentan incluso con una página web.

Como dije, fui breve respecto a cómo crear bots de esta manera. Te recomiendo encarecidamente que continúes con la lectura, que a partir de ahora se podrá bastante interesante.

· Programando.

Ya hemos visto cómo hacer un bot sin necesidad de programar nada en absoluto y ahora toca ponerse manos a la obra.

  – Lenguajes.

Antes de ponernos a programar, debemos decidir qué vamos a usar. Aquí teneís una lista no oficial de wrappers en distintos lenguajes para que elijáis: Lista

En este caso, elegiré Python como lenguaje y pyTelegramBotAPI como wrapper, ya que BotSearchBooks hace uso de ese mismo wrapper y también es con el que más he trabajado.

  – Entornos de desarrollo.

Si queremos trabajar en local, lo recomendable es que usemos un entorno virtual como virtualenv. Si no queremos trabajar en local, una buena opción es C9.

  – Dónde ejecutar el bot.

Recientemente hemos mencionado entornos de desarrollo, pero una vez nuestro bot está listo, debemos ejecutarlo en algún sitio donde quede encendido. Empecemos por unos servicios “gratuitos”.

  • Amazon nos ofrece un VPS gratis durante 1 año.
  • GitHub ofrece a los estudiantes un pack donde se incluyen $50 para DigitalOcean por lo que podremos elegir su VPS de $5/mes y tener 10 meses gratis de VPS.

Servicios de pago:

Otra opción:

Haciendo uso de pyTelegramBotAPI

Como mencioné anteriormente, utilizaremos pyTelegramBotAPI en este pequeño tutorial.

Para ello, utilizaremos un virtualenv y una vez este activo, lo instalaremos mediante pip.

pip install pyTelegramBotAPI

Una vez instalado, vamos a crear nuestro primer bot. Este simplemente responderá a cualquier mensaje con el mismo mensaje que le enviemos:

# -*- coding: utf-8 -*-

# Importamos el módulo de pyTelegramBotAPI
import telebot

# Creamos el bot. Sustituir <TOKEN> con el token de nuestro bot
bot = telebot.TeleBot('<TOKEN>')

# Declaramos una función que hará de listener. Todos los mensajes
# recibidos por el bot pasarán por esta función.
def listener(messages):
    for m in messages:
# Comprobamos que el mensaje recibido sea de texto
        if m.content_type == 'text':
# Y le respondemos con el texto propio del mensaje recibido.
            bot.reply_to(m, m.text)

# Una vez creado el listener, debemos asignárselo al bot.
bot.set_update_listener(listener)

# Por útlimo, hacemos el long-poll, es decir, le decimos al bot que
# empiece a leer los mensajes que el bot reciba.
bot.polling(True)

Vale, llego el momento de darle vida al bot. Una vez guardado el código del bot, lo ejecutaremos con:

python bot.py

y al hablarle al bot, deberá respondernos de la siguiente manera:

Ejemplo

¡Enhorabuena, acabáis de crear un bot!

Lo siguiente que veremos, será añadirle comandos a nuestro bot. Recordad que cada vez que alguien utiliza el bot en privado, lo primero que hará será enviarle /start por lo que empezaremos con ese. Empezaremos haciendo que salude cuando alguien utilice ese comando, y como no queremos que continúe repitiendo todo lo que recibe, le quitaremos el listener temporalmente, por ejemplo, comentando la línea 19 de nuestro primero código.

Para hacer que el bot responda de manera personalizada a un comando en cuestión, necesitamos crear un handler de ese comando de la siguiente manera:

# Así le indicamos cómo manejar el comando '/start'
@bot.message_handler(commands=['start'])
def command_start(m):
    # En primer lugar, guardaremos en una variable el id de la
    # conversación a la que debe dirigirse
    cid = m.chat.id
    # A continuación indicamos qué debe decir el bot.
    bot.send_message(cid, "Bievenido a este bot de pruebas!")

Tras añadirle este trozo de código al bot, nuestro archivo bot.py debe quedar así y al volver a ejecutar el bot y enviarle /start veremos lo siguiente:

Imagen

Continuemos mejorando el comando. Lo siguiente que haremos será que salude a la persona que lo use por su nombre. Para ello obtendremos el nombre del usuario y lo concatenaremos con el mensaje a enviar (Fijaos que modificamos el mensaje a enviar).

# Así le indicamos cómo manejar el comando '/start'
@bot.message_handler(commands=['start'])
def command_start(m):
    # En primer lugar, guardaremos en una variable el id de la
    # conversación a la que debe dirigirse
    cid = m.chat.id
    # Con from_user obtenemos información del usuario
    # y con first_name, su nombre.
    nombre = m.from_user.first_name
    # A continuación indicamos qué debe decir el bot.
    bot.send_message(cid, "Bievenido a este bot de pruebas " + nombre + "!")

Como habéis visto, hemos accedido al usuario que envía el mensaje, y después a su nombre. Para ver toda la documentación visitad el API de Telegram. Continuando con la mejora del comando /start, haremos que el nombre del usuario se vea en cursiva. Para ello usaremos el formateo en HTML encapsulando el nombre de la siguiente manera <i>nombre</i> y añadiendo a send_message el parámetro parse_mode.

# Así le indicamos cómo manejar el comando '/start'
@bot.message_handler(commands=['start'])
def command_start(m):
    # En primer lugar, guardaremos en una variable el id de la
    # conversación a la que debe dirigirse
    cid = m.chat.id
    # Con from_user obtenemos información del usuario
    # y con first_name, su nombre.
    nombre = m.from_user.first_name
    # A continuación indicamos qué debe decir el bot.
    bot.send_message(cid, "Bievenido a este bot de pruebas <i>" + nombre + "</i>!", parse_mode="HTML")

Imagen

No está mal, ¿no? Antes de continuar con la lectura, si nunca antes has trabajado con Python, por favor, invierte un rato de tu tiempo en ver este video ya que te facilitará muchísimo comprender lo que haremos más a delante:

Si quieres hacer un bot que sea útil para mucha gente, es interesante que tengas un control sobre los usuarios, ya sea para saber cuántos usuarios tiene tu bot o para enviar un mensaje a todos los usuarios. Para ello puedes usar varias formas de almacenar los IDs. La más básica sería un fichero de texto plano donde cada línea sea el ID del usuario. Otra un poco más avanzada sería almacenarlos en un archivo JSON. Por ahora usaremos un archivo de texto (Recuerda crear el archivo que vayas a usar antes de usarlo):

# Para almacenar los usuarios dentro de nuestro programa,
# usaremos una lista
usuarios = list()
# Después, abriremos el fichero y por cada linea, iremos
# insertando en nuestra lista el ID
for linea in open('usuarios.txt','r'):
    # El fichero contiene texto, pero nosotros queremos números
    # por lo que transformaremos cada línea a un número entero.
    id = int(linea)
    # Y lo insertaremos en nuestra lista de usuarios
    usuarios.append(id)

De esta manera, tendremos almacenados en la variable usuarios todos los usuarios guardados en el fichero usuarios.txt. Ahora, actualizaremos nuestro comando /start para que cuando una persona utilice el bot por primera vez le salude y lo guarde en nuestro fichero, y si no es la primera vez, le diga que ya es usuario.

# Así le indicamos cómo manejar el comando '/start'
@bot.message_handler(commands=['start'])
def command_start(m):
    # En primer lugar, guardaremos en una variable el id de la
    # conversación a la que debe dirigirse
    cid = m.chat.id
    # Comprobamos que el ID no esté en nuestros usuarios.
    if cid not in usuarios:
        # Con from_user obtenemos información del usuario
        # y con first_name, su nombre.
        nombre = m.from_user.first_name
        # A continuación indicamos qué debe decir el bot.
        bot.send_message(cid, "Bievenido a este bot de pruebas <i>" + nombre + "</i>!", parse_mode="HTML")
        # Y lo guardamos como usuario tan to en la variable
        # como en el fichero
        usuarios.append(cid)
        with open('usuarios.txt','a') as f:
            f.write(str(cid)+'\n')
    # Si ya es usuario, le avisamos
    else:
        bot.send_message(cid, "Ya eras usuario!")

Imagen

Como vemos, dependiendo de si es usuario o no, podemos hacer que diga una cosa u otra, por lo que podemos hacer que todos los comandos comprueben si es usuario o no para así forzar que usen /start en grupos.

Por ahora creo que tenéis suficiente para practicar, por lo que en un futuro continuaré con este tema.

Comunidades de desarrolladores

 

Parece que cada vez más, la gente se está animando a desarrollar sus propios bots, por lo que es normal que vayan surgiendo comunidades de desarrolladores.

Tras escribir un post en forocoches donde explicaba cómo crear un bot para Telegram, ha ido surgiendo una comunidad de habla hispana que poco a poco va creciendo.

Telegram Bot Devs

Si os animáis a iniciaros en este mundillo, podéis encontrarme en Telegram como @Edurolp y pedirme acceso al grupo.

Opinión personal

En mi opinión, esto de los bots es algo realmente interesante, ya que el límite lo pones tú. Personalmente empecé en este mundillo nada más salir el API en el verano de 2015 y no me arrepiento en absoluto ya que no solo me ha ayudado a crecer como programador sino también como persona ya que gracias a ellos he conocido a infinidad de gente de todas partes del mundo y he hecho muy buenos amigos.

Extra

Estudiante de ingeniería informática en la UCO.
  • Alfredo Callizaya

    buenisimo post

  • Carlos Andres Beltran Galindo

    Hola amigo, muy buen post. Tengo una consulta, hay alguna otra plataforma diferente a https://c9.io/ donde pueda alojar el proyecto que iniciaré? Es que así poco fui a realizar el registro con una cuenta free y me solicitan los datos de mi Tarjeta de Crédito. Gracias.