Sistema Abierto para Votación Telefónica

En los últimos días la efervescencia de las elecciones presidenciales en México han estado en su apogeo y un rol importante han sido las encuestas, que a mi parecer no son transparentes, sus metodologías son poco claras incluso hasta tendenciosas en algunos casos, ante mi impotencia de poder manifestarme contra los medios de comunicación(llámese Televisa, Milenio, Grupo Reforma, El Universal, Grupo Imagen, etc) por la arbitrariedad y cerrar sus espacios(El Universal) para expresar mis comentarios, aprovechando un rato libre del domingo programé un pequeño script(PHP+Asterisk+SQLite+Google TextToSpeech) que permitiera capturar votaciones a través de un sistema telefónico, almacenar la información en una base de datos, procesar votos por caller id y dar la información en tiempo real de las votaciones a través de un robot TTS que consulte la base de datos y hable la información en tiempo real de lo que se vayan captando.

¡A VOTAR!:

El sistema ya está funcionando y ya se puede emitir el voto telefónico en el número:

01 55 1163 8969

El Objetivo es que cualquiera entre a emitir su voto, se lleve una estadística sin tendencias, sin procedimientos cerrados y sea transparente para quien quiera consultarla en algún momento.

Solo se puede emitir un voto por número telefónico. DESPREOCUPENSE, se encripta en MD5 el número telefónico como ID para validación, NO en texto plano.

En unos días liberaré el código fuente de la aplicación para que se audite el funcionamiento del script y hacer más transparente el funcionamiento de la aplicación.

El número es a través de un proveedor VoIP, de inicio solo tiene 2 canales de voz y en unos días pediré mayor número de canales de voz simultáneos sobre el mismo número cuándo se estabilice el servicio o si no cambiar de proveedor IP , el número fue contratado exclusivamente para este ejercicio el día de hoy y temporalmente el servicio tiene alguna inconsistencias en cuánto a las llamadas entrantes por lo que en días siguientes quedará corregido por si algunas llamadas no entraran al IVR. Así que si alguna llamada no entra repórtenmela aquí para revisar la conexión VoIP.

El script solo estará en operación durante el mes de junio.

Notas Técnicas para los curiosos:

El script funciona a través de Asterisk con la tecnología AGI(Asterisk Gateway Interface), todos los audios son generados en tiempo real mediante un Robot TTS de Google (Así que si no creo que pudiera presentarles a la chica de la voz sexy), hay un AGI que conecta con el servicio de texto a Voz de google para generar el audio en tiempo real y reproducirlo en el script. No se hizo con festival pues la voz suena muy robotizada y la voz de google TTS suena más natural, festival no requiere internet mientras que google TTS si, un sacrificio por otro beneficio.

La base de datos usada es SQLite, es una base de datos ligera, que se embebe dentro del mismo, no utiliza muchos recursos y es bastante potente como para aplicaciones de este tipo.

El lenguaje es un vulgar PHP que corre como AGI dentro de Asterisk.

El servidor es un lentium IV con 2.4 Ghz y DDR 1 Gb 400 Mhz y 40 Gb de disco duro.

COMPARTAN POR FAVOR:
Por favor compartan para que aumente la estadística interna de las votaciones y pronto tengamos más datos para ir mostrando los resultados en el IVR.

¡No olvides votar este 1 de Julio!


0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this post.
Loading...
Asterisk, Bases de Datos, Comunicaciones, Convocatorias, internet, PHP, Redes sociales, software libre, VoIP | RSS 2.0 |     992 views

RSS feed

12 Comments »

Comment by El Pop
2012-06-06 17:56:52

Disculpa, pero el IVR de votación es muy hóstil y poco claro, la voz sintetizada es terrible y no das resultados. Simplemente no es utilizable a menos que seas muy tenas en seguir el IVR :S

 
Comment by tacvbo
2012-06-06 18:22:17

