Construyendo su primer bot de Telegram: una guía paso a paso

Publicado: 2022-03-11

Los chatbots a menudo se promocionan como una revolución en la forma en que los usuarios interactúan con la tecnología y las empresas. Tienen una interfaz bastante simple en comparación con las aplicaciones tradicionales, ya que solo requieren que los usuarios chateen, y se supone que los chatbots entienden y hacen lo que el usuario les exige, al menos en teoría.

Muchas industrias están cambiando su servicio al cliente a sistemas de chatbot. Eso se debe a la gran caída en el costo en comparación con los humanos reales, y también a la solidez y disponibilidad constante. Los chatbots brindan un grado de soporte al usuario sin un costo adicional sustancial.

Hoy en día, los chatbots se utilizan en muchos escenarios, que van desde tareas menores, como mostrar la hora y los datos meteorológicos, hasta operaciones más complejas, como diagnósticos médicos rudimentarios y comunicación/soporte al cliente. Puede diseñar un chatbot que ayude a sus clientes cuando hagan ciertas preguntas sobre su producto, o puede crear un chatbot de asistente personal que pueda manejar tareas básicas y recordarle cuándo es hora de ir a una reunión o al gimnasio.

Hay muchas opciones cuando se trata de dónde puede implementar su chatbot, y uno de los usos más comunes son las plataformas de redes sociales, ya que la mayoría de las personas las usan regularmente. Lo mismo puede decirse de las aplicaciones de mensajería instantánea, aunque con algunas salvedades.

Telegram es una de las plataformas de mensajería instantánea más populares en la actualidad, ya que le permite almacenar mensajes en la nube en lugar de solo en su dispositivo y cuenta con un buen soporte multiplataforma, ya que puede tener Telegram en Android, iOS, Windows y casi cualquier otra plataforma que pueda soportar la versión web. Crear un chatbot en Telegram es bastante simple y requiere unos pocos pasos que requieren muy poco tiempo para completarse. El chatbot se puede integrar en grupos y canales de Telegram, y también funciona por sí solo.

En este tutorial, crearemos un bot de Telegram que le dará una imagen de avatar de Avatares adorables. Nuestro ejemplo implicará construir un bot usando Flask e implementarlo en un servidor Heroku gratuito.

Para completar este tutorial, necesitará Python 3 instalado en su sistema, así como habilidades de codificación de Python. Además, una buena comprensión de cómo funcionan las aplicaciones sería una buena adición, pero no imprescindible, ya que revisaremos la mayoría de las cosas que presentamos en detalle. También necesita Git instalado en su sistema.

Por supuesto, el tutorial también requiere una cuenta de Telegram, que es gratuita. Puede registrarse aquí. También se requiere una cuenta de Heroku, y puede obtenerla gratis aquí.

Dando vida a su bot de Telegram

Para crear un chatbot en Telegram, debe comunicarse con BotFather, que es esencialmente un bot que se usa para crear otros bots.

El comando que necesita es /newbot que conduce a los siguientes pasos para crear su bot:

Tutorial del bot de Telegram: ejemplo de captura de pantalla

Su bot debe tener dos atributos: un nombre y un nombre de usuario. El nombre aparecerá para su bot, mientras que el nombre de usuario se utilizará para menciones y uso compartido.

Después de elegir el nombre y el nombre de usuario de su bot, que debe terminar en "bot", recibirá un mensaje que contiene su token de acceso y, obviamente, deberá guardar su token de acceso y su nombre de usuario para más adelante, ya que los necesitará.

Codifique la lógica del chatbot

Usaremos Ubuntu en este tutorial. Para los usuarios de Windows, la mayoría de los comandos aquí funcionarán sin ningún problema, pero si tiene algún problema con la configuración del entorno virtual, consulte este enlace. En cuanto a los usuarios de Mac, este tutorial debería funcionar bien.

Primero, creemos un entorno virtual. Ayuda a aislar los requisitos de su proyecto de su entorno Python global.

 $ python -m venv botenv/

Ahora tendremos un directorio botenv/ que contendrá todas las bibliotecas de Python que usaremos. Continúe y active virtualenv usando el siguiente comando:

 $ source botenv/bin/activate

Las bibliotecas que necesitamos para nuestro bot son:

  • Flask: un marco micro web construido en Python.
  • Python-telegram-bot: un envoltorio de Telegram en Python.
  • Solicitudes: una popular biblioteca http de Python.

Puede instalarlos en el entorno virtual usando el comando pip de la siguiente manera:

 (telebot) $ pip install flask (telebot) $ pip install python-telegram-bot (telebot) $ pip install requests

Ahora exploremos nuestro directorio de proyectos.

 . ├── app.py ├── telebot │ ├── credentials.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv

En el archivo credentials.py necesitaremos tres variables:

 bot_token = "here goes your access token from BotFather" bot_user_name = "the username you entered" URL = "the heroku app link that we will create later"

Ahora volvamos a nuestro app.py y revisemos el código paso a paso:

 # import everything from flask import Flask, request import telegram from telebot.credentials import bot_token, bot_user_name,URL
 global bot global TOKEN TOKEN = bot_token bot = telegram.Bot(token=TOKEN)

Ahora tenemos el objeto bot que se utilizará para cualquier acción que necesitemos que realice el bot.

 # start the flask app app = Flask(__name__)

También necesitamos vincular funciones a rutas específicas. En otras palabras, debemos decirle a Flask qué hacer cuando se llama a una dirección específica. Puede encontrar información más detallada sobre Flask y rutas aquí.

En nuestro ejemplo, la función de ruta responde a una URL que es básicamente /{token} , y esta es la URL a la que llamará Telegram para obtener respuestas a los mensajes enviados al bot.

 @app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id) return 'ok'

La forma intuitiva de hacer que esta función funcione es que la llamaremos cada segundo, para que compruebe si ha llegado un nuevo mensaje, pero no lo haremos. En su lugar, usaremos Webhook, que nos proporciona una forma de permitir que el bot llame a nuestro servidor cada vez que se llame un mensaje, de modo que no tengamos que hacer que nuestro servidor sufra en un bucle mientras espera que llegue un mensaje.

Entonces, haremos una función que nosotros mismos debemos llamar para activar el Webhook de Telegram, básicamente diciéndole a Telegram que llame a un enlace específico cuando llegue un nuevo mensaje. Llamaremos a esta función solo una vez, cuando creamos el bot por primera vez. Si cambia el enlace de la aplicación, deberá volver a ejecutar esta función con el nuevo enlace que tiene.

La ruta aquí puede ser cualquier cosa; eres tú quien lo llamará:

 @app.route('/setwebhook', methods=['GET', 'POST']) def set_webhook(): # we use the bot object to link the bot to our app which live # in the link provided by URL s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) # something to let us know things work if s: return "webhook setup ok" else: return "webhook setup failed"

Ahora que todo está configurado, hagamos una página de inicio elegante para que sepamos que el motor está encendido.

 @app.route('/') def index(): return '.' if __name__ == '__main__': # note the threaded arg which allow # your app to have more than one thread app.run(threaded=True)

Echemos un vistazo a la versión completa de app.py:

 import re from flask import Flask, request import telegram from telebot.credentials import bot_token, bot_user_name,URL global bot global TOKEN TOKEN = bot_token bot = telegram.Bot(token=TOKEN) app = Flask(__name__) @app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id) return 'ok' @app.route('/set_webhook', methods=['GET', 'POST']) def set_webhook(): s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) if s: return "webhook setup ok" else: return "webhook setup failed" @app.route('/') def index(): return '.' if __name__ == '__main__': app.run(threaded=True)

Ese es el último fragmento de código que escribirá en nuestro tutorial. Ahora podemos avanzar al último paso, lanzar nuestra aplicación en Heroku.

Inicie nuestra aplicación en Heroku

Necesitamos un par de cosas antes de hacer nuestra aplicación.

Heroku no puede saber qué bibliotecas usa su proyecto, así que tenemos que decirle usando el archivo requirements.txt . Un problema común es que escribe mal los requisitos, así que tenga cuidado, para generar el archivo de requisitos usando pip:

 pip freeze > requirements.txt

Ahora tiene su archivo de requisitos listo para funcionar.

Ahora necesita el Procfile que le dice a Heroku dónde comienza nuestra aplicación, así que cree un archivo Procfile y agregue lo siguiente:

 web: gunicorn app:app

Un paso de rebote: puede agregar un archivo .gitignore a su proyecto para que los archivos sin uso no se carguen en el repositorio.

Desde su tablero de Heroku, cree una nueva aplicación. Una vez que lo haga, lo dirigirá a la página Implementar . Luego, abra la pestaña Configuración en una nueva ventana y copie el dominio de la aplicación, que será algo así como https://appname.herokuapp.com/ y péguelo en la variable URL dentro de credentials.py .

Captura de pantalla del panel de Heroku

Ahora, regrese a la pestaña Implementar y continúe con los pasos:

Nota: los usuarios de Windows y macOS pueden seguir los pasos que se describen aquí.

Iniciar sesión en Heroku:

 $ heroku login

Tenga en cuenta que este método a veces se atasca waiting for login , si esto le sucede, intente iniciar sesión usando:

 $ heroku login -i

Inicializa un repositorio Git en nuestro directorio:

 $ git init $ heroku git:remote -a {heroku-project-name}

Implementar la aplicación:

 $ git add . $ git commit -m "first commit" $ git push heroku master

En este punto, verá el progreso del edificio en su terminal. Si todo salió bien, verás algo como esto:

 remote: -----> Launching... remote: Released v6 remote: https://project-name.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done.

Ahora ve a la página de la aplicación (el enlace del dominio que copiaste antes) y agrega al final del enlace /setwebhook para que la dirección sea algo así como https://appname.herokuapp.com/setwebhook . Si ve que webhook setup ok , eso significa que está listo para comenzar.

Ahora ve a hablar con tu bot

Versión en vivo del chatbot de Telegram
Una versión en vivo del bot

Toques finales, consejos y trucos

Ahora tienes tu bot de Telegram funcionando las 24 horas del día, los 7 días de la semana, sin necesidad de tu intervención. Puede agregar la lógica que desee al bot, por lo que, por ejemplo, puede hacer que su bot sea más realista agregando un estado de "escribiendo" y enviando un estado de foto de la siguiente manera:

El siguiente fragmento de código de la función respond() :

 if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendChatAction(chat_id=chat_id, action="typing") sleep(1.5) bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendChatAction(chat_id=chat_id, action="upload_photo") sleep(2) bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

Como puede ver en el fragmento, agregamos una acción de escritura cuando estamos a punto de enviar la información sobre el bot que está en formato de texto, y agregamos una acción de carga de fotos cuando estamos a punto de enviar una foto para que el bot sea más realista. . Más acciones se pueden encontrar aquí.

También puede cambiar la imagen y la descripción del bot desde el canal BotFather para hacerlo más amigable.

Se pueden encontrar muchos más ejemplos simples de bots de Telegram en la página de python-telegram-bot en GitHub.

Puede desarrollar nuestro bot y convertirlo en el próximo súper bot de IA; todo lo que necesita hacer es integrar su lógica en la función respond() . Por ejemplo, su lógica puede estar en un módulo separado y puede llamarse dentro de la función respond() así:

 . ├── app.py ├── telebot │ ├── credentials.py │ ├──ai.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv

Y dentro de ai .py :

 def generate_smart_reply(text): # here we can do all our work return "this is a smart reply from the ai!"

Importarlo ahora en la aplicación .py:

 import re from time import sleep from flask import Flask, request import telegram From telebot.ai import generate_smart_reply from telebot.credentials import bot_token, bot_user_name,URL

Luego simplemente llámalo dentro del código respond() .

 def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # here call your smart reply message reply = generate_smart_reply(text) bot.sendMessage(chat_id=chat_id, text=reply, reply_to_message_id=msg_id)

Ahora puede hacer que su bot funcione de la manera que desee: ¡adelante y cree la próxima gran cosa!

Espero que te hayas divertido construyendo tu primer bot de Telegram.

Recursos adicionales

  • Construyendo un Chatbot usando Telegram y Python
  • Configurar su Telegram Bot WebHook de la manera más fácil
  • Repositorio Python-telegram-bot
  • Implementación con Git en Heroku
  • Documentación de Python Telegram Bot
Relacionado: Cree un chatbot de WhatsApp, no una aplicación