18 enero 2013

Controlando la Raspberry PI desde Twitter

Esta entrada la escribí originalmente en inglés para la comunidad de Raspberry PI en Google+. Sin embargo se hacía necesario que escribiera la correspondiente versión en español, así que aquí les dejo para que se entretengan un rato.

La idea principal


El día de ayer, estaba intentando escribir un pequeño script en Python para llevar el registro del tráfico aquí en mi país, estaba pensado que podría ser realmente interesante si pudiera controlar la Raspberry PI usando mi estado en Twitter.

Despues de googlear por un rato, me encontré con las Herramientas para Twitter en Python, este es un pequeño script que se conecta a la API REST de Twitter y te provee de un par de herramientas para seguir las publicaciones en Twitter.

Lo que resulta más interesante es que estas herramientas incluyen una pequeña API que te permite escribir programas personalizados. Creanme, pueden crear cosas interesantes en menos de 10 líneas de código.

Así que me dije a mi mísmo... ¿Por qué no programar algo?


¿Cómo trabaja?


Luego de trabajar en la noche, terminé de programar un pequeño cliente (estado alfa con un montón de bugs) para la línea de comandos que hace algo muy simple:

Si publicas un tweet que inicie con el hashtag #rpitwit seguido de un comando, este programa revisará si existe un script de shell o un script de python en el directorio "rpitwit_commands" bajo tu directorio de usuario y lo ejecuta.

Por ejemplo si tienes un script que toma una foto de la webcam y la sube a un website podrías colocar algo como esto en tu status:


#rpitwit tomarfoto

Esto revisará si un script llamado "tomarfoto" o "tomarfoto.py" existe en el directorio de comandos y lo va a ajecutar.

Es posible enviar parámetros al comando. Por ejemplo podemos imaginar que podemos cambiar el tamaño de la imagen y enviar algo como esto:


#rpitwit tomarfoto 800x600

¡Y eso es todo! ¡Esa es la forma que funciona!

¿Por qué no simplemente permitir que ejecute cualquier comando?


Bueno... Eso hubiera sido demasiado fácil. Pero la razón principal es que, en general, no es una muy buena idea dejar cualquier forma de ejecutar comandos remotos sobre un canal "inseguro" (Sí, Twitter es una forma pública y realmente muy insegura para enviar comandos a tu RasPI). Así que limitar la ejecución de los scripts bajo el directorio de usuario ayuda a mantener las cosas "bajo tu control".

Tienes que crear un script y colocarlo en el directorio de comandos antes de poder ejecutarlo remotamente desde Twitter.

Adicionalmente puedes modificar el código fuente y permitir al programa ejecutar CUALQUIER comando, pero realmente no te recomiendo que lo hagas.

¿Cómo Instalarlo?


Prerequisitos

  • Primero, vas a necesitar Python 2.7.x, descargalo e instalalo.
  • Luego, necesitas tener las "setuptools". En la mayoría de casos ya las tendrás instaladas. Si no, ve a la siguiente dirección y sigue las instrucciones para instalarlas:
     

Instalando "La forma fácil"


Como root, ejecuta el siguiente comando:

easy_install rpitwit

Instalando "La forma difícil"


Descarga el paquete de las herramientas de Twitter para Python desde la siguiente dirección:


Descarga RPiTwit de la siguiente dirección:


Para instalar ejecuta los siguientes comandos:

tar -xzf twitter*.gz
cd twitter-1.9.0

Luego como root:

python setup.py install

Luego:

tar -xzf rpitwit-0.1.0.tar.gz
cd rpitwit-0.1.0

Y nuevamente como root:

python setup.py install

Ejecutando el cliente la primera vez


Nota: Nunca ejecutar este comando como "root".

Ejecuta en la consola el siguiente comando:

rpitwit

Se abrirá una ventana del navegador pidiendote autorizar la aplicación "RPiTwitt" para acceder tu información pública.

En la página de Twitter recibirás un "PIN" que debes escribir en la consola como lo siguiente:

Please enter the PIN:

Si el script no puede abrir una ventana del anvegador, copia la dirección y abrela en un navegador.

Luego de ello, el script te preguntará por los usuarios que podrán ejecutar comandos, no coloques la @ al inicio del nombre de usuario.

Por ejemplo si quieres permitirme ejecutar comandos en tu RasPI, solo coloca mi nombre de usuario:

Please write the username(s) which do you want to<
authorize to send commands (separated by commas):
mxgxw_alpha

