Inicio Artículos Conexión de Telegram con Raspberry Pi Chateando con nuestros dispositivos

Conexión de Telegram con Raspberry Pi Chateando con nuestros dispositivos

429
0
telegram

Telegram, por lo general, nos pasamos horas delante de nuestros dispositivos móviles chateando con colegas, familiares, y más en estos tiempos de pandemia donde tenemos que mantener las distancias. Pero, ¿y si pudiéramos aprovecharnos de las aplicaciones de mensajería como Telegram y WhatsApp para comunicarnos con nuestros sistemas electrónicos?

Las apps de mensajería instantánea invaden nuestro día a día, y es raro encontrar a alguien que no tenga al menos una de estas 2 aplicaciones referidas, instaladas en su dispositivo. Aprovechémoslo para usarlo en nuestro favor, utilizando una de estas apps que nuestros posibles usuarios ya tienen instalada para ofrecer un canal mucho mas directo con ellos.

El presente artículo pretende mostrar una nueva vía de  desarrollo  de productos, sistemas, dispositivos…, sin necesidad  de  instalar  y  desarrollar una nueva app para nuestro sistema, que  aprovechando las  funcionalidades  de la app de mensajería Telegram, nos permita con muy pocas  líneas de código en nuestra Raspberry Pi, conectar con ella mediante el móvil y la mencionada App.

Así, crearemos un bot (programa o software cuya ejecución se realiza  mediante la interfaz de una aplicación de mensajería interpretando los mensajes escritos en lenguaje natural) que controlaremos desde nuestro móvil con la aplicación Telegram y que a su vez, mandará mensajes a nuestra Raspberry Pi, y esta a su vez nos contestará a través de la misma App.

La aplicación electrónica de este nuevo paradigma la dejamos a cargo del lector, ya que en  el  artículo, describimos como comunicarnos con Telegram  con la Raspberry Pi, y esa comunicación, después, puede suponer la  lectura  de sensores, la ejecución de actuadores, …

Así por ejemplo, podríamos abrir Telegram, ir al chat de nuestro proyecto y realizar las siguientes solicitudes:

  • Dime la temperatura del salón
  • Activar alarma
  • Leer humedad
  • Abrir puerta del garaje
  • Y cualquier otra funcionalidad que seamos capaces de implementar con la Raspberry Pi o una conexión a la

Y si reflexionamos un poco más, podríamos llegar a tener conversaciones con nuestros sistemas. Podríamos hablar con un ascensor y preguntarle dónde se encuentra atascado, preguntarle a nuestro coche cuando le toca la próxima revisión, cuantos kilómetros tienen las ruedas, … todo esto está al alcance de unas pocas líneas de código que desarrollaremos en este artículo.
Para realizar este ejemplo, tan  solo necesitaremos una  Raspberry Pi funcionando y con conexión a Internet (mediante Wifi o cable) y nuestro Smartphone.


Figura 1. Elementos necesarios App de Telegram y Raspberry Pi. En nuestro caso el modelo 3B.

En primer lugar instalaremos la app Telegram en nuestro Smartphone. En los últimos días, Telegram se está erigiendo en una alternativa seria a WhatsApp,
También podemos instalar la app en nuestro ordenador para poder usarla desde el mismo.
cuyos cambios de política de cesión de datos entre esta plataforma y  Facebook, ha hecho que muchos usuarios migren a Telegram consiguiendo alcanzar más de 500 millones de usuarios activos.

Para instalarla, lo haremos de la forma habitual en la que instalamos cualquier otra aplicación en nuestro smartphone. Se trata de una app gratuita cuya  ventaja (en este ejemplo) frente a WhatsApp es que dispone de un API (interfaz de programación) abierta, que nos va a permitir programar el envío y la recepción de mensajes a cualquier usuario de Telegram (respetando las medidas de seguridad correspondientes).

Creando el bot en Telegram

Tras registrarnos, el primer paso será conseguir nuestro identificador de usuario. Este identificador es un número que nos identifica en Telegram y lo utilizaremos como medida de seguridad porque solo contestaremos a este usuario y no a ningún otro. Es decir, haremos que la Raspberry Pi,  solo  conteste cuando el usuario que le manda un mensaje a través de Telegram, seamos nosotros.