El problema es que uno nunca se puede DESPREOCUPAR. Y ocupo dos argumentos importantes aquí: Acá en la empresa desarrollamos un sistema similar —por no decir igual— que el tuyo. No logramos establecer criterios lo suficientemente DESPREOCUPANTES para garantizar que no se hará una relación número telefónico y preferencia electoral. Siempre en un análisis forense se puede reconstruir la información —muy valiosa, por cierto— de alguna u otra manera. Con el número telefónico y el plan nacional de numeración, se puede saber la localidad y región del número; georeferenciar el sondeo. Al final, se puede cruzar, después de destruir el CDR, el número de inserción en la DB con el recibo telefónico, por ejemplo. Yo no dudo de tu honorabilidad y creo que como individuo es una prueba acertada, sin embargo, liberar este ejercicio como empresa nos ponía en entredicho solo por la confiabilidad, y no quiero decir que no seamos confiables, si no que por mas esfuerzo que nosotros hagamos, en términos computacionales, no podemos garantizar que aún destruyendo la información o “batiendola”, la pueda reconstruir o “desbatir” yo —o alguien mas— después. Lo que te sugiero es que liberes las configuraciones de tu Asterisk y el código fuente para darle un grado mas de certidumbre, al menos para cerciorarse que no se está guardando el CDR en ese equipo, ni tampoco se está imprimiendo el ANI en la bitácora de tu PBX de algún modo. El segundo argumento es una conjetura técnica interesante. ¿Es factible borrar el rastro? La arquitectura de las computadoras de forma difícil podrían lograr eso, siempre habrá un rastro que dejar y que reconstruir. ¿A que quiero llegar? bajo ese esquema, una urna electrónica (DRE) para votaciones no debería procesar ningún tipo de identificación de usuario ya que es de algún u otro modo se podrá reconstruir la informacińo y deja de garantizar una de las tres premisas básicas del voto, universal, libre y SECRETO. Mas info acá: http:noevoto.info y https://github.com/noevoto/noevoto

Saludos.

 
Comment by tacvbo
2012-06-06 19:19:26

Olvidé un punto, en el plan nacional de numeración, hay 250,783,543 números posibles (que no necesariamente asignados a un usuario pero si a un proveedor). Como dato interesante, la asignación de números entre las mas grandes, Telcel, Telmex y Movistar es 109,417,937, 41,360,058 y 40,780,356 respectivamente. Calculo que se pueden procesar y generar un millón de hashes MD5, sin paralelizar, sin usar múltiples CPUs o GPUs ni ninguna gracia adicional en cosa de 4 horas. Ya con una herramienta mas sofisticada que pueda usar el GPU de una tarjeta gráfica mas el procesador, que sea multi hilos, use instrucciónes MMX, SSE2 o SSE3 del procesador en un día tienes un registro de esos 251 millónes de números y su hash MD5 o SHA1, así que la obscuridad por seguridad tiene una luz al final del tunel, cosa no muy despreocupante.

 
Comment by tacvbo
2012-06-06 19:25:34

Ya estando en estas, el 5511638969 lo provee Maxcom y esta localizado en la Benito Juárez, esto salvo que se haya ejercido portabilidad o sea una asignación reubicada.

 
Comment by phylevn
2012-06-07 07:42:50

Pop: Efectivamente tienes razón, el script era complicado de usar ya que todo era código, por lo que al procesar los audios de los IVRs era esperar a recibir completo el streamig del TTS de Google para luego pedir el digito, por lo que en un principio en código tenía algo así:

$texto.=” Para repetir el menú marque 0. Indique la Opción después del tono seguido de la tecla gato”;
$agi->exec(agi, “googletts.agi,\”$texto\”,es”);
$_result = $agi->get_data(‘beep’, 3000, 1);

En un principio lo hice así ya que surgió de botepronto ya que el script lo hice en un par de horas de ociosidad.

Pero ya con un poco más de calma edite todos los audios del IVR para hacer más ágil el script y usar los comandos de Background cuándo no se requiriera entrada de datos y Read cuándo era necesario que teclearan una opción, así solo era reproducir los audios previamente cargados y en cualquier momento podría elegirse la opción y saltar a la operación sin tener que esperar a que el IVR terminara.

En la programación solo fué comentar la parte del tts de google y en $_result = $agi->get_data(‘beep’, 3000, 1); solo era cambiar beep por el audio correspondiente, el código siguió siendo el mismo.

Ya el IVR despliega los resultados, una estadística sencilla, pero la idea es generar estadísticas más avanzadas en base al NIR(lada) ligandolo con la base de datos de la cofetel para identificar los estados y poblaciones(solo guardo el NIR o la Lada, la serie y últimos digitos del número de teléfono se genera un hash en md5 pero no se guarda más información) y así obtener una gráfica por región y fecha.

Si con la primera versión había que ser paciente para responder el IVR :S

Gracias por los comentarios. 🙂

 
Comment by phylevn
2012-06-07 08:00:00

Tacvbo: Si la cofetel tiene una base de datos para identificar las series, pero vía internet puedes contratar algún DID con un proveedor “x” por ejemplo y tener tu servidor en cualquier lugar no precisamente en BJ.

Respecto a la seguridad mejor forma de explicarlo como lo comentas no habría, en efecto la idea desde los primeros minutos de crear el script ha sido no guardar los números telefónicos si no generar un hash como método de ID para evitar votos de números repetidos, para no comprometer a quien emite su voto en este ejercicio. Y para fines estadísticos solo guardo la Lada para generar quizá una gráfica de votación por población y la fecha de emitido el voto.

