miércoles, 28 de noviembre de 2012

Demonio para el envio progresivo de Whatsapp

y que no se nos quede ninguno por el camino

Voy a completar un poco el post anterior. Si ya lo has puesto en funcionamiento, posiblemente te hayas dado cuenta de que si envías muchos seguidos, algunos whatsapp se quedan por el camino. Para evitar esto, vamos a hacer un par de scripts en nuestro RaspberryPi.
Veamos el problema al que nos enfrentamos. Usando el script envia_whatsapp.sh del post anterior:
root@raspberrypi:~# for n in $(seq 1 10); do envia_whatsapp.sh 666777888 "prueba $n" ; done
Llega lo siguiente (varia mucho):
No sería un problema muy preocupante, sino fuera porque la idea de esto, es usarlo como alarmas en con Nagios (por ejemplo). Haciendo algunas pruebas, veo que no hay problemas, siempre y cuando se envíe un whatsapp cada dos segundos. Como ya sabéis soy bastante perro programando, así que empiezo así:
/usr/local/bin/demonio_whatsapp.sh
#!/bin/bash
while ((1));
do
        sentencia=$(head -1 /var/spool/whatsapp/colawhatsapp.col)
        if [ $(echo $sentencia | wc -c) -gt 8 ];
        then
                echo se hace;
                destino=$(echo $sentencia | cut -f2 -d\ | cut -f1 -d\_ ) ;
                mensaje=$(echo $sentencia | cut -f2 -d\_) ;
                orden=$(echo $sentencia | cut -f1 -d\ ) ;
                echo number=$destino smsencode=$mensaje;
                /bin/bash /usr/local/bin/envia_whatsapp.sh $destino "$mensaje" ;
                cat /var/spool/whatsapp/colawhatsapp.col | grep -v $orden > /var/spool/whatsapp/colawhatsapp.col2 ;
                mv /var/spool/whatsapp/colawhatsapp.col2 /var/spool/whatsapp/colawhatsapp.col ;
        fi
sleep 2;
done
ese script mira la primera línea del archivo /var/spool/whatsapp/colawhatsapp.col, donde se irán registrando los nuevos mensajes por enviar. De haber uno lo envía y lo borra de la cola. Se repite esto cada dos segundos. A continuación el script para encolar los envíos:
/usr/local/bin/encola_whatsapp.sh
#!/bin/bash
echo movil: $1
echo mensaje: $2
let ultimo=$(cat /var/spool/whatsapp/ultimo.col)+1
echo $ultimo > /var/spool/whatsapp/ultimo.col
echo whatsapp$ultimo:::whatsapp $1_$2 | sed 's/\:\:\://g' >> /var/spool/whatsapp/colawhatsapp.col
echo mensaje $ultimo encolado
Este script, crea la cola de envíos y lleva un contador. Y este el script del post anterior, con algunos cambios:
/usr/local/bin/envia_whatsapp.sh
#!/bin/bash
# programado por Juanmol para http://rsppi.blogspot.com
echo se recibe: $@ >> /tmp/enviawhatsapp.log
ruta=/usr/src/WhatsAPI-master/src/php/
cat $ruta/testprotocol.php | sed "s/destino/$1/g" | sed "s/mensaje/$2/g" > $ruta/elphp.php
estado=$(php $ruta/elphp.php | wc -l ) # ademas de enviarlo guarda el estado
if [ $estado -gt 1 ];
then
        echo el mensaje no se ha enviado, se reencola;
        /bin/bash /usr/local/bin/encola_whatsapp.sh $1 \"$2\" &
else
        echo parece que el mensaje se ha enviado;
fi
rm $ruta/elphp.php
Creamos la ruta y los archivos, ajustamos permisos:
mkdir -p /var/spool/whatsapp
touch /var/spool/whatsapp/colawhatsapp.col
echo 0 > /var/spool/whatsapp/ultimo.col
chmod +x /usr/local/bin/demonio_whatsapp.sh
chmod +x /usr/local/bin/encola_whatsapp.sh
Para que arranque el demonio, lo voy a hacer con screen, añadimos al /etc/rc.local :
screen -d -m -S demoniowhatsapp /usr/local/bin/demonio_whatsapp.sh
podemos reiniciar, o simplemente ejecutar la línea anterior para poner en marcha el demonio. Y ahora lo probamos, para enviar uno nuevo:
root@raspberrypi:~# encola_whatsapp.sh 666777888 "hola caracola"
y llega (pos claro). Ahora enviamos 10 seguidos:
root@raspberrypi:~# for n in $(seq 1 10); do encola_whatsapp.sh 666777888 "prueba $n" ; done
y el móvil vemos como llegan todos, poco a poco.

