Mi primer bot en Telegram con Python

Para este artículo asumo que se tienen pocos conocimientos de programación con Python y que ya tienes una cuenta en Telegram y por lo tanto ejecutándose correctamente en tu equipo de trabajo.

1) Verifica que tienes instalado Python (al menos 3.6), abre una terminal y teclea: python presionas Enter, debes de ver algo así. Al final presionas Ctrl+D para salir.

Bot - Python

2) Creamos un entorno virtual y lo activamos:

En algunas distribuciones (como Ubuntu), tal vez sea necesario instalar primero:

sudo apt install python3-venv python-is-python3

Ahora si.

python -m venv mibot

cd mibot

source bin/activate

Bot - Entorno virtual

3) Instalamos las dependencias necesarias:

pip install python-telegram-bot
...
Successfully installed certifi-2020.6.20 cffi-1.14.0 cryptography-2.9.2 decorator-4.4.2 pycparser-2.20 python-telegram-bot-12.8 six-1.15.0 tornado-6.0.4

4) Creamos el bot. Dentro de Telegram busca el BotFather, solo hay uno válido, asegurate de seleccionar el correcto.

Bot - BotFather

5) Cuando presiones el botón START debes de ver una serie de comandos que puedes usar.

Bot - BotFather

6) Enviamos el comando /newbot para crear nuestro bot. El primer campo que te solicitará es el nombre del bot, se recomienda usar un nombre corto. Para este ejemplo usaremos Mi Super Bot y enviamos el valor.

Bot - BotFather

7) El siguiente campo que te solicitará es el username del bot, importante, este nombre de usuario no debe llevar espacios y es forzoso que termine con bot, para nuestro ejemplo usaremos mi_super_bot.

Bot - BotFather

8) El enviar el comando anterior, y si todo esta bien, el sistema debe devolverte un mensaje donde el valor más importante es el token para el acceso al API. Es muy importante lo guardes de forma segura, con el, cualquier puede hacer uso de tu bot.

Bot - BotFather

9) Ahora, regresamos a la carpeta donde creamos el entorno virtual de Python, si bien, mientras este activa, puedes crear los archivos donde quieras, para tener todos tus archivos en un solo lugar, por ahora, es suficiente tener todo dentro del entorno virtual. Dentro de esta carpeta, creamos el archivo conf.py con el siguiente contenido. Reemplaza el valor del token por el que te haya proporcionado el bot. Cuidado con el copiar y pegar. No intentes usar este token, al terminar este artículo borraré el bot y dejará de ser válido.

#!/usr/bin/env python3

TOKEN = '1133832644:AAFdDgO5jpMRkkmMpkKHl5FclUZT_8pXdqo'

10) En el mismo lugar, creamos el archivo main.py con el siguiente contenido.

#!/usr/bin/env python3

from telegram.ext import Updater, CommandHandler

from conf import TOKEN


API_TELEGRAM = f'https://api.telegram.org/bot{TOKEN}'


def start(update, context):
    bot = context.bot
    chat_id = update.effective_chat.id
    user = update.message.from_user
    text = f'Hola {user.username}\n\nNo soy un bot, soy un lindo gatito 😺 '

    bot.send_message(chat_id=chat_id, text=text)
    return


def main():
    updater = Updater(token=TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('start', start))

    updater.start_polling()
    updater.idle()
    return


if __name__ == '__main__':
    main()

11) Si todo esta bien, debes de ver los dos nuevos archivos.

Bot - BotFather

12) Para probar que todo esta bien, arrancamos el bot con la siguiente instrucción (presiona Enter al final). En algunas distribuciones, hay que usar python3, asegurate de usar solo Python 3.

python main.py

13) Regresa a Telegram y presionas el enlace a tu bot, para nuestro ejemplo: http://t.me/mi_super_bot debe mostrarte el botón para iniciar START, presionalo para ver lo siguiente.

Bot - BotFather

14) Para terminar el script, regresa a la terminal y presiona Ctrl+C

15) El comando /start se ejecutará siempre que alguien inicia un chat con nuestro bot y se ejecuta una sola vez. Puedes usarlo para dar más detalles de la finalidad de tu bot a los usuarios. Ahora, vamos a agregar nuestro primero comando personalizado. Además, agregaremos un log para ver la información que nos va devolviendo el bot. Nuestro comando se llamará /ayuda. Editar el archivo main.py para que quede de la siguiente manera, reitero, ten cuidado con el copiar y pegar. Importante, siempre asegurate de detener y reiniciar el bot cuando hagas cambios en el código, para que los tome.

#!/usr/bin/env python3

import logging

from telegram.ext import Updater, CommandHandler

from conf import TOKEN


LOG_FORMAT = '%(asctime)s - %(levelname)s - %(message)s'
LOG_DATE = '%d/%m/%Y %H:%M:%S'
logging.addLevelName(logging.ERROR, '\033[1;41mERROR\033[1;0m')
logging.addLevelName(logging.DEBUG, '\x1b[33mDEBUG\033[1;0m')
logging.addLevelName(logging.INFO, '\x1b[32mINFO\033[1;0m')
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=LOG_DATE)
log = logging.getLogger(__name__)


