servidor whatsapp, yowsup centos

Servidor whatsapp, yowsup centos 7.0

(Nota: El servidor Yowsup fue actualizado a su versión 2.4, favor tomar
nota de este proceso,  las versiones anteriores eventualmente
mandan un mensaje de old versión al tratar de registrarse,
no necesariamente al enviar un mensaje.

18 Noviembre 2015,

El modelo de registro sufrió varios cambios importante en los modelos anteriores al 2.4 de generación de la clave de encriptamiento una ves registrada la SIM desde la cual uno envía los mensajes , podía alternar
varias tarjetas en el mismo equipo sin ningún problema, en la actualidad
antes de enviar el mensaje en sistema valida la clave y si encuentra que ya
hay una clave en el sistema, procede a generar una nueva por cada mensaje
que se envía eso me creó un gran problema pues estaba enviando muchos
mensajes por diferentes SIM, esa funcionalidad me tocó ajustarla, ya que lo que hacia era usar 100 SIM , y envío el mensaje asignando los dos últimos 2 dígitos de teléfono destino a una tarjeta SIM, así hago un balance de los mensajes en las tarjetas , de momento resolví el problema contando los mensajes por decir 250 por tarjeta SIM y las voy alternando, esto para evitar
que demasidos mensajes sean despachados desde una única SIM y me bloqueen el sistema, la otra novedad con que me encontré, es que en las versiones anteriores pude registrar cuantas tarjetas quise en un solo equipo , ahora solo puedo hacer máximo 10 por equipo , antes de que empiece a bloquear las SIM.

Me toca cambiar la IP del equipo y el dispositivo celular desde donde recibo
el código de validación, parece ser  que ahora validan la IP y/o algo en el dispositivo a donde envían el código, porque sino cambio ambos , se bloquea la tarjeta después de la decima.

Sería bueno que tuvieran en WhatsApp un plan empresarial, donde uno paga por el plan y se acabó el problema,  como digo al final , para no tener que estar haciendo maromas, cada vez que sale una versión nueva.
Sigo intentando pera la respuesta es la misma , "si paga $1, no debe tener inconvenientes", pero la verdad no es esa,

el mensaje de error :
 WARNING:yowsup.stacks.
yowstack:Implicit declaration of parallel layers in a tuple is deprecated, pass a YowParallelLayer instead
 

En la version 2.4 es normal, pero si se añade una traza terminada con un mensaje sobre que axolotl trunco el mensaje,  usualmente se debe  aque Whatsapp, tiene problemas para recuperarse de una conexión fallida o de un error del tipo "too_recent" o "Blocked" o "Incorrect", la solución que me funcionó fue cambiar la IP donde tengo conectado el servidor yowsup y registrar otra SIM, luego regrese a mi IP orignal y quedó bien.
)

