Dungeon of Bits
Aprendiendo informática.
Dungeon of Bits

Creación de un bot para Telegram en Python para jugar a Heroquest - Parte 1.

Todos los pasos necesarios para crear un bot de Telegram utilizando Python.

hacer un bot de Telegram

Hacer un bot de Telegram en Python:

En este tutorial verás todos los pasos necesarios para crear un bot de Telegram usando el lenguaje de programación Python.

El objetivo del bot será realizar tiradas de dados, realizando tiradas aleatorias de dados de 6 caras.

Después se ampliará la funcionalidad del bot haciendo que tiré dados del juego de mesa HeroQuest y gestione el mazo de cartas de tesoro del mismo juego.

Crear el bot de Telegram:

El primer paso para crear un bot de Telegram es pedir un código de bot a Telegram, eso se hace buscando en la misma aplicación de Telegram al BotFather, tal y como se muestra en la imagen.

hacer un bot de Telegram

Para crear un nuevo bot se introduce el comando /newbot.

Entonces BotFather solicitará un nombre para el bot y un nombre de usuario del bot (que debe acabar en bot).

En este ejemplo se utiliza el nombre heroquestManager y el usuario heroquestManagerBot, tal y como se ve en la imagen.

hacer un bot de Telegram

BotFather, crea el bot y da al creador un token, un identificador único del bot, este identificador que se ve en la imagen sirve para que cualquiera pueda manipular el bot.

hacer un bot de Telegram

ES MUY IMPORTANTE QUE NADIE CONOZCA ESE CÓDIGO SALVO LAS PERSONAS QUE DEBAN TRABAJAR EN LA CREACIÓN Y MODIFICACIÓN DEL PROPIO BOT.

Editar el bot de Telegram:

El bot de Telegram puede modificarse en bastantes aspectos (incluso se le puede cambiar el nombre).

Para ello se utiliza el comando mybots dentro del chat con BotFather.

hacer un bot de Telegram

Como se ve en la imagen se pueden cambiar algunos detalles del mismo, vamos a cambiar la "descripción" y el "acerca de":

hacer un bot de Telegram

Ahora cambiaremos también la imagen del bot y le pondremos una más acorde con su función:

hacer un bot de Telegram

De momento ya no modificaremos nada más desde BotFather.

Crear el bot en Python:

El lenguaje que utilizaremos para crear el bot es Python, Python3 de hecho.

Para conectar nuestro programa con Telegram utilizaremos la API de Telegram, llamada Telegram Bot API.

En particular usaremos la implementación de la API de eternnoir.

El fichero de Python lo llamaremos heroquestManager.py y lo podremos editar con nuestro editor favorito.

Función tirar un dado de 6 caras:

La primera función será un generador de números aleatorios de 1 a 6, como un dado de 6 caras.

@bot.message_handler(commands=['dado'])
def dado6Caras(message):
    chat_id = message.chat.id
    random.seed()
    r = random.randint(1,6)
    bot.send_message(chat_id,r)

La primera línea indica que si el bot recibe el comando dado (en Telegram sería /dado) se debe ejecutar el código inferior que es la función dado6Caras.

La función lo que hace es en cada una de sus cuatro líneras:

  • Guardar el identificador del chat al que pertenece la llamada al bot en la variable chat_id.
  • Crear una semilla para calcular el número aleatorio.
  • Llamar a la función randint que genera un valor entre 1 y 6 y lo guarda en la variable "r".
  • Por último la función envía un mensaje con el valor generado "r" al chat desde el que se ha llamado al bot.

El código del bot quedaría así:

import telebot
import random

bot = telebot.TeleBot("TOKEN_DEL_BOT")

@bot.message_handler(commands=['dado'])
def dado6Caras(message):
    chat_id = message.chat.id
    random.seed()
    r = random.randint(1,6)
    bot.send_message(chat_id,r)

bot.polling()

**Importante sustituir TOKEN_DEL_BOT con el valor de Token de Bot que nos haya dado BotFather^^

Para probarlo solamente hay que ejecutar el código con Python en un equipo con acceso a Internet.

hacer un bot de Telegram

Función tirar un dado de Heroquest:

Los dados de HeroQuest son, básicamente, dados de 6 caras con dibujos en vez de números.

