12/04/2017: He actualizado el tutorial a la nueva versión de la API.

En la primera parte del tutorial aprendimos cómo crear un bot de lo más sencillo que respondía a comandos como holamundo logo y nos mandaba respuestas según dichos comandos. Sin embargo por aquel entonces Telegram aún no había presentado la nueva modalidad de bots llamados bots inline que permiten ser llamados desde cualquier conversación (ya sea grupo o no) sin necesidad de añadirlos ni de hablar directamente con ellos, sino simplemente mencionándolos introduciendo un texto y el bot nos respondería con dicho texto bajo la modificación que haya hecho. Por ejemplo, así responde el bot @bold cuando le llamamos desde una conversación:

Captura de pantalla 2016-05-03 a las 13.05.44

Y cuando pulsamos en alguna de las opciones (en este caso en “Bold”) se muestra así en la conversación:

Captura de pantalla 2016-05-03 a las 13.05.53

De este modo nos permiten un modo totalmente nuevo de interactuar con los bots ya que podemos enviar su contenido desde cualquier conversación. Precisamente sobre esto irá esta segunda parte del tutorial, ya que os enseñaré a cómo, partiendo del bot que creamos en la primera parte, añadirle la función inline para que salude al usuario con el texto que haya añadido, tal que así:Captura de pantalla 2016-05-03 a las 13.09.25Y cuando pulsamos en cualquiera de las opciones se manda desde nuestro bot a la conversación en la que estemos:

Captura de pantalla 2016-05-03 a las 13.09.33

Como veréis dentro de escasos momentos el procedimiento para lograr esto es de lo más sencillo con la API de Python que os comentaba en la primera parte. Por tanto, ¡vamos allá!

Requisitos

Puesto que vamos a expandir el bot que creamos en la primera parte es recomendable que ya la hayáis leído y realizado todos los pasos que se indican.

Añadiendo la funcionalidad inline

Antes de ponernos a tocar código necesitaremos primero añadir la funcionalidad inline en BotFather para que nuestro bot pueda ser llamado desde cualquier conversación. Para ello, abriremos de nuevo nuestra conversación con @BotFather y pondremos el comando /setinline. Nos preguntará por qué bot así que seleccionamos el que queramos (en mi caso @BytelixPruebaBot) y después ponemos el texto que queremos que se muestre cuando llamemos al bot desde una conversación:

Captura de pantalla 2016-05-03 a las 12.16.56

Con esto ya lo tenemos configurado para poder responder a peticiones inline, así que vamos a programar a nuestro bot para poder aceptarlas.

Respondiendo a peticiones inline

Para realizar este tipo de peticiones necesitaremos primero añadir un par de librerías necesarias, así que justo después de la que ya añadimos en la primera parte ponemos estas dos:

Como he puesto en los comentarios de código la segunda no es estrictamente necesaria, pero sí muy útil en el siguiente trozo de código que veréis.

Ahora ya podemos ponernos manos a la obra con nuestro método que se encargará de responder a las peticiones inline, para ello he creado un método llamado inline (muy original, lo sé), que toma dos argumentos: bot update, al igual que todos los métodos que hemos creado hasta ahora.

Todo el proceso se realiza con los objetos InlineQueryResultArticle, los cuales representan las respuestas que habéis visto más arriba cuando llamamos a algún bot desde una conversación. En el ejemplo que os muestro le pasamos un id, título texto. El id lo calculamos con un random (de ahí la librería que os hablaba anteriormente) y el título y texto simplemente es lo creado en alternativax_texto, en el cual hemos puesto una frase junto con el texto que hemos recibido del usuario.

Finalmente todos estos objetos los hemos añadido a una lista, la cual es la que tenemos que pasar al bot mediante el método answerInlineQuery para que este lo muestre al usuario. Cuando el usuario seleccione alguna de las opciones que se le muestren, en la conversación en la que se encuentre actualmente se enviará el contenido de message_text que hemos puesto anteriormente, concretamente el correspondiente al que haya seleccionado el usuario.

Finalmente, registramos este método para las peticiones inline en el método main que creamos en la primera parte, justo después de la de los comandos:

Con esto nuestro bot ya debería responder a estas peticiones y podemos probarlo libremente. De nuevo pulsamos en Run:

Bot

Nos vamos a cualquier conversación y ponemos el alias de nuestro bot seguido de un nombre, por ejemplo: @BytelixPruebaBot señor. Nos saldrá este menú en el que podremos seleccionar la respuesta y se enviará:

Captura de pantalla 2016-05-03 a las 13.28.18

¡Y listo!

Con estos simples pasos, como veis, tenemos ya a nuestros bot disponible desde cualquier conversación. Aunque por supuesto esto es sólo una muestra de lo que la API puede hacer, ya que no sólo podéis mandar texto sino también imágenes, pero eso ya nos queda para otra entrega del tutorial.

De nuevo, si tenéis cualquier duda o problema podéis ponerla en los comentarios e intentaré ayudaros con lo que pueda.

Código completo del bot

Artículos relacionados

Comentarios

  • Elder Joel Monzon Alcaraz

    Excelente, lo voy a probar.

  • Manuel Bianco

    Hola que tal, tengo un problema. Al poner el nombre de mi bot, seguido de un nombre del usuario, el icono de los emojis empieza a girar, me muestra el ‘Envíe su nombre’ como corresponde, pero no me despliega las opciones. Es decir todo bien menos la parte de los resultados que no se muestra. Ya revise todo pero no muestra errores en ningun lado. Alguna novedad o ayuda que no conozca?

    • Manuel Bianco

      Yo tengo el mismo problema, seguramente sea porque se actualizo algo y no se como cambiarlo. Si alguien sabe como seguir se lo agradeceria mucho.

      • ¡Hola Manuel! Acabo de actualizar el código de la guía a la nueva versión de la API. Como bien dices han actualizado y han “roto el juguete”. Prueba con el código nuevo a ver si te funciona, por mi parte me funciona todo sin problemas.

        ¡Un saludo!

  • Bruno O.

    … Hola, para el caso de un Bot que hace preguntas, donde se guardan las respuestas y que espacio se tiene disponible para eso.? Gracias de antemano por el apoyo y felicitaciones por este excelente post

    • ¡Hola Bruno! Personalmente te recomendaría que todo lo referente a respuestas lo guardases en una base de datos. Por ponerte un ejemplo sencillo, podrías crear una tabla en tu base de datos que guarde el ID del chat del usuario junto con la última respuesta que ha dado. Esto es, digamos, algo más avanzado que lo tratamos en los tutoriales, pero siendo Python un lenguaje tan famoso estoy seguro de que no tendrás ningún problema en encontrar miles de tutoriales sobre persistencia de datos y bases de datos en concretos. ¡Mucha suerte!

      • Bruno O.

        … Excelente, gracias. Si, me parece un buen camino para guardar los datos..
        Aprovecho para comentarte que en cuanto al servidor virtual no pude hacerlo con c9 como lo recomiendas, si tienes algún dato al respecto no estaría de mas, saludos y gracias por este excelente post….

  • Lynn

    Hola!, desde que lei esto, decidi seguir “al pie de la letra” pero tengo un problema que muestro en esta captura http://prntscr.com/ewpbsb Desde codeanywhere ya que en Cloud9 con los nuevos cambios necesitas Tarjeta para lograr registrarte (incluso con github).

  • Ulises Gonzales

    Como le hago una pregunta a mi bots desde un grupo?

  • Japo Mint -Jorge Garcia-

    hola mi pregunta es que alternativas gratuitas existen a C9 ? ya que no se admiten mas creaciones de cuentas. muchas gracias por las 2 guias