Tutorial Raspberry Pi - Uso de Telegram con Python

¡Hola! Después de la fama que ha rodeado a Telegram, varios Makers como yo, quieren hacerlo más interactivo con el mundo exterior, es decir, que se vuelva una herramienta de comunicación con nuestras cámaras, sensores, arduinos, reles y una infinidad de cosas que podrían usarse. Después de investigar y experimentar un poco he descubierto la manera para lograr interactuar con la api de Linux que nos brinda la pagina oficial, desde un programa en Python. Gracias a una librería no muy conocida pero muy potente llamada Pexpect.

Manos a la Obra:

Primero que nada tenemos que instalar Telegram messenger CLI como lo expliqué en mi tutorial anterior.

Pexpect se encuentra dentro de The Python Package Index o mejor conocido como PyPi, que es un repositorio lleno de programas de Python, así que tendremos que instalarlo ejecutando en la terminal:

sudo apt-get install python-pip
Después descargamos Pexpect del repositorio ejecutando en la terminal:
pip install pexpect

y listo. Ahora les enseñaré cómo utilizarlo.

Pexpect está diseñado para ejecutar un programa e interactuar con él por línea de comandos, principalmente usado para  SSH, FTP, mencoder, passwd, etc. A continuación les mostraré las funciones básicas que usaremos de esta librería.

pexpect.spawn('programa')

Esta función ejecuta un programa que sea accesible por medio de comandos, incluso puedes ejecutarlo con parámetros. En nuestro caso tendremos que ejecutarlo de la siguiente forma para abrir Telegram.

pexpect.spawn('./telegram -k tg.pub')

Otra de las funciones es expect (''). Gracias a esta función podemos parar la ejecución de nuestro programa principal hasta que Telegram nos arroje una cadena de texto determinada, un problema es que no lo interpreta como texto plano por lo que si ingresamos * / ] o cualquier otro signo se puede interpretar. Tras unas cuantas pruebas  comprobé que para esperar la conexión de Telegram y alistarse para ingresar comandos tenemos que ejecutar la función expect de la siguiente forma:

telegram.expect('0m')

Lo que seria igual a esperar el signo '>'.

Nota: La espera por defecto es de 2 minutos. Si pasan estos 2 minutos y aún no aparece la cadena de caracteres que está esperando la función expect el programa se cierra y arroja el valor de su buffer almacenado hasta el momento. Esto se puede regular agregándole un valor al parámetro timeout.

expect('0m',timeout = 1200)

La función sendline(), nos sirve para poder ejecutar una línea de comando como si nosotros mismos estuviéramos ejecutando directamente a la aplicación de Telegram como en el siguiente ejemplo.

sendline('msg Luis_Villa Probando desde Python')

Revisen la documentación de la librería para mas información pero, por el momento son las funciones necesarias para enviar mensajes, imágenes y agregar contactos.

Por desgracia aún no he podido hacer un programa fiable sin tanto margen de error para la interacción con la recepción de mensajes, debido a que la aplicación de Telegram que usamos en Linux no marca como leídos los mensajes, y las alertas de que un contacto esta escribiendo son muy continuas por lo que es un poco difícil delimitar pero en cuanto tenga más refinado mi código con gusto lo comparto.

Envio de un mensaje

Cabe destacar que con Telegram sólo podemos enviar mensajes a contactos ya agregados anteriormente. Para el envio del mensaje guardamos el siguiente código en la misma carpeta que esta telegrama en mi caso "/home/pi/tg".
#!usr/bin/env
import pexpect

contacto = "Luis_Villa"                          #Contacto a quien va el mensaje
mensaje = "Probando desde Python!!"              #Mensaje a enviar
telegram = pexpect.spawn('./telegram -k tg.pub') #Inicia Telegram
telegram.expect('0m')                            #Espera a que termine de iniciar
telegram.sendline('msg '+contacto+' '+mensaje)   #Ejecuta el comando msg
print ('Mensaje enviado a '+ contacto)           #Notifica que ya se ha mandado el mensaje
telegram.sendline('quit')                        #cierra Telegram
Lo guardamos con el nombre que sea con extension .py y lo ejecutamos en la terminal. python1   python2

Envio de Imágenes

Básicamente es lo mismo que anteriormente vimos, solo que ahora usaremos la función send_photo <contacto> <ruta del la foto>
#!usr/bin/env
import pexpect
import time

contacto = "Luis_Villa"                          #Contacto a quien va el mensaje
img = "/home/pi/prueba.jpg"                      #Imagen a enviar
telegram = pexpect.spawn('./telegram -k tg.pub') #Inicia Telegram
telegram.expect('0m')                            #Espera a que termine de iniciar
telegram.sendline('send_photo '+contacto+' '+img)#Ejecuta el comando send_photo
telegram.expect('100',timeout = 1200)
telegram.expect('photo')
print ('Imagen enviado a '+ contacto)            #Notifica que ya se ha mandado el mensaje
telegram.expect('0m') 
telegram.sendline('quit')                        #Cierra el programa
  python3  

Agregar Contactos

Como ya he mencionado antes, Telegram sólo nos deja enviar mensaje a números agregados a la lista de contactos. Lograr eso es muy sencillo con el siguiente programa a través de Python:
#!usr/bin/env
import pexpect
import time

telefono = '+521..........'
nombre = 'Luis'
apellido = 'Villa'
telegram = pexpect.spawn('./telegram -k tg.pub') 
self.child.expect('0m')
self.child.sendline('add_contact '+telefono+' '+nombre+' '+apellido)
print ('El contacto '+nombre+' '+apellido+' con el teléfono '+telefono)
self.child.expect('0m')
self.child.sendline('quit')

Cursos


Gratis
Mario Pérez Esteso
¡Ya está disponible!
Mario Pérez Esteso
¡Ya está disponible!
Mario Pérez Esteso
¡Ya está disponible!
Mario Pérez Esteso
¡Ya está disponible!

Planes


  • Básico
  • 0 €/mes
  • Acceso a cursos gratuitos
  • Preguntar dudas en cada curso
  • ¡Lo quiero!