29 comentarios:

  1. muchas gracias!! por cierto creo que al manual primero del whatsapp la falta alguna cosa, porque lo hice la primera vez y bien, pero ahora que formateado de nuevo el raspberry me da error.

    Me ecanta tu blog :)

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Pego lo que sale en la terminal:

      http://pastebin.com/6sKVQvY1

      Mi testprotcol.php

      http://pastebin.com/cateBs0k


      Lo tengo puesto asi para poder testearlo, luego cambiare las variables para el script, pero no funciona, pienso que cambiaron algo en la api porque recuerdo que la version de la ultima vez que lo hice no salia esos mensajes en la terminal al ejecutar el php.

      Eliminar
    3. si que lo han cambiado, pero con un poco de ojo seguro que encontramos como solucionarlo para la nueva versión. Cuando tenga un rato me pongo con esto.

      Eliminar
    4. ya he descubierto el problema, tenia una version de whatsapp mas moderna y no me dejaba hacer login, he bajado una mas antigua y ahora funciona correctamente.

      la version de 2 campos de 3 digitos no funciona pero si funciona la de 1 campo con 3 digitos.

      Eliminar
  2. Yo no consigo que envíe... se queda como bloqueado al enviar, aunque los mensajes los encola bien. Adjunto una prueba de envío:

    root@Rasp:/usr/src/whatsapp/src/php# envia_whatsapp.sh 666777888 "TEST"
    ^C
    root@Rasp:/usr/src/whatsapp/src/php# envia_whatsapp.sh 34666777888 "TEST"
    ^C
    root@Rasp:/usr/src/whatsapp/src/php#

    root@Rasp:/usr/src/whatsapp/src/php# cat /tmp/enviawhatsapp.log
    se recibe: 666777888 hola caracola
    se recibe: 666777888 prueba 1
    se recibe: 666777888 prueba 1

    root@Rasp:/usr/src/whatsapp/src/php# /usr/local/bin/demonio_whatsapp.sh
    se hace
    number=666777888 smsencode=prueba 1

    root@Rasp:/var/spool/whatsapp# cat /var/spool/whatsapp/colawhatsapp.col
    whatsapp1whatsapp 666777888_prueba 1
    whatsapp2whatsapp 666777888_prueba 2


    Por supuesto, el nº es inventado, pero es para que se vea que se prueba con 34 y sin 34 y con un nº nacional y todo eso....
    ¿Podría ser problema de permisos, de que no encuentre el GW o algo así, algo nat estático que necesite? La máquina navega ok, tiene PHP5 instalado y funcionando.
    ¿Me queda algo por comprobar?

    ResponderEliminar
  3. La línea:

    echo 0 > /var/spool/whatsapp/ultimo.col

    Me dá este error, con sudo y sin sudo:

    -bash: /var/spool/whatsapp/ultimo.col: Permiso denegado

    Ni puta idea que es el -bash xD :___(

    ResponderEliminar
    Respuestas
    1. a mi tambien me ha dado ese error. Lo que he hecho ha sido irme con el navegar del escritorio como root y sobre el archivo darle a propiedades luego a permision y lo he puesto todo de lectura y escritura.

      despues he puesto la linea en el terminal de nuevo y no me ha dado el error.

      no se si es correcto pero bueno

      Eliminar
    2. es correcto como dice @Rusty, pero si estas por consola sin X, hazle un:
      chmod 777 /var/spool/whatsapp/ultimo.col

      Eliminar
  4. Ah, o sea que solo es darle todos los permisos de lectura/escritura.

    Lo que pasa que para asignar los permisos 777 primero tiene que existir el archivo, ¿creo un archivo vacío con el nano y luego le doy los permisos y ya está?

    Es que no entiendo muy bien que hace el "0 >" después del echo (que sirve para crear un archivo, no?)

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. me he dado cuanta despues. Pero nada sigue sin funcionarme, no me da error pero no me llegan. Mira que le he dado vueltas a todo mil veces ya

    ResponderEliminar
  7. Juanmol deberia tener alguna libreria en especial o algo instalado que pueda hacerme falta para que funcione aparte del php5?

    ResponderEliminar
  8. A mi tampoco me da error y tampoco me llegan xD

    Se ponen a la cola y nada más.

    Y he probado el número de FonYou y sí que está activo.

    ResponderEliminar
  9. Cuando envías un mensaje de prueba:

    encola_whatsapp.sh 666777888 "hola caracola"

    ¿en la consola tiene que salir lo siguiente?:

    movil: 666777888
    mensaje: hola caracola
    mensaje 1 encolado

    ¿o tiene que poner?:

    "parece que el mensaje se ha enviado"

    por que a mi me salen los 3 mensajes anteriores, pero voy a ultimo.col y allí solo hay un número escrito, el "1"

    Voy a tirar la raspi por la ventana >_<

    ResponderEliminar
    Respuestas
    1. ya somos 2.
      Yo si lo mando como encola_whatsapp.sh me sale lo mismo que ha ti, si lo mando con envia_whatsapp.sh me sale "parece que el mensaje se ha enviado"

      en ninguno de los casos llegan, y ademas con el encola sale muy rapido el resultado y con el envia parece como que hiciera algo más

      Eliminar
    2. Y además en el Whatsapp aparece la hora del último mensaje enviado desde la Pi pero nunca llega xD

      Eliminar
  10. Estoy pensando que igual no nos funciona porque nos falte algo de instalar que Juanmol tenga y nosotros no, ya que él ha ido instalando todos los superpoderes con sus respectivos recursos para cada uno, sin embargo nosotros sólo habremos instalado los que nos interesaban, dejando cosas en el tintero.

    A ver si saco tiempo un día e instalo todo desde el primer tutorial (menos asterisk, que no lo usaría)

    ResponderEliminar
    Respuestas
    1. Hola, no creo que sea eso xd. Lo que pasa es que han cambiado la API y la manera de resolver la clave (eso creo). Yo lo he probado tambien y creo que donde falla es en la funcion de login despues de conectar, me da un error justo en esa linea.
      Haber si alguien consigue que le funcione ...

      Eliminar
  11. Hola,

    Comprobado que el problema es del login, han cambiado la forma de generar la password. He creado un usuario nuevo con BlueStacks y no he conseguido que funcionase. Pero tras modificar el script "testprotocol.php" creado por Juanmol y usando el número de teléfono e imei de un equipo que tenía instalado el Whatsapp desde hace unos meses, está funcionando. Está modificado para utilizar la última versión del API

    http://pastebin.com/7piMtrBg

    ResponderEliminar
  12. Hola,

    Algo han cambiado en el Whatsapp, ¿le funciona a alguien?

    Un saludo

    ResponderEliminar
  13. Ayer por la noche cambiaron algo. A mi me fallo ayer, no me avisaba las descargas automaticas de los Torrents, y eso que en el log marcaba como enviada sin errores.

    Esperaremos a ver si lo solventan, pero por si acaso estoy poniendo 2 avisos en mis scripts. El WhatsApp y el de Gtalk (por si acaso falla uno)

    ResponderEliminar
  14. El whatsapp desde la Raspberry ha dejado de funcionar.
    Sin embargo, desde BlueStacks funciona ok
    Parece que desde la RaspBerry falla la validación del usuario o algo así porque ni siquiera llega a conectar con whatsapp

    ResponderEliminar
  15. en el wahssap cada usuario tiene un codigo secreto para poder enviar mensajes:
    - en iOS se crea poniendo la mac del movil al reves y pasandolo por MD5
    - en el resto de moviles (android, WindowsPhone.... poniendo al reves el IMEI y pasandolo por MD5.

    ¿Habeis escuchado que los iphones 3G se han quedado sin wasap? La cosa que han cambiado la manera de crear el codigo secreto para enviar los mensajes ya que se han llegado a registrar mas de 10.000 envios por persona/dia (SPAM).

    Encontré la nueva manera para crear el codigo secreto pero estaba en pyton en el gitHub de la API sale en el foro.

    ResponderEliminar