Un mensaje de confirmación te informará si el usuario fue agregado a la lista de autorizaciones:

Trying to get userid for mxgxw_alpha
>User @mxgxw_alpha added to the list.

Luego el script va a crear el directorio de "comandos", este direcorio se llama "rpitwit_commands" bajo tu directorio de usuario. En la Raspberry PI si estás corriendo "raspian" este será /home/pi/rpitwit_commands

Creating script directory on /home/pi/rpitwit_commands
Copy your shell or python scripts to the
script directory and execute them using:
#rpitwit <command> [args]


Un mensaje final te confirmará que el script esta "siguiendo" los usuarios.

Nota: Este mensaje muestra los IDs de los usuarios en vez de los nombres.
Following to 257243704


Este programa corre en primer plano e imprime mensajes de "depuración" que son útiles para monitorear si está funcionando de manera adecuada.

POR HACER: Tal vez en una próxima versión incluyo un script para instalarlo como servicio.

Creando comandos personalizados


Scripts de Python


Esta es la parte interesante y la más fácil. Solo crea un script de python y colocalo dentro del directorio de comandos. Hagamos un "¡Hola Mundo!".


Crea un archivo con el texto:

print "¡Hola Mundo!"


Y guardalo bajo /home/pi/rpitwit_commands utilizando el nombre "hola.py"

Verifica que rpitwit está corriendo.

Ahora entra a tu cuenta de Twitter y publica

#rpitwit hola

Verifica en la consola que obtienes algo como:
Running python script hola.py
Arguments
¡Hola Mundo!


Scrips de Bash


Crea un archivo con el texto:

#!/bin/sh 
echo "¡Hola Mundo!"

Y guardalo en /home/pi/rpitwit_commands utilizando el nombre "holash"

Cambia los permisos del archivo para convertilo en ejecutable:

chmod 755 holash

Verifica que rpitwit está corriendo.

Ahora ve a tu cuenta de twitter y publica lo siguiente:

#rpitwit holash

Verifica en la consola que tienes algo como lo siguiente:

Running command hellosh
Arguments
[u'/home/pi/rpitwit_commands/holash']
¡Hola Mundo!


¿Hay algo más que deba saber?


Sí.

El archivo de configuración


Este script crea un archivo de configuración llamado .rpitwit_config bajo tu directorio de usuario, hay varias cosas que podríasn cambiar pero trata de no cambiar nada además de las siguientes dos llíneas.


magicword=#rpitwit


Esta es la palabra utilizada para instruir a rpitwit que ejecute un comando. Puedes cambiarla por lo que quieras, no necesariamente tiene que ser un #hashtag

follow=<some_numbers>


Estos son los IDs de usuarios que rpitwit permite que ejecuten comandos utilizando la palabra mágica. Puedes buscar los ids de los usuarios utilizando la siguiente dirección:

https://api.twitter.com/1/users/show.xml?screen_name=<write here the user name>


En la respuesta busca "id", ese es el número que tienes que colocar en "follow".

Unas notas finales


Este script no solo funciona en la "Raspberry PI", lo acabo de probar en mi Linux Slackware, así que en teoría debería funcionar en cualquier distribución de Linux con Python y setuptools.

He escrito el programa con el objeto de que sea útil y fácil de usar, usenlo con cuidado, no coloquen "comandos peligrosos" en el directorio de comandos o scripts de fuentes desconocidas.

Tambien puedes usar tus claves de aplicación propias de Twitter, tristemente no hay una forma sencilla de cambiarlas, lee la documentación para más información.

El código está bajo licencia GNU GPL v3, puedes modificar y redistribuirlo manteniendo los copyrights originales.

No habiendo nada más que escribir... ¡¡Hasta la próxima!!

4 comentarios:

Javier Magán dijo...

Hola muchas gracias por el aporte, aunque he tenido un problema. A la hora de meterme en la pagina donde tendria que encontrar mi PIN me salta un mensaje en la página diciendome "SSL is required".
Se necesita hacer un paso previo? que podría hacer? muchas gracias

Javier Magán dijo...

oh al parecer cambiaron el dominio hace poco. Se soluciona cambiando http://... por https:// en el navegador.
Más info https://dev.twitter.com/discussions/24239

gracias por la información ;)

Javier Magán dijo...

Hay alguna manera de que se mantenga a la escucha mas de 30 segundos? Si no se escribe nada este se para.
Gracias

Javier Magán dijo...

Hay alguna manera de que se mantenga a la escucha mas de 30 segundos? Si no se escribe nada este se para.
Gracias