La composición de un dado de Heroquest es:

hacer un bot de Telegram

  • 2 calaveras blancas.
  • 1 calavera negra.
  • 2 escudos blancos.
  • 1 escudo negro.

Para mostrar los dibujos de las tiradas de dados en realidad enviaremos un mensaje con la URL donde tengamos la imagen de cada icono de dado de Heroquest.

La función que hemos de crear básicamente genera un número aleatorio de 1 a 6 y devuelve el icono que habría en esa cara del dado, pero en lugar de enviar un mensaje como en la función anterior, ahora usará la función contestar a mensaje (reply_to) que hará que se muestren las imágenes de las urls que le pasemos como parámetro.

@bot.message_handler(commands=['d1'])
def dadoHeroquest1(message):
    chat_id = message.chat.id
    random.seed()
    r = random.randint(1,6)
    if r <=2:
        d = "1"
    elif r <= 4:
        d = "2"
    elif r <= 5:
        d = "3"
    else:
        d = "4"
    imagen = open('/root/dado'+str(d)+'.jpg', 'rb')
    bot.send_photo(chat_id, imagen)

Como se ve en el código, ahora cuando el usuario envíe el mensaje /d1 se ejecutará la función dadoHeroquest1 que lo que hace es calcular un número de 1 a 6.

Teniendo en cuenta que hay caras con el mismo icono, tendremos que:

  • Si sale un 1 o un 2 mostraremos la imagen -> dado1.jpg = Escudo blanco.
  • Si sale un 3 o un 4 mostraremos la imagen -> dado2.jpg = Calavera blanca.
  • Si sale un 5 mostraremos la imagen -> dado3.jpg = Escudo negro.
  • Si sale un 6 mostraremos la imagen -> dado4.jpg = Calavera negra.

hacer un bot de Telegram

Función tirar varios dados de HeroQuest:

Para agilizar las tiradas de dados, porque lo habitual es que los jugadores y monstruos lancen más de un dado de ataque o defensa de Heroquest usaremos un bucle.

Por ejemplo, una función que tire dos dados de ataque sería:

@bot.message_handler(commands=['d2'])
def dadoHeroquest2(message):
        chat_id = message.chat.id
        random.seed()
        for x in range(2):
                r = random.randint(1,6)
                if r <=2:
                        d = "1"
                elif r <= 4:
                        d = "2"
                elif r <= 5:
                        d = "3"
                else:
                        d = "4"
                imagen = open('/root/dado'+str(d)+'.jpg', 'rb')
                bot.send_photo(chat_id, imagen)

Cambiando el mensaje d2 por d3 y for x in range(2): por for x in range(3): ya tendríamos una función que tiraría 3 dados. Y así podemos generar las funciones que sean necesarias.

hacer un bot de Telegram

El código final quedaría así:

import telebot
import random

bot = telebot.TeleBot("TOKEN_DEL_BOT")

@bot.message_handler(commands=['dado'])
def dado6Caras(message):
    chat_id = message.chat.id
    random.seed()
    r = random.randint(1,6)
    bot.send_message(chat_id,r)

@bot.message_handler(commands=['d1'])
def dadoHeroquest1(message):
    chat_id = message.chat.id
    random.seed()
    r = random.randint(1,6)
    if r <=2:
        d = "1"
    elif r <= 4:
        d = "2"
    elif r <= 5:
        d = "3"
    else:
        d = "4"
    imagen = open('/root/dado'+str(d)+'.jpg', 'rb')
    bot.send_photo(chat_id, imagen)

@bot.message_handler(commands=['d2'])
def dadoHeroquest2(message):
        chat_id = message.chat.id
        random.seed()
        for x in range(2):
                r = random.randint(1,6)
                if r <=2:
                        d = "1"
                elif r <= 4:
                        d = "2"
                elif r <= 5:
                        d = "3"
                else:
                        d = "4"
                imagen = open('/root/dado'+str(d)+'.jpg', 'rb')
                bot.send_photo(chat_id, imagen)

bot.polling()

En la siguiente entrega veremos cómo gestionar el mazo de cartas de tesoro del juego también desde el bot.

Es importante tener en cuenta que el bot solo funcionará mientras esté corriendo el programa en Python.