Desarrollo de aplicación conversacional integrada a Telegram (chatbot): TUTORIAL BÁSICO y su aplicación práctica para la monitorización del precio de criptomonedas (PARTE 1)

in #programacion7 years ago (edited)

📱 Desarrolle sus propios robots de Telegram con propósitos prácticos. 

💲 Use el chatbot en desarrollo ya disponible en Telegram de manera completamente gratuita.


 Una de las mejores características de Telegram son los bots. Estos son cuentas especiales de Telegram que son controladas por software en vez de humanos. El software se conecta con la API de Bots de Telegram para controlar el bot apropiadamente. Eso signfica que el creador de ese software descarga las actualizaciones (updates) enviadas al bot por los usuarios humanos y el mismo envía respuestas a la misma API a fin de responder a los usuarios.

 Dependiendo del modo como han sido programados, estos bots pueden comportarse como lo hacen los humanos (chatbots), pero con características adicionales que les permiten prestar infinitos y diversos tipos de servicios. Ya hay muchísimos bots con funciones y capacidades diferentes, tales como buscar imágenes imágenes, integrarse con Youtube e Instagram, consultar artículos en Ámazon, jugar ajedrez, moderar grupos etc. Puedes probar estos bots si no lo has hecho. Sería una buena referencia para entender mejor  este tema.

 Dado que Telegram permite que estos bots puedan ser desarrollados por terceros, es posible para usted -estimado lector- desarrollar sus propios bots. Es por ello, comienzo con esta serie de post sobre el desarrollo de bots de Telegram con diferentes propósitos; algo que puede encontrar interesante o práctico. En el proceso, aprenderá o consolidará los aspectos básicos sobre el desarrollo de estas interesantes aplicaciones. 

 He dividido este primer post en dos partes: la primera lo guiará en los fundamentos de la programación de este tipo de bots (porque siempre es bueno repasar y justificar las cosas) y la segunda presenta el desarrollo de un bot real con propósitos prácticos. Así que, si usted ya es un experto o domina los conceptos básicos, puede saltarse la primera parte. Incluso si usted no está interesado en el desarrollo de la aplicación, pero sí en su uso, puede simplemente usar la versión en desarrollo de manera completamente gratuita (link al final del artículo).

 Espero que sea de su utilidad. Comencemos. 


PARTE 1: Creando un bot de Telegram 

Propósito: aprenderá los conceptos básicos para desarrollar y desplegar su propio bot de Telegram. 

 Como se ha mencionado anteriormente, usted puede crear tus propios bots de Telegram. Eso significa que usted desarrollará la pieza de software que manejará la mayoría de los aspectos del bot y usted es responsable de lanzarlo y mantenerlo en funcionamiento bajo sus propios medios. Las siguientes pautas resumen este proceso: 

  1. Obtener un token de bot de Telegram. 
  2. Establecer un lenguage de programación así como una librería para conectarse con la API de Bots de Telegram. 
  3. Hospedar y lanzar el bot. 


1) Obtener un token de bot de Telegram:
Dado que todos los bots son también "cuentas" de Telegram, necesita crearlos dentro de Telegram. Para ello, debe iniciar una conversación con el @BotFather, si ya no lo ha hecho. BotFather es el bot de Telegram “que los rige a todos” y es necesario para gestionar algunas cosas sobre ellos. Use la función de búsqueda desde tu aplicación Telegram (Android, IOS, Windows, desktop, etc.) para localizar el bot como un contacto (o haga click en este link: @BotFather desde el dispositivo donde Telegram está instalado) e inicie una conversación con él.
 


 Pronto descubrirá cómo crear un bot de Telegram. Simplemente ingrese el comando: /newbot e iniciará una conversación donde se le preguntará por...:

  • El nombre del bot: este es el nombre común que será principalmente mostrado en Telegram, justo como el suyo.
  • El alias del bot (username): el cual debe terminar en “bot”. Esto será muy práctico a la hora de buscar y compartir el bot con otras personas. 

 Tras esto, BotFather le dirá que su bot ya ha sido creado. Para completar el proceso puede añadir una foto de perfil (comando /setuserpic), una descripción (comando /setdescription) y un texto "acerca de" (comando /setabouttext). Adicionalmente, puede enviar una "lista de comandos" a BotFather con aquellos comandos que soportará su bot. BotFather tomará esta información sólo con fines de mejorar la experiencia de usuario (/setcommands).