Para ello, en el apartado de búsqueda de usuarios, escribiremos userinfobot y nos aparecerá un Bot (programa que funciona mediante lenguaje natural), que en este caso al escribirle cualquier cosa nos contestará con información de nuestro usuario. En la figura de la derecha, puede observarse la respuesta del Bot al comando /start que contiene el nombre y apellido del usuario, así como el idioma utilizado y el ID, el cual se encuentra intencionalmente tapado en la figura y está formado por varios dígitos numéricos. Anotar emos dicho Id, y lo conservaremos. Mediante este código sabremos ante un mensaje si somos realmente nosotros o si es otra persona la que ha interaccionado con nuestro bot.

En este momento crearemos nuestro bot. En la práctica, será como crear un contacto en nuestra app de Telegram, que responderá a nuestros mensajes en función de lo que programemos en nuestra Raspberry Pi.

Para crear un bot en Telegram, usaremos otro bot en la app, denominado bot padre (BotFather). Así, al igual que anteriormente buscamos el bot userinfobot, ahora buscaremos el bot BotFather.

Según entramos al chat de BotFather nos muestra una ayuda de las distintas funcionalidades del mismo. En resumen, podemos crear comandos, ponerle  una imagen a nuestro bot, una descripción, crear juegos,  …  Nosotros solamente crearemos el bot y obtendremos un token identificador del bot, que  es el que nos va a identificar como desarrolladores del bot y que deberemos mantener en secreto si no queremos que cualquier otra persona pueda modificar el comportamiento de nuestro bot.
Para crear el bot, teclearemos /newbot

Al pulsar enviar mensaje el bot nos contesta automáticamente preguntándonos por el nombre del bot a crear. Pondremos el nombre que deseemos.

A continuación, nos vuelve a pedir un nombre pero que acabe en _bot. Pondremos el mismo nombre anterior pero acabado en _bot. Tras esto nos aparecerá el token en pantalla y un enlace a nuestro bot.

En la imagen superior, observamos el token descrito anteriormente. En la imagen el token esta parcialmente oculto. Al igual que el id de usuario, anotaremos este token pues lo necesitaremos en la Raspberry Pi.

Ya hemos acabado con la configuración del bot. Podríamos hacer más cosas como ponerle una imagen, una descripción, … en la bibliografía de  este  artículo el lector podrá encontrar la url de la documentación sobre creación de Bots de Telegram donde podrá encontrar más información al respecto.

Programando la Raspberry Pi

Es hora de confeccionar el interfaz, para que cada vez que queramos enviar   un mensaje al usuario a Telegram (le aparecerá en el chat del bot que hemos creado) o cada vez que el usuario nos escriba a través del bot, la Raspberry envíe o reciba el mensaje correspondiente y actúe en consecuencia.

La comunicación a través del bot, no siempre tendrá que ser reactiva, es decir, responder ante un mensaje del usuario, sino que también podrá ser proactiva, diciéndonos por ejemplo si la Raspberry se ha reiniciado, o si alguien ha accedido por SSH, o si se ha alcanzado una temperatura máxima establecida…

El ejemplo que vamos a  desarrollar es más bien reactivo, pero entendiéndolo,  el lector podrá implementar sus propias funcionalidades tanto  reactivas  y  como proactivas.
El ejemplo tampoco hace uso de tecnologías de procesamiento de lenguaje natural. Hay muchos sistemas que ayudan en dicho procesamiento. Digamos que estas tecnologías, nos permitirían interpretar mensajes, sin tener que escribir siempre de forma idéntica el mensaje. Es decir, frente a  decir siempre de la misma forma “medir temperatura”, con tecnologías de lenguaje natural, podríamos preguntar de varias formas, como “dime la temperatura” , “que temperatura hay ahora”,… Nuestro ejemplo, debido al carácter didáctico e introductor del mismo, no abarcará esta parte del procesado y se limitará simplemente a ser un interfaz entre nuestro móvil y la app de  telegram  y nuestra Raspberry Pi. Podremos controlar los periféricos conectados a nuestra Raspeberry Pi, conocer su estado, recibir alertas, pero siempre con comandos fijos y no con lenguaje natural.

Para comunicarnos a través de Telegram, usaremos su API para la creación de Bots2. Esta API, permite que realicemos un programa en distintos lenguajes de programación para que podamos comunicarnos con un bot que hayamos  creado (del que conozcamos su token).