El script no pretende ser un sistema de voto electrónico mucho menos, para eso se deben tomar más seriedad y desarrollarlo con más conciencia, quizá por la excitación de publicar el script confundí el nombre y debí titularlo “otro sistema de encuestas ” 🙂

¡Saludos!

 
Comment by fbarajas
2012-06-07 12:51:17

¿Y que pasa cuando alguien vota de algún sistema que no envía caller ID? ¿Algo así como Nextel?

 
Comment by petrohs
2012-06-07 13:35:04

Cuando el numero es privado “no puede continuar con la votacion”

 
Comment by gwolf
2012-06-07 14:07:05

Reproduzco aquí lo que mencioné en tu blog ayer:

Comentas, “Solo se puede emitir un voto por número telefónico. DESPREOCUPENSE, se encripta en MD5 el número telefónico como ID para validación”.
Lo siento, ese puntito requiere reimplementación. MD5 es un algoritmo _digestor_, no un algoritmo de cifrado. El MD5 de mi número siempre va a dar el mismo resultado, y si me hago de acceso a tu base de datos y quiero encontrar el sentido del voto de alguien, basta con que busque por el MD5 de su teléfono.
Puedes “obscurecer” el número telefónico “aderezando” al MD5 con un poco de sal (agregándole una cadena secreta), sin embargo, si esa cadena secreta cae en manos de quien se hizo de tu base de datos, podrá también violar el secreto de tu encuesta.
¿Mi recomendación? No relacionar de ninguna manera al número telefónico con el resultado del voto. No hace falta, pues, mientras tu sistema no llame dos veces al mismo número.
Ahora, al márgen de eso, tu encuesta estaría de todos modos muy sesgada estadísticamente. Está excluyendo a la población rural y de menores ingresos, que no tiene línea telefónica (lo cual, siendo esta elección, probablemente le restará varios puntos a Peña). Estás reduciendo el número de posibles votantes en las casas con mayor población, donde puede haber varios adultos (y tienden a ser casas de menores ingresos — ¿Será que perjudicas a Peña o a AMLO?). Obviamente, una misma persona puede votar varias veces si es recepcionista de un negocio con varias líneas y le llamas varias veces.

 
Comment by phylevn
2012-06-07 14:10:41

fbarajas: Cuándo un número es anónimo, no es numérico o es un número menor de 5 digitos entonces se toma como número inválido..

 
Comment by phylevn
2012-06-07 15:02:38

@Gunnar Wolf: Tienes toda la razón, en efecto no es encriptación como tal, más bien es un hash, confundí la gimnasia con la magnesia..

Si, creo que solo hice un vulgar md5, ahí me faltó mayor análisis y como dices poner el granito de sal para evitar un query que hiciera el match md5 de algún número para saber si votó y por quien :S.

Sin duda un sistema más completo no debe ser un script hecho en 2 horas mientras en domingo mientras ves el partido Mexico vs Brasil..

El sistema no es para Outbound, es decir no se carga un listado de número y empieza a marcar a través de un predictivo, más bien es para que cualquiera pueda marcar de su número al número habilitado que corre el script desde cualquier parte del país desde un celular o tel fijo. Ya que para lo primero necesitaríamos permiso expreso del propietario del teléfono para no caer en violación de su privacidad y tener problemas con la cofetel. Y lo segundo el usuario al llamar acepta participar en la votación.

Si, tienes razón al ser un script hecho sobre las rodillas tiene muchas deficiencias, de inicio ya hay una validación para que sea una votación por CID, no se permitan números privados, aunque claro está expuesto el script a aceptar votaciones de una misma persona que marque de número diferentes cómo bien dices o de un hacker que pudiera hacer CID Spoofing(que con programación igual puede ser detectado).

El sistema adolesce de amplia cobertura, como comentas, no todas las regiones y posibles votantes del país tienen un teléfono, pero al igual las encuestadoras no van hasta el último rincón del país a encuestar, es una alternativa más que pongo sobre la mesa con la posibilidad de consultar los resultados en tiempo real.

Por cierto hoy subí una actualización dónde ya se puden saber los resultados.. 🙂

Agradezco tus comentarios, muy acertados por cierto, siempre es importante conocer puntos de vista y obtener una retroalimentación 🙂 ¡Saludos!

 
Comment by mahomedalid
2012-06-14 18:34:47

Vulgares estas

 
Name (required)
E-mail (required - never shown publicly)
URI
Your Comment (smaller size | larger size)
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> in your comment.

Trackback responses to this post