Tengo una aplicación en un servidor Centos 7.0 donde es de vital importancia que los mensajes SMS  lleguen al usuario, pero este proceso aún en las mejores condiciones y a pesar que hemos desarrollado una tecnología para que la mensajería SMS convencional funcione con una eficiencia de mas del 98% aun queda ese 2% que genera no pocos inconvenientes , pues ese 2% es de varios cientos de mensajes al mes, se pensó entonces en reforzar el envío mediante un sistema alterno que permitiera cerrar la brecha un poco mas, después de muchos consultar y ver alternativas viables decidí usar como medio alternativo Whatsapp, (en mi país, Colombia,es muy popular) el problema es que Whatsapp propiamente dicho no tiene un servidor independiente que uno pueda instalar,  sin embargo hay iniciativas que tienen propuestas aceptables, de la que nos vamos a ocupar en ese apartado se llama Yowsup (https://github.com/tgalal/yowsup), ultima actualización (va por la 2.4).
Había hecho varios intentos de acercarme a esta alternativa, sin resultados
positivos, ya que el registro era muy complejo y fragmentado, y se necesitaba usar una mezcla de Android, emuladores de Android, Windows y por último Linux, con el inconveniente de que la alternativa dejó de ser viable una vez que Whatsapp, decidió reforzar sus políticas de seguridad que siempre a sido un quebradero de cabeza en ese aplicativo.

Bien después de sacarle el quite al problema, me toco enfrentarlo si o si.
Me puse a la tarea y me encontré con que Yowsup había actualizado
su sistema para tener en cuenta el nuevo juego de políticas de Whatsapp,
y se publico la versión 2.0 de Yowsup. (en la actualidad va en la versión 2.4
en algunas partes hago algunas referencias a  esta actualización)

En me puse muy contento con este acontecimiento, pues veía resueltos todos mis problemas de manos de esta nueva versión, nada mas lejos de la realidad.

Bien descargue la versión 2.0 en un equipo con Centos 7.0 de prueba, con todos lo juguetes como dicen los chicos ahora, para que nada me pusiera problema,y me puse manos a la obra , descargue como dije el archivo, seguí los pasos de compilación de siempre a saber desempaquetar el tar, darle config, make y make install y luego la instalación del tipo python setup.py install, y voila, sendo servidor Yowsup funcionando, bueno compila y sin errores, otra cosa fue tratar de usarlo.

Mi amigo google decía por todas partes que el comando era:

yowsup-cli -c yowsup-cli.config -s 561234567 "hola mundo"

Como ya había hecho intentos previos yo creía saber , que así se hacia, falso
de toda falsedad , simple y llanamente no funciono y en ninguna parte decía como se debía hacer, ni una miserable línea ni en la pagina del autor ni en ningún foro , ni en ninguna parte.
Todos alababan la belleza del código, la limpieza de la programación , la flexibilidad de las librerías, pero nada de como se usaba.

Después de hacer uso de conocimientos en Python , es decir 0, y de casi llorar, logré  uniendo partecitas entre los log del sistema , los mensajes del
propio programa de ver mil veces las lineas de código, y aprender algunos rudimentos del programación Python y cientos de ensayos puede encontrar que todo el sistema de ejecución es demo y que había que ejecutarlo como un demo  , nada de salidas directas a consola ni nada por el estilo, eso si las librerías muy bien documentadas que serían las delicias de un programador Python , pero yo, frio ante tal despliegue de información, que a mi como novel en la materia ni fu ni fa. (https://github.com/tgalal/yowsup/wiki/Yowsup-2.0-Sample-app)

Y claro no faltan los foros donde algunos responden , "sino sabe Python que esta haciendo, estudie y después pregunte y bellezas por el estilo, entre los mas respetuosos."

Bueno después de este galimatias logré correr el programa. uno de los comandos de inicio fue

yowsup-cli demos -c yowsup-cli.config -y

Y se me abrió una consola de linea de comando con un montón de alternativas de recepción y envió de mensajes ,

La de forma consola carga una ventana texto desde la cual se puede :
 - hacer ping (/ping)

- conectar o Load (/L) y desconectar el servidor (/disconnect)   y enviar mensajes (/message).
-  el set de comandos se despliega con (/help).
-  envió de un message : ( $ es el prompt de yowsup)

$ /message send 573146799256 "hola mundo"  [enter]

donde  573146799256 es el numero a quien se desea enviar el mensaje precedido del indicativo 57 para mi caso en Colombia


trate de enviar algo , pero no hacia nada y luego vi que había que darle la opción /L  para que iniciara la sección,  se la di y no funcionó , pero ya entendí lo que se esperaba del sistema, recordé mis problemas cuando empecé con el proceso y es que no bastaba con que el número estuviera a registrado, (así se hacia antes) sino que había que registrarlo nuevamente bajo este nuevo sistema de seguridad.

Se tenia que hacer como el comando que coloco mas abajo:
 donde los código cc,mcc y mnc los saque de google , para Colombia, (http://es.wikipedia.org/wiki/MCC/MNC) y phone es el celular que quiero registrar, al número del celular no se le antepone, ni el signo (+ ), ni ceros,
los primeros dígitos (2 o 3 dependiendo del país) del celular deben coincidir con el código cc en mi caso Colombia 57.

  yowsup-cli registration --requestcode sms --phone 5742443677 --cc 57 --mcc 732 --mnc=123 -E android

mnc: 101  es Claro colombia
mnc: 102  es Colombia Movil
mnc: 123  es Movistar colombia

 El sistema enviá un SMS al celular donde se debe tener insertada la SIM que está registrando para poder ver el código que Whatsapp en el celular , el mensaje consta un código de la forma 721-677 ( osea una cadena de 6 dígitos separados por - (guión) en 2 grupos de 3)

Luego ingresa el siguiente comando

yowsup-cli registration --register 721-677 --phone 5742443677 --cc 57 -E android


El sistema regresa un mensaje similar al siguiente.
de interés la linea a continuación de pw:
 Es la clave necesaria para login en whatsapp, ojo con el igual , es parte
de la clave.


INFO:yowsup.common.http.warequest:{"status":"ok","login":"5742443677","pw":"t6cMgtsNpWYVTJmW1T6RKNTnBAU=","type":"existing","expiration":1433699414,"kind":"free","price":"US$0.99","cost":"0.99","currency":"USD","price_expiration":1420089374}

status: ok
kind: free
pw: t6cMgtsNpWYVTJmW1T6RKNTnBAU=
price: US$0.99
price_expiration: 1420089374
currency: USD
cost: 0.99
expiration: 1433699414
login: 5742443677
type: existing

Con esta información re configure mi archivo yowsup-cli.config
 ******************************************************

cc=57
phone=5742443677
id=
password= t6cMgtsNpWYVTJmW1T6RKNTnBAU=

******************************************************
Donde :
cc= 57                       es código de marcación internacional para Colombia
phone=5742443677 el numero de celular que registre

password= t6cMgtsNpWYVTJmW1T6RKNTnBAU=
Es la clave que el sistema Whatsapp me devolvió en el paso siguiente

Volví a mi consola , le di /L  y voila, se conecto, sencillo, ahora, si corone pensé para mi, envié un menaje y llegó como un tiro, estaba más feliz que unas pascuas.

Bueno ahora  solo falta lanzar el comando en forma echo, del que
hablaban en el sitio del autor una para -y iteractivo y -e para modo eco,
lo lancé ya la consola muda y en blanco, luego de quebrarme la cabeza, y leer el código y el manual del autor de nuevo encontré  que el modo -e (echo) solo sirve para recibir mensajes, no para enviar.

Y el sitio del autor te despide diciendo que como ejercicio que debe ser simple basta leer y entender el ejemplo de run.py que propone y eso es todo, para crear el proceso de enviar mensajes.

Me quedé mas frustrado que un carajo, pues como dije al inicio de Python nada, y según los que saben del tema,el uso de las librerías Yowsup, eran
de alto vuelo.
Bueno hasta aquí pensé. y me fui de fin de año 2014.

En los primeros días de enero, como no tenia mucho que hacer, volví solo por curiosidad a ver que había de nuevo y una agradable sorpresa, a petición del honorable público el autor de las librerías sacó la versión 2.2 de Yowsup
con ejercicio de envió de mensajes,.
Bendito sea pensé para mi, que el cielo lo colme de bendiciones.

Formatee el equipo, no sea que quede por alguna basura que me impida
el éxito del proceso , instale todos los paquetes Python por si las moscas e instale el Yowsup como dice el manual, ahora si explicadito, los mismos procesos de antes , todo bien.

ahora la prueba de fuego.

yowsup-cli demos  -c yowsup-cli.config -s 5731456999 "hola mundo"

* Nota:
Recordar configurar su archivo de configuración , yo use el que recomiendan
en la pagina del autor usando mis parámetros yowsup-cli.config, tal y como lo describí en el párrafo anterior.

Aquí coloque el celular al que le quería enviar el mensaje.
Y en un instante funciono sin problema.
Bien todo solucionado hagamos lo mismo en mi servidor definitivo y damos
por concluida la labor.

Pues resulta que la instalación centos 7.0 cuenta con Python 2.7 y centos 6.5
con python 2.6 y el autor es exhaustivo en eso, es Python 2.7 o superior.

Ahora yo que soy el duro en Python me toca nada mas y nada menos que actualizar el Python, del cual depende gran cantidad de utilidades de administración del sistema, cpanel por ejemplo y Yum,  tremenda bobadita.

Bueno buscando en San Google, me encontré esta belleza.

 http://toomuchdata.com/2014/02/16/how-to-install-python-on-centos/

donde el autor de forma muy comedida nos lleva de la mano y se instala todo bien desde el punto de vista de python.

Dejo aquí lo que use, 
Les cuento que actualice a 3.3 pues pensé, para que lo paso por 2.7 de una para 3.3, python todo bien, bien,pero Yowsup humm.

Me quede entonces en Python 2.7

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
# Python 2.7.6:
wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
tar xf Python-2.7.6.tar.xz
cd Python-2.7.6
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall

# First get the setup script for Setuptools:
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
# Then install it for Python 2.7 and/or Python 3.3:
python2.7 ez_setup.py
python3.3 ez_setup.py
# Now install pip using the newly installed setuptools:

#Yo descargue e instale : setuptools-11.3.1.zip
# unzip setuptools-11.3.1.zip
cd setuptools-11.3.1
python  setup.py install
 
easy_install-2.7 pip

Inicie entonces el proceso de instalación de Yowsup, empezó a preguntarme por librerías que no tenia, y procesos que no podía ejecutar por cambios e versión etc.
Pacientemente fui instalando lo que me pedía  , pero no funciono.
Entonces empece a buscar las librerías que mas problema estaban poniendo las descargue y las instale de forma manual solo hacerlo así sino el comando
que propongo a continuación no funciona, e notado que por lo general con la versión 2.4 y una instalación nueva no suele habwer problema al instalar
yowsup después de
pip install python-axolotl

Usar la instalación manual solo si  pip falla, lo que ocurría muy a menudo con las versiones 2.0 y 2.2 o cuando se pretende actualizar yowsup a 2.4
y hay una versión previa.

Para evitarme la fatiga, lo que haga es borrar todas las entradas de protobuf, y axolotl , borro el python 2.7 y hago la instalación de nuevo así no
me falla. ( con un sencillo locate , después de una actuaizacion de updatedb,
ubico los archivos y los borro), ojo en mi caso no tengo problema porque yo
no uso phyton para nada mas y puedo hacer esto sin ningún inconveniente,
si es un usuario python ese es otro cuento.

********************** usar Solo si pip falla ***********************
 python-axolotl-0.1.1.tar.gz
 python-axolotl-curve25519-0.1.tar.gz
 pysqlite-2.6.3.tar.gz
 readline-6.2.4.1.tar.gz

y por ultimo

protobuf-2.6.0.tar.gz

***************************************************************

Como no soy usuario python, cuando vuelvo a instalar este proceso
me debo acordar que las librerías se instalan con:
python setup.py install,

En la versión 2.4 , el comando que recomienda la pagina del autor que anteriormente no me funciono y por lo que tuve que apelar a la instalación manual me funcionó correctamente , probé ambos en diferentes equipos y ambos funcionaron sin problemas

Protobuf lo dejé de último porque me  ocurrió que instalé el YowSup en 4 equipos , ya soy todo un experto , y en 2 casos me pidió que lo instalara y en otros 2 donde ya estaba instalado  me toco retirarlo porque no dejaba compilar el Yowsup, en algún foro leí, que hay problemas con estas librerías en Python y aconsejan usar otras , de google creo, que como no son de mi interés ni las visite., así que toca ensayar , el mensaje aparece es que no encuentra el C compiler , (???).
 
Dejo aquí el comando recomendado: (recordar que el pip debe ser instalado en el sistema antes de poder usar el comando)

debe instalar pycrypto-2.6.1.tar.gz antes de poder ejecutar pip
#tar zxvfPp  pycrypto-2.6.1.tar.gz
# cd  pycrypto-2.6.1
# python setup.py install


 
# pip install python-axolotl


Este comando instala protobuf y axololt

Bien todo instalado , compilo  y ok,
Voy a ejecutar el programa y me dice que no puede porque no encuentra el _sqlite3.so, miércoles , pienso no lo acabo de instalar manualmente en el tercer paso de las librerías de arriba, buscando entre lineas me encontré que el sistema estaba buscando las librerías de _sqlite3.so y no las encuentra porque Python 2.6 y 2.7 las ubican en lugares distintos la solución sencilla.
Copiar las _sqlite3.so de Python2.6 a la ruta que Python 2.7 espera

cp /usr/lib64/python2.6/lib-dynload/_sqlite3.so /usr/local/lib/python2.7/sqlite3/

Vuelvo a ejecutar el comando de envió y esta vez si funciono enviándome
un lindo mensaje de "hola mundo, soy un genio".

Bien hasta ahora, todo bien, ya tengo mi flamante servidor Yowsup funcionado , pero yo soy un programador de java, mas concretamente de JSP, y este python muy querido y todo, pero no lo puedo aprovechar así,  que hago un pequeño  script del shell para ejecutar lo que yo quiero en modo comando

sthor_yowsup.sh
***************************************************************
# $1 = el archivo de configuración a ser usado
# $2 = el celular al que se ele enviá el mensaje
# $3  = El mensaje a enviar (sin espacios en blanco, whatsapp no los acepta,
# Remplazar espacios por puntos o comas por ejemplo.
path="/usr/local/tomcat/webapps/yowsup/yowsup-master"

/usr/local/bin/python2.7 $path demos -c $path/sthor$1\
 -s $2 $3 2> /tmp/sthoryowsup

***************************************************************
Burdo a morir, pero estamos en proceso de construcción.

Lo que se trata en ese script  es poder usar desde un programa JSP pasandole los parámetros necesarios y creando muchos archivos de configuración en nuestro caso 100 (sthor1 sthor2 ...) cuando menos para poder manejar muchos mensajes sin que Whatsapp  ponga problema

Ahora en JSP:

***************************************************************
<%!

     /*
        config , selecciona el archivo donde están los parámetros de
        configuración del numero de celular por donde se va a enviar el
        mensaje , por ejemplo sthor1, sthor2 .... sthor10 etc.
        para que los mensajes salgan por distintas rutas y no congestione
        la cuenta whatapp.

     */

     public final synchronized String YowSubSMS(
                                                                                String gConfig,
                                                                                String gCelular,
                                                                                String gMensaje
            
                                                                             )
          /* 57 es el indicativo internacional para colombia */

          gCelular = "57" + gCelular                                    ;
          String respuesta = new String()                            ;
          String mensaje = gMensaje                                    ;

          BufferedReader stdOut                                           ;
          BufferedReader stdErr                                            ;

          Runtime command  = Runtime.getRuntime()         ;
          Process proceso  = null                                            ;

         /* /usr/bin/sthor_yowsup.sh es el shell de arriba 
           le paso los parametros necesarios
        */

          String  comando = "/usr/bin/sthor_yowsup.sh" + Space(01)   ;
                  comando+= gConfig  + Space(01)                             ;
                  comando+= gCelular + Space(01)                             ;
                  comando+= mensaje  + Space(01)                             ;
*/ capturo la salida y regreso el mensaje que devuelve whatsapp */

         try
            {

                proceso = command.exec(comando)                         ;
                proceso.waitFor()                                                        ;

        InputStream is = proceso.getInputStream()                     ;
        stdOut = new BufferedReader(new InputStreamReader(is))       ;

                is = proceso.getErrorStream()                   ;
        stdErr = new BufferedReader(new InputStreamReader(is))       ;

                int i = 0                                                         ;
        String line = new String()                                   ;
                for (i=0 ; (line = stdOut.readLine()) != null ;)
                    {
                        if (line.length() > 0 )
                            {
                              i++                                                    ;
                              respuesta += line                            ;
                            }
                    }
            }
          catch (Exception e)
            {
                respuesta = "Error, yowsup:"                       ;
        respuesta+= e.toString()                                     ;
        }

            return respuesta                                        

        }
%>

*********************************************************************

Bueno ya lo estoy mejorando, pero este funciona, de momento lo tengo seleccionando 10 posibles rutas y todo bien.
Las cuales elige de forma aleatoria, Random(), tambien se implementó un spool donde guarda el mensaje si ocurre algún error, y lanza el proceso con un crontab cada minuto hasta que logra hacerlo, si en el día no lo logra declina la solicitud de envió.

Me comunique con Whatsapp , para que me venda una cuenta corporativa , y me contestaron que pague un $1 por cada numero utilizado , pues cuentas corporativas no tiene, eso me deja una inquietud porque enviar 10 0 20 mensajes en un día es un cuento, pero enviar miles es  otro muy distinto.

Aunque uno este pagando, me hubiera quedado mas tranquilo si me cobran algo, porque así es como medio inestable la cosa, sin saber que pueden hacer, aunque me dijeron que si pagaba el $1 , no iba a tener problemas,
será cierta tanta dicha.

De momento como un reloj y los mensajes llegan en segundos.

Amanecera y veremos.

A Tarek Galal (https://twitter.com/tgalal), por las librerías y Yowsup, muy agradecido, muy agradecido, porque mis afugias de instalación no se deben al señor  sino a mi desconocimiento de Python, a todo señor todo honor. 

Actualmente estoy explorando un pequeño servidor de mensajería basado en Rasberry PI, con 10 tarjetas  y  un micro controlador ATMEL (un switch inteligente, este ultimo se puede hacer incluso con otra Rasberry o con un computador, yo lo hice con Atmel porque ya tengo ese dispositivo que use en otra aplicación) que en ruta los mensajes a las diferentes tarjetas.









Comentarios

  1. Hola, antes que nada te felicito por lo escrito, y por otro lado te queria tengo duda de que tipo de error te mandaba cuando del dabas /L, yo tengo ese detalle, aldarle /L me manda el siguiente error:
    [offline]:/L
    general: Login Failed, reason: not-authorized
    Auth Error, reason not-authorized

    Ya registre el numero dos veces y si me responde con el pw, el archivo de configuracion lo coloco en la carpeta demo y si lo reconoce pero al dar /L ya no jala. me puedes apoyar porfa.

    Saludos y nuevamente felicidades

    ResponderEliminar
    Respuestas
    1. Ingresa correctamente el numero de celular en el archivo de configuracion, ese mismo problema me pasaba a mi, cuando te llaga el mensaje de la clave mas abajo esta el phone copialo y pegalo en el archivo e configuracion, en mi caso para ecuador todo numero de celular empieza con 0 y en el archivo de configuracion habia ingresado asi pero estaba mal, despues de tanto revisar me di cuenta q en el mensaje q llega de la clave mas abajo en la parte de phone estaba sin el 0 , correg eso y m funciono
      saludos

      Eliminar
  2. Buenas tarde Carlos,

    Antes que anda quiero presentarme mi es Haim Martínez y soy de la capital de Panamá. Hace algunas semanas atrás empece a utilizar una RP3 que me regalaron, luego de testear algunas cosas decidí que quería probar instalando la librería yowsup que me permite interactuar con whatsapp desde la RP3.

    Luego de mucha lectura pude realizar la instalación, registro del numero que estoy utilizando y whatsapp me envia la contraseña (que luego procedo a colocar en el archivo que en mi caso se llama yowsup-cli.config)

    Sin embargo, no me esta dejando loguearme (pasar a estado [online]), me aparece siempre en estado [offline], cuando coloco el comando "/L" (Sin mas comillas) me envia el siguiente mensaje:

    Yowsup Cli client
    ==================
    Type /help for available commands

    [offline]:/L
    general: Disconnected: Connection Closed

    Crees que estaría dentro de un alcance poder ayudarme con esto?, créeme que ya no se que mas podría hacer al respecto :(

    De ante mano muchas gracias por el apoyo que puedas brindarme en este caso

    Saludos cordiales desde Panamá

    ResponderEliminar

Publicar un comentario

Entradas populares