sábado, 27 de octubre de 2012

Envio de Whatsapp condicionado desde Android

... "ya he llegado cari"

Buenos días, hoy mirando mi Android he visto que uno de mis apps preferidas: AutomateIT Pro. tiene una actualización y una de las cosas que han puesto es que la acción a realizar sea abrir una web. Os cuento mi idea tras el salto.

Para el que no lo conozca, AutomaIT es una app que ejecuta ciertas acciones, con ciertos disparadores. Yo lo uso por ejemplo para que me conecte el bluetooth del móvil, al conectarlo a la alimentación eléctrica, para que me conecte al manos libres del coche, pero además le tengo puesto algunos condicionales para que si al pasar 2 minutos no se ha conectado el manos libres, vuelva a desactivar el bluetooth del móvil. Me gusta mucho esta app, tanto que e comprado la versión pro por 1'20€, pero lo que voy a poner en este post, seguramente se pueda hacer con la versión free.

La situación es la siguiente:
"es viernes, cerca de las 18:00 y he ido a recoger a mi señora del curro. Lo ideal es avisarla un poco antes con un whatsapp para que se vaya preparando. Puedo mandar el whatsapp a mano mientras voy conduciendo (poco recomendable) o que se envíe solo, con la ayuda del RaspberryPi"

Evidentemente, que lo envíe de forma automática. La idea es que AutomateIt abra una web, al conectarse el móvil a la célula GSM que más cerca esta del curro y que esa web envíe el whatsapp y sólo los viernes. Como es lógico, AutomateIT ni ninguna otra app puede hacer uso de Whatsapp hasta que los desarrolladores de Whatsapp así lo decidan. Empecemos:
apt-get install apache2
No tengo muchos conocimientos de programación web, seguro que hacer esto con PHP es mucho más facíl, pero no se hacerlo. Así que me invento otro "demonio". Pero lo primero es ver como llega una petición web a los logs del apache. Abro la web:
http://mi_dyndns.dyndns.org/enviawhatsapp/ 666777888/cari_ya_he_llegado, en /var/log/apache2/access.log:
192.168.1.54 - - [27/Oct/2012:13:51:42 +0200] "GET /enviawhatsapp/666777888/cari_ya_he_llegado HTTP/1.1" 404 517 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"
bien bien bien, ahí tenemos todo lo que necesitamos. Nuevamente voy a usar incron:
incrontab -e
y añadimos esta línea para que evento es el que nos interesa:
/var/log/apache2/access.log IN_ALL_EVENTS echo "$@/$# $%"
guardamos y ejecutamos:
incrontab -d
ahora volvemos a abrir la web de antes y en el /var/log/syslog vemos más o menos lo siguiente:
Oct 27 16:58:04 raspberrypi incrond[1584]: (root) CMD (echo "/var/log/apache2/access.log/ IN_MODIFY")
así sabemos que el evento que queremos se llama IN_MODIFY. Modificamos la línea anterior y la dejamos así:
/var/log/apache2/access.log IN_MODIFY /bin/bash /usr/local/bin/automatic_whatsapp.sh
lo que viene a decir más o menos que se ejecute automatic_whatsapp.sh cuando se modifique el archivo de log del apache. Ahora creamos el script en cuestión /usr/local/bin/envia_whatsapp.sh :
#/bin/bash
#Desarrollado por Juanmol para http://RSPPI.blogspot.com

if [ $(tail -2 /var/log/apache2/access.log | grep enviawhatsapp | wc -l) = 1 ];
then
        numero=$(tail -2 /var/log/apache2/access.log | grep enviawhatsapp | cut -f2 -d\" | cut -f3 -d\/);
        texto=$(tail -2 /var/log/apache2/access.log | grep enviawhatsapp | cut -f2 -d\" | cut -f4 -d\/ | cut -f1 -d\ | sed 's/_/\ /g' );
        /bin/bash /usr/local/bin/encola_whatsapp.sh $numero "$texto";
fi
el script envia_whatsapp.sh es el del post anterior, le damos permiso:
chmod +x /usr/local/bin/automatic_whatsapp.sh
Y con eso se acaba el trabajo en el RaspberryPi, ahora en nuestro queridisimo Android, configuramos una nueva regla en AutomateIT:



y listo! Ejecuta la regla manualmente un par de veces para asegurarte que funciona correctamente.

PD: espero haber borrado todos los números de teléfono en el post y que no me pase lo mismo que a Paula Vazquez.
PD2: puedes usar el GPS en lugar del GSM, pero así mola más y es más simple.
PD3: celula GSM = antena GSM más cercana

1 comentario:

  1. Muchas gracias por este post, parece increíble y aunque a veces el incron no me detecta los movimientos en el access.log, sigo pensando es que es como ciencia ficción.
    Saludos

    ResponderEliminar