API_TELEGRAM = f'https://api.telegram.org/bot{TOKEN}'


def start(update, context):
    bot = context.bot
    chat_id = update.effective_chat.id
    user = update.message.from_user
    text = f'Hola {user.username}\n\nNo soy un bot, soy un lindo gatito 😺 '

    bot.send_message(chat_id=chat_id, text=text)
    return


def ayuda(update, context):
    bot = context.bot
    chat_id = update.effective_chat.id
    text = """Ayuda de Mi Super Bot

/ayuda - Lista esta ayuda
"""
    bot.send_message(chat_id=chat_id, text=text)
    return


def main():
    updater = Updater(token=TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('start', start))
    dp.add_handler(CommandHandler('ayuda', ayuda))

    updater.start_polling()
    updater.idle()
    return


if __name__ == '__main__':
    main()

Bot - BotFather

16) Nota que en la terminal, ahora ves un montón de información.

Bot - BotFather

17) Si observas esta terminal, veras que cada 10 segundos hace una actualización, salvo que se reciba un comando, en tal caso, lo intenta procesar.

18) Agregaremos un segundo comando para mostrar como recibir argumentos. Usaremos el nombre /buscar y el usuario podrá pasarle una o varias palabras. Insisto, cuidado con el copiar y pegar

#!/usr/bin/env python3

import logging

from telegram.ext import Updater, CommandHandler

from conf import TOKEN


LOG_FORMAT = '%(asctime)s - %(levelname)s - %(message)s'
LOG_DATE = '%d/%m/%Y %H:%M:%S'
logging.addLevelName(logging.ERROR, '\033[1;41mERROR\033[1;0m')
logging.addLevelName(logging.DEBUG, '\x1b[33mDEBUG\033[1;0m')
logging.addLevelName(logging.INFO, '\x1b[32mINFO\033[1;0m')
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=LOG_DATE)
log = logging.getLogger(__name__)


API_TELEGRAM = f'https://api.telegram.org/bot{TOKEN}'


def start(update, context):
    bot = context.bot
    chat_id = update.effective_chat.id
    user = update.message.from_user
    text = f'Hola {user.username}\n\nNo soy un bot, soy un lindo gatito 😺 '

    bot.send_message(chat_id=chat_id, text=text)
    return


def ayuda(update, context):
    bot = context.bot
    chat_id = update.effective_chat.id
    text = """Ayuda de Mi Super Bot

/ayuda - Lista esta ayuda
/buscar - Busca por palabras
"""
    bot.send_message(chat_id=chat_id, text=text)
    return


def buscar(update, context):
    bot = context.bot
    chat_id = update.effective_chat.id
    user = update.message.from_user
    text = f'Hola {user.username}\n\n'
    argumentos = context.args

    text += f"Haz buscado por: {' '.join(argumentos)}"

    bot.send_message(chat_id=chat_id, text=text)
    return


def main():
    updater = Updater(token=TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('start', start))
    dp.add_handler(CommandHandler('ayuda', ayuda))
    dp.add_handler(CommandHandler('buscar', buscar))

    updater.start_polling()
    updater.idle()
    return


if __name__ == '__main__':
    main()

19) Reinicia el bot, y manda el comando como en la siguiente imagen.

Bot - BotFather

20) Nota, que todo a funcionado desde nuestra maquina casera, es muy valido y en no pocos casos será suficiente en muchos escenarios, no todos los servicios requieren estar 24/365 en línea. Puedes perfectamente arrancar el bot solo cuando lo necesites, o, arrancarlos automáticamente cuando encienda tu equipo.

21) Iniciar el bot desde bashrc es posible pero no recomendado, es mejor usar el sistema de inicio de tu distribución, para este ejemplo, usaremos systemd desde el espacio de usuario. Edita el archivo mibot.service en la ruta ~/.config/systemd/user, recuerda ~ es tu home, con el siguiente contenido. No copies y pegues, o si lo haces, asegurate de establecer las rutas correctamente a tu sistema de archivos.

[Unit]
Description=Mi Super Bot
After=network.target

[Service]
Type=idle
ExecStart=/home/mau/mibot/bin/python /home/mau/mibot/main.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

22) Ahora puedes controlar el proceso de tu bot:

  • Activar al iniciar:
systemctl --user enable mibot
  • Iniciarlo:
systemctl --user start mibot
  • Detenerlo
systemctl --user stop mibot
  • Verificar su estado.
systemctl --user status mibot

Bot - BotFather



Si has llegado hasta aquí con todo funcionado, felicidades, yo no lo hice a la primera :)

Hay un mundo de posibilidades con los bots de Telegram, enviar archivos, fotos, videos, responder mensajes, delimitar quien puede usarlo, formatear los mensajes y un largo etcetera para un artículo como este.

En otro artículo veremos algunas de estas posibilidades, y en uno más como activarlo en un VPS para que este disponible siempre en línea.

Si tienes preguntas o comentarios, puedes hacerlo en mi cuenta de Mastodon o en el grupo de estudio de python en Telegram

¡Feliz programación! Abrazos desde tierras mexicanas.