La API abarca una funcionalidad muy extensa, que pasa desde enviar y recibir mensajes, hasta enviar imágenes, crear teclados personalizados, enviar botones para facilitar la entrada de datos, etc. En nuestro caso tan solo nos centraremos en enviar y recibir mensajes.

Enviar mensajes con el API es muy sencillo. Solo tenemos que construir una URL(dirección de Internet) con el token de nuestro bot y  llamar a  dicha URL.  De hecho, podemos hacerlo desde cualquier navegador, escribiendo bien la llamada.
Si tuviésemos un token que fuera el  siguiente, 1231232:33343343434343hij y  si nuestro identificador de usuario fuera 999999, tras haber pulsado el botón start en nuestro bot (que autoriza de alguna forma a que el  bot  pueda  enviarnos mensajes) para mandar el mensaje “Hola Caracola”, bastaría con escribir en nuestro navegador lo siguiente:

https://api.telegram.org/bot1231232:33343343434343hij/sendMessage? chat_id=999999&text=Hola Caracola

Código 1. Envío de mensajes al bot mediante el API de Telegram vía navegador web

Esta sencillez de aplicación para el envío de mensajes, nos permite ya un montón de funcionalidades en nuestros proyectos. Sistemas de alarmas,  avisos directos a  nuestro smartphone, con una facilidad de  implementación que nos nos aporta mucha versatilidad en nuestros proyectos.

La recepción de  mensajes, sin embargo, aún siendo también bastante sencilla  y que también podemos hacer desde un navegador (solo para probar), tiene algo más de complejidad.

En primer lugar existen 2 modos de recibir mensajes: Polling y Webhooks. La técnica de Polling consiste en preguntar a la cola de mensajes de nuestro bot constantemente por los mensajes que tiene y procesarlos. La técnica de Webhooks, supone configurar el bot con una dirección de Internet, en la que colocaremos un script (programa) en el lenguaje que queramos y  será  invocado cada vez que nos llegue un mensaje.

Es mucho más óptimo el sistema de webhooks, pero supone necesitar más infraestructura. Ya que deberemos tener una dirección pública de Internet, con un certificado seguro y nuestra Raspberry Pi conectado al mismo. Para hacer eso en nuestros hogares u oficinas, necesitaríamos abrir puertos en los  routers, y configurar un certificado seguro. Sin embargo, la técnica de Polling puede hacerse perfectamente desde cualquier Raspberry Pi que simplemente esté conectada a Internet.

Así pues, en nuestro ejemplo usaremos el API mediante Polling para conocer y reaccionar a los mensajes entrantes.

Con los mismos parámetros del ejemplo anterior, para ver mensajes en el navegador teclearemos lo siguiente:
https://api.telegram.org/bot1231232:33343343434343hij/getUpdates
Código 2. Recepción de mensajes vía API bot de telegram
La respuesta la podemos ver en pantalla, se trata de un json con los mensajes recibidos en el bot de Telegram.

{“ok”:true,”result”:[{“update_id”:35299972,
“message”:{“message_id”:239,”from”:
{“id”:999999,”is_bot”:false,”first_name”:”Iker”,”last_name”:”Etxebarria “,”username”:”xxxxxxx”,”language_code”:”es”},”chat”:
{“id”:5594627,”first_name”:”Iker”,”last_name”:”Etxebarria”,”username”:” xxxxx”,”type”:”private”},”date”:1611484422,“text”:”exit”}}]}
Código 3. Respuesta en JSON tras enviar un mensaje desde Telegram al Bot
Hemos destacado el mensaje recibido que es de tipo texto y dice “exit”, el remitente del mensaje, el id 999999 y el update_id. El update_id, es el
identificador del mensaje recibido por el bot. Así podremos pedirle al bot que  nos muestre mensajes posteriores al mensaje 35299972 para ello, solo deberemos sumar 1 a dicho número y volver a preguntar añadiendo el  parámetro offset:

https://api.telegram.org/bot1231232:33343343434343hij/getUpdates?offset=35299973
Código 4: Recepción de mensajes con offset
Y obtendremos, en este caso como resultado el siguiente json:
{“ok”:true,”result”:[]}
Es decir, no tenemos más mensajes porque la variable result es un vector y vacío [ ].Código 5. JSON ante la falta de mensajes en el Bot
Luego nuestro sistema de recepción de mensajes estará preguntando constantemente a la API de Telegram si hay nuevos mensajes. Una vez procesado un mensaje, añadiremos uno al update_id para no volver a procesar dichos mensajes.
La solución más óptima, requeriría almacenar ese update_id en disco para que cada vez que  reiniciemos nuestro sistema tengamos ese  número disponible.  En nuestro ejemplo, no lo haremos para simplificar al máximo la solución.
import requests import sys
token = “1231232:33343343434343hij
destino = “999999
ultimo = “0”
def mandamensaje(texto):
url = “https://api.telegram.org/bot” + token + “/sendMessage? chat_id=” + destino + “&text=” + texto
response = requests.get(url) inicio = 0
mandamensaje(“Iniciando conversacion”) while(True):
url = “https://api.telegram.org/bot” + token + “/getUpdates?offset=”
+ ultimo
response = requests.get(url) dict = response.json() resultado = dict[‘result’] nummensajes = len(resultado)
if (nummensajes>=1):
mensaje = resultado[nummensajes -1][‘message’] ultimo = resultado[nummensajes -1][‘update_id’] texto = mensaje[‘text’]
print(texto)
if ((texto==”exit”)and(inicio>0)): mandamensaje(“Hasta luego”) break
else:
inicio = 1
ultimo = str(ultimo +1)

Código 6. Interfaz telegram para el envío y recepción de mensajes en la Raspberry Pi
El ejemplo anterior3 está compuesto por una parte de inicialización, las líneas
2 y 3 donde indicamos nuestro token y usuario, a continuación tenemos la función mandamensaje, que simplemente hace una llamada a la url que hemos descrito anteriormente para mandar un mensaje. Seguidamente entramos en  un bucle infinito en el que está constantemente preguntando por mensajes y si hay al menos uno, imprime en pantalla el mensaje.

Si el mensaje es exit, nos manda un mensaje de despedida y sale del bucle finalizando el programa.

El lector, podrá añadir más bloques como el bloque de if ((texto==“exit”)… añadiendo otros comandos que desee procesar. Así si recibe temperatura, leer la temperatura, si recibe andar, mover un robot, o lo que desee.

El ejemplo está realizado directamente accediendo a la API creada por Telegram, para entender mejor su funcionamiento, pero existen librerías en distintos lenguajes (php4, Python5, java6, …) para que el envío y la recepción  de mensajes sea mucho más sencilla. En este primer artículo, hemos considerado importante entender el funcionamiento del API y que luego sea el lector el que decida el método de uso que mejor considere.

Usando nuestro Bot

Veamos el bot en acción. Si llamamos a nuestro script anterior telegram.py en nuestra Raspberry Pi podremos ejecutarlo escribiendo:
python telegram.py

Código 7. Lanzamiento del script de interfaz telegram Raspberry Pi

Figura 3. Ejemplo de uso del interfaz creado

En la figura 3, vemos como al iniciar desde la Raspberry Pi (derecha de la imagen), el bot nos ha mandado el mensaje Iniciando conversación (izquierda de la imagen).
Finalmente, los comandos que hemos escrito en el bot, los ha ido escribiendo  en la pantalla de la Raspberry Pi hasta que hemos escrito exit. Entonces el bot se ha despedido con un Hasta luego y ha finalizado su ejecución. El bot ya no responderá mas hasta que volvamos a lanzar el script Python.
Es hora de que el lector explore las posibilidades que nos brinda esta app. Mandarnos alertas al móvil, responder a comandos que  interactúen con  sensores  y aplicadores, … e incluso explorar no sólo con el  móvil, sino con el Smartwatch. Algunos  de estos tienen app de Telegram y  podemos mandar comandos a nuestra Raspberry Pi desde él mismo.

Bibliografía

  1. API para la creación de bots de Telegram: https://core.telegram.org/bots/ api
  2. Código fuente del  ejemplo telegram.py https://docs.google.com/document/ d     /          e                                                / 2PACX-1vQlFx1br1D9WpvP4d8s9VjYHwBFKqYNm7cdauONs6TP8vLhcRiR mB3TaxcQBLKK9v-rTWAG1kHbnJLF/pub
  3. Web de la fundación raspberry https://www.raspberrypi.org/
  4. Librería php para crear bots en Telegram https://packagist.org/packages/ irazasyed/telegram-bot-sdk
  5. Librería Python para crear bots en Telegram https://github.com/python- telegram-bot/python-telegram-bot
  6. Librería Java para crear bots en Telegram https://github.com/rubenlagus/ TelegramBots