Lo más importante, sin embargo, es el token asignado a su bot por BotFather. Éste es un código de autenticación que es necesario para conectar el software que creará con la API de Bots de Telegram. En otras palabras, es una especie de contraseña que su bot necesaría para comunicarse efectivamente con Telegram a través de HTTPS. Un token típico luciría así:

541859297:AAFCK1zo5mdWJ_brSEIM6Fi5crsgOpwa7b4

Debe guardar el token correspondiente y nunca compartirlo con nadie. El token previamente mostrado es sólo para propósitos didácticos. Ha sido ya revocado (comando /revoke en el chat con BotFather).

Vale la pena resaltar cómo BotFather interactúa con los usuarios, donde el uso de comandos se destaca. Estos son palabras clave que siempre comienzan con el símbolo “/” y tienen un color diferente (usualmente azul) en comparación con los textos restantes. Los comandos indican indican instrucciones simples y claras al bot. Más adelante se mostrará la implementación de algunos comandos para los ejemplos a desarrollar.


2) Establecer un lenguage de programación así como una librería para conectarse con la API de Bots de Telegram:

 Dado que todo esto involcra desarrollo de software, eventualmente necesitará algo de programación. Escoja un lenguaje de programación adecuado para el desarrollo de aplicaciones web, especialmente uno que soporte una librería nativa para interactuar con la API de Bots de Telegram. 

 Para esta publicación, se ha escogido Python como lenguaje de programación así como también la librería python-telegram-bot (ptb) . Esta última es un maravilloso wrapper en sofware libre y código abierto que hace mucho más fácil el proceso de interactuar con la API de Bots de Telegram. También es útil para programar diferentes aspectos del bot. Para instalar esta librería, simplemente ejecute:

$ sudo pip install python-telegram-bot 

 Tras esto, puede comenzar con el proceso de codificación usando la librería, editores de texto e intérpretes. Cree un archivo y renómbrelo a “my_first_bot.py”. Eventualmente, añadirá en él algunas porciones de código como se muestran a continuación: 

from telegram.ext import Updater, CommandHandler 

 Aquí se está importando un par de importantes clases de la librería python-telegram-bot: Updater y CommandHandler. Entre otras cosas, Updater permite implementar un objeto despachador (dispatcher) para recibir las actualizaciones (updates) desde Telegram, de tal modo que no será necesario preocuparse de hacerlo uno mismo a través de peticiones HTTPS. La clase CommandHandler, por su parte, será explicada luego. Ahora, enfoquémosnos en la función principal (main) para la aplicación:

def main():
    Updater("YOUR-TOKEN-HERE")
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help)
    updater.start_polling()
    updater.idle()

 Como ya habrá podido notar, una instancia de la clase  Updater mencionada anteriormente ha sido creada, en la cual debe sustituir el texto “YOUR-TOKEN-HERE” con el correspondiente token válido asignado previamente por BotFather.

 El próximo paso es la creación del objeto despachador (dispatcher) el cual es útil para implementar manejadores (handlers). En este caso, se han añadido al despachador tres instancias de manejadores de comandos (CommandHandler), con las cuales el objeto updater presta atención a los comandos enviados al bot por los usuarios humanos y trata esto como un evento, reenviando su información a la correspondiente función manejadora. Esto se muestra a continuación:

dp.add_handler(CommandHandler("start", start_function))
dp.add_handler(CommandHandler("help", help_function))

 De esta manera, el primer argumento para la clase CommandHandler es la palabra que coincide lexicográficamente con la palabra que los usuarios ingresarán en su aplicación de Telegram (por ejemplo: “start”). El segundo argumento corresponde a la función que manejaría ese evento (por ejemplo: start_function). Esta función tiene que ser implementada (más adelante se dará un ejemplo).

 Conviene mencionar que los comandos start y help son estándar, puesto que Telegram recomienda a los desarrolladores darles soporte siempre. “Start” es un comando usado principalmente cuando nuevos usuarios aparecen, de tal modo que su bot puede hacer una presentación de sí mismo y los usuarios pueden iniciar una agradable conversación con él. “Help”, por otra parte, es un comando pensado para auxiliar a los usuarios al darles información importante sobre el uso y funcionamiento del bot. Por supuesto, el modo como el bot reaccione específicamente a estos comandos depende del programador.

 La función principal (main) termina con un par de instrucciones rutinarias que permiten que el bot comience a ejecutarse. Esto funciona aquí con el método “polling” (diferente del método “webhook”), con el cual tu software es completamente responsable de solicitar actualizaciones (updates) de los servidores de Telegram. 

Ahora, enfoquémosnos en las funciones que manejan los eventos entrantes (comandos, en este caso):

def start(bot, update):
    text = "Hi, welcome to My-first-bot"
    update.message.reply_text(text)

 Esta simple función cumple con el cometido. Recibe al menos dos parámetros obligatorios:

  • -Bot: una instancia del bot en ejecución que permite usar los métodos típicos de la API de Bots de Telegram, tales como sendMessage, sendPhoto, sendVideo, etc.
  • -Update: este objeto contiene la información entrante desde Telegram (update), tales como el contenido del mensaje, la información del usuario, la información del chat, etc.

 Entonces, en la función anterior, se está definiendo una variable que contiene una cadena con un saludo ("Hi, welcome to My-first-bot": "Hola, bienvenido a My-primer-bot") que será enviado al usuario. La línea update.message.reply_text(text) implementa un atajo (shortcut) que ejecuta la respuesta. Es así de simple.

La función help_function es bastante similar:

def help(bot, update):
    text = “So far, I only support these commands:” \
    “\nstart: shows the introduction” \   
   “\nhelp: shows this message”
    update.message.reply_text(text)

  Mostrando todo el código:

 from telegram.ext import Updater, CommandHandler

 def start_function(bot, update):  
    text = "Hi, welcome to My-first-bot!" 
    update.message.reply_text(text)

 def help_function(bot, update):
    text = "So far, I only support these commands:" \   
    "\nstart: shows the introduction"\
    "\nhelp: shows this message
    update.message.reply_text(text)

 def main():
    updater = Updater("YOUR-TOKEN-HERE")
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start_function))
    dp.add_handler(CommandHandler("help", help_function
    updater.start_polling()
    updater.idle()

 if __name__ == '__main__':
    main()


 3) Hospedar y lanzar bot (servicio de hosting)

  Es posible ejecutar el bot desde un computador propio, independientemente de si es un servidor dedicado o no. De hecho, esto es práctico para propósitos de prueba y depuración. Simplemente ejecute el script creado así:  

$ python my_first_bot.py  

  También, también puede programar usando algún online IDE (Ambiente de Desarrollo Integrado en línea) y probar su bot desde éĺ. Cloud9 es una buena alternativa para ejecutar y depurar sus scripts

  Sin embargo, esto no es suficiente si se desea lanzar el bot como un servicio 24/7 servicio o por lo menos mantenerlo activo durante varias horas al mes. En este caso, se puede adquirir un plan premier en Cloud9 o alojar el bot en otro tipo de VPN o servicio de hosting. Incluso, si no se tiene un plan premier, es posible alojar efectivamente al bot en Heroku bajo un plan gratuito (free plan) Simplemente siga las orientaciones para desplegar una aplicación Python en Heroku (en inglés).  

  Esto es todo con respecto a los fundamentos del desarrollo de bots de Telegram. Ahora, añadamos algunas interesantes funcionalidades al recién creado bot. 


 PARTE 2: Bot de Telegram para monitorear el precio de criptomonedas

 Propósito: aplicará el conocimiento previo para el desarrollo de un verdadero bot de Telegram que solicite el precio en vivo de algunas criptomonedas. 


 Casi todo el mundo conoce al Bitcoin y otras cryptomonedas así como también su importancia real en el mundo. El precio de estas es constantemente revisado y monitoreado por miles de operadores, traders, usuarios y entusiastas de criptomonedas a través de docenas de plataformas de intercambio de criptodivisas y pareciera que nunca es suficiente. Así que, ¿por qué no desarrollar un bot de Telegram para buscar el precio actual de algunas de estas criptomonedas? Considerando las ventajas de Telegram y sus inmensas comunidades de fans de criptodivisas, un bot para monitorear ese valor podría ser bastante práctico.

En concreto, se propone el desarrollo de un bot con estas características: soporte para tres comandos: start, help y price. Con este último, el usuario será capaz de consultar el precio de  cualquier criptomoneda que desee. El bot se encargará de dar una respuesta apropiada en cualquier caso.

Comencemos.


 1) Crear una cuenta de bot de Telegram
 Ante todo, se debe crear una cuenta de bot en Telegram chateando con BotFather. En este caso, se ha creado un bot llamado “Crytocoin Bot” y con alias  (nombre de usuario) “yourcrytocoinbot”. Además, se ha agregado una agradable imagen, una descripción y un texto "acerca-de". El recién creado bot podría lucir así:



 2) Implementar el módulo coinmarketcap para ampliar el funcionamiento del bot previo
 El bot anterior es perfecto para lograr esto. Su código fuente puede servir de base para el nuevo proyecto práctico, de tal manera que simplemente hay que copiarlo y hacer algunas modificaciones a fin de obtener la información sobre la critpomoneda específica. Esto se muestra como sigue: 


 Puede observarse que la nueva funcionalidad del bot puede ser lograda mediante del uso del módulo coinmarketcap (línea 2). Como la librería python-telegram-bot library (línea 3), este módulo también es un wrapper pero funciona con la API de coinmarketcap.com. Es distribuido bajo la licencia Apache 2.0. Puede ser instalado así: 

 $ sudo pip install coinmarketcap 

  Luego, también se observa la función get_price, la cual, en realidad, es una función para manejar las actualizaciones producidas por el comando “price”, el cual había sido establecido en la función principal (línea 66). Puede ver que la clase CommandHandler recibe el argumento pass_args, el cual, a su vez, permite que el bot preste atención al texto que los usuarios ingresan junto con el comando "price". El objetivo de habilitar esta característica es permitir a los usuarios especificar la critomoneda cuyo precio les gustaría conocer. En sus dispositivos con Telegram, los usuarios lo harían del siguiente modo:

/price bitcoin

/price ethereum

 Donde "/price" corresponde al comando y "bitcoin" y "ethereum" son textos de entrada que serían tratados como argumentos por la función manejadora.

  En este sentido, la función get_price valida si hay argumentos o no, esto es, el nombre de la criptomoneda ingresado por los usuarios (líneas 24-27), crea un id (currency_id) válido para la API de CoinMarketCap (línea 30), envía esta data para solicitar algunos resultados de la API anteriormente mencionada (líneas 34-39), y finalmente prepara una respuesta para el usuario tomando en cuenta el nombre de la criptomoneda y su valor en términos de USD (líneas 42-53). 

  Finalmente, unos pocos cambios adicionales en la función start y help  para adaptar los mensajes apropiadamente. Ahora bien, el bot puede ser mejorado en su  interacción con el usuario a fin de hacer el proceso mucho más sencillo e intuitivo. Además, tenga en mente que la API de CoinMarketCap requiere que las aplicaciones cliente “limiten las peticiones a no más de 10 por minuto”, lo cual podría convertise en un asunto pendiente para la presente versión del bot. No obstante, el módulo coinmarkecap controla esto efectivamente a través de un método de "cacheo" de datos. Todos estos asuntos pueden ser cubiertos en un próximo artículo. De momento, siéntase libre de clonar el código y ejecutarlo por usted mismo.

  El código fuente completo en formato de texto es mostrado a continuación: 

# -*- coding: utf-8 -*-  
import coinmarketcap  
from telegram.ext import Updater, CommandHandler

def start_function(bot, update):
    text = "Hi, welcome to Your CryptoCoin Bot! I will help you to search" \  
    " the current price of many cryptocurrencies according to" \  
    " coinmarketcap.com. Type /help for further information."
    update.message.reply_text(text)

def help_function(bot, update):
    text = "So far, I only support these commands:" \
    "\nstart: shows the introduction" \
    "\nhelp: shows this message" \  
    "\nprice: searches the price of the specified cryptocurrency"
    update.message.reply_text(text)

def get_price(bot, update, args=None):
    # Checking if the user specified a cryptocurrency:
    if len(args) == 0:
        text = "You have to specify a cryptocoin. For example: /price bitcoin"
        update.message.reply_text(text)
        return

    # Joining all of the arguments to create an unique ID:
    currency_id = "-".join(args)
    # Requesting the price for the given cryptocurrency ID:
    marquet = coinmarketcap.Market()

    try:
        results = marquet.ticker(currency_id)
    except:
        text = "Something went wrong. Try later."
        update.message.reply_text(text)
        return

    # Checking if there are valid results:
    try:
        # Setting values for name and price (USD)
        coin_name = results[0]["name"]
        price_usd = results[0]["price_usd"]
    except:
        text = "Aparently, the cryptocurrency name you have given does not exist" \
        " or is not supported."
        update.message.reply_text(text)
    else:
        # Preparing and sending the answer:
        text = "%s price (USD): %s" % (coin_name, price_usd)
        update.message.reply_text(text)

def main():
    # Creating the Updater and dispatcher:
    updater = Updater("YOUR-TOKEN-HERE")
    dp = updater.dispatcher
    # Adding some CommandHandlers:
    dp.add_handler(CommandHandler("start", start_function))
    dp.add_handler(CommandHandler("help", help_function))
    # This CommandHandler will receive arguments from the user:  
    dp.add_handler(CommandHandler("price", get_price, pass_args=True))
    # Running the bot through me polling method: 
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main() 


Y aquí algunas capturas de pantallas del bot en ejecución:
 


 

Notas: 

  • Todas las imágenes mostradas aquí han sido creadas por el autor de la publicación.
  • Todos los mensajes manejados por el bot, tanto a nivel de código como de interfaz, están en inglés debido a que este es un proyecto ya iniciado por el autor en ese idioma, que resulta ser el más internacional.
  • Esta publicación, basada en el artículo anteriormente publicado por el autor, ha pretendido llevar conocimiento también a la comunidad de hispanohablantes.

Links:


Sort:  

muy buen material hermano, soy programador y casualmente en estos dias estaba pensando embarcarme en un proyecto para desarrollar un bot y me preguntaba cual seria mi mejor opcion pero viendo lo practico que es hacerlo en telegram creo que me decantaré por usarlo.. gracias por tan buen material

Gracias. Espero que esta serie de publicaciones sean de tu utilidad!

excelente amigo... gran post y aun mejor, explicado de la mejor manera, no estudio nada que tenga que ver con programación y lo entendí a la perfección.

una duda que me quedo:

¿cuantos lenguajes de programación podemos conseguir en telegram?

Gracias amigo. Con respecto a tu pregunta. Quizá te refieres a los lenguajes de programación que sirven para programar cosas para Telegram. Los que sirven son aquellos que soportan algo que se llama peticiones HTTPS, que es como un mecanismo para enviar información a través de una red (internet en este caso). Pero dado que incluso así puede dar mucho trabajo al programador, lo más conveniente serían aquellos lenguajes para los cuales ya existe una librería para la Bot API de Telegram, es decir, como un código ya hecho que facilita enormemente el desarrollo del bot sin tener que preocuparse de hacerlo uno mismo de las peticiones HTTPS. Se importa la librería y se añade el código propio que define nuestro bot. En esta publicación puedes ver las librerías y los lenguajes que Telegram recomienda para el desarrollo de bots, entre las cuales están Java, Python, PHP y otros.

Excelente, espero dedicarle algo de tiempo para poder desarrollar algo interesante utilizando las herramientas que mencionas.

Coin Marketplace

STEEM 0.21
TRX 0.20
JST 0.034
BTC 99049.34
ETH 3373.17
USDT 1.00
SBD 3.08