martes, 29 de junio de 2010

Problemas en el desarrollo de aplicaciones en Facebook

Llevo ya algún tiempo desarrollando en los huecos libres la, prometida, aplicación para registrar las visitas a los perfiles de usuario y páginas de Facebook y me he encontrado con un gran abanico de problemas a la hora de implementarla. Todos estos impedimentos y problemas que me he encontrado pueden ayudaros a entender el funcionamiento de Facebook y de sus aplicaciones.

(Antes de empezar, indicar que trataré de expresarlo en un lenguaje que esté al alcance de todos, pero al tratar temas relacionados con la programación de ordenadores, servicios Webs, etc... es posible que sea capaz de darle la claridad y sencillez que debería tener).

Cambios en las API's
Las API's, son las herramientas de las que disponemos para que nuestras aplicaciones interaccionen con Facebook y otros sistemas. Dichas API's están sufriendo un remodelado a todos los niveles con el fin de mejorar los niveles de seguridad de las aplicaciones, de modo que hay cosas que en un principio (hace ya más de 2 meses) funcionaban y han ido dejando de funcionar, sin que se haya documentado como deben utilizarse ahora esas mismas funciones.

Una de las primeras cosas que dejó de funcionar y que, ha día de hoy, no se ha informado como debe realizarse la llamada es la caja que aparece en el perfil del usuario, apareciendo como se ve en la imagen.

Pequeños pasos hasta descubrir que hace Facebook
Inicialmente, introduje referencias servicios Web externos (aplicaciones de otras empresas) que ya realizaban la funcionalidad deseada, pero extrañamente solo contabilizaban 1 ó 2 visitas al día desde la pantalla del perfil (además, indicaba que el acceso se había realizado desde USA), en cambio cuando accedía a la aplicación en una ventana fuera del perfil, si que se contabilizaban correctamente.

Posteriormente, utilizando los servicios de Google Analytics, que me daba más precisión en la localización de las visitas, seguía ocurriendo lo mismo, todas las visitas al perfil se registraban como procedentes de "Palo Alto", donde se encuentran las oficinas centrales de Facebook, Ashburn, Marietta, etc... (servidores de backup, trabajan en paralelo y se apoyan en caso de caída de alguno de ellos) aunque el acceso a la aplicación desde fuera del perfil se registraban correctamente.

Utilizando en este caso las API's de Google, preparé una aplicación flash (utilizado para hacer presentaciones, aplicaciones, etc... más conocido por los juegos flash) para integrarle el contador de visitas, pero Facebook reemplaza las aplicaciones flash por imágenes estáticas y, solamente descarga y ejecuta el flash, si el usuario pincha en la imagen correspondiente.

También integré Scripts (pequeñas aplicaciones) en el código pero no se ejecutan si el usuario no realiza alguna acción para que se ejecute, es decir, debe pincharse con el ratón en algún sitio dentro de la aplicación para que se ejecute.

En cualquier caso, cuando se ejecuta, no puede obtener ningún dato del usuario que visita el perfil (ni siquiera los datos públicos) si no se ha pedido permiso previamente para ello con otras funciones que también han cambiado.

¿Como funcionan las aplicaciones dentro del perfil de Facebook?
De todo lo expuesto anteriormente se desprende que, los usuarios pueden estar tranquilos, ya que ninguna aplicación identificará las visitas que hagan a otros perfiles, ya que para ello deben pinchar en algún sitio dentro de la aplicación que identifique las visitas y, posteriormente, deben de dar permiso para acceder a sus datos.

Otra cosa también interesante y que debería ayudar a proteger a los usuarios si Facebook lo gestiona correctamente es el mecanismo de navegación cuando accedemos al perfil de un usuario o aplicación.

 El funcionamiento general de cualquier Web por la que naveguemos es el siguiente:
Cuando vemos una página Web, la dirección que introducimos hace referencia a una página concreta del servidor Web principal. Esta página a su vez puede tener referencias a contenido que se encuentran en otras ubicaciones, este contenido puede ser de cualquier tipo (vídeos, fotos, fragmentos de la página, banners de publicidad, etc...), así como enlaces a otras Webs (como estos enlaces que te envía a la página de Tecnoenredados en Facebook, Google, etc...), de modo que, cuando seleccionamos un enlace vamos directamente a la dirección seleccionada y el contenido se descarga directamente de los servidores en los que se encuentran.

En cambio, Facebook redirecciona todos estos enlaces para que todo el tráfico que se genere desde los perfiles de usuarios y páginas pase por sus servidores, como se muestra en la siguiente imagen:

Cuando vemos una página de perfil de Facebook, la página completa se genera en los servidores de Facebook, no permitiendo el acceso directo a través de Internet. En este proceso, se reestructura parte de lo que se va a mostrar o ejecutar, haciendo que los Scripts no se puedan ejecutar directamente, las aplicaciones flash se reemplazan por imágenes, etc... Hasta aquí, algunos de los métodos que implementé hubieran permitido contabilizar el número de visitas (aunque no pudiera identificarlas), pero hay otro componente que hace que cuando refrescamos las páginas de perfil de los usuarios con contadores gráficos no se actualicen (ese debería ser el funcionamiento general), ese componente es una especie de memoria cache.

La memoria cache, es una memoria intermedia que se utiliza para guardar todo lo que se tiene que descargar de las páginas externas, de modo que si se solicitan varias veces una imagen de una dirección concreta, solamente la descargará una vez. Pasado cierto tiempo sin que se utilice dicha imagen, esta se elimina de la cache y se deja espacio para nuevos objetos que deban descargarse para generar la página de respuesta, de modo que las visitas que he registrado desde mi perfil procedían de las ciudades donde se encuentran los servidores de Facebook y, por muchas veces que visitara mi perfil, solamente se registraba una visita cada cierto tiempo (generalmente, una al día).

Este modelo va totalmente a contracorriente de la definición que hizo el DoD de ARPANET (antecesor del actual Internet), ya que según este modelo, el fallo o sabotaje de 1, 2,... X equipos (generalmente, hay equipos trabajando en paralelo desde distintas ubicaciones proporcionando un backup del servicio) puede hundir todo el sistema. A cambio, tiene los medios necesarios para bloquear cualquier ataque a los usuarios, ya que tendría capacidad para analizar todo el contenido al que tienen acceso.

Siguiente paso, nuevo tropezón
Una vez estudiado el modelo, descartados los mecanismos implementados, y establecida una estrategia para poder obtener:
  1. Un contador de visitas (indica el número de visitas), junto con 
  2. Un identificador de visitas (cuando el usuario que vista el perfil lo permita)
Se hace necesario poder almacenar algunos datos en alguna base de datos temporal, donde los usuarios puedan identificar quien los ha visitado. Como primer paso recurrimos a las API's de Facebook, encontrándonos con el Data Store API, donde vemos que el proyecto está en versión Beta, sin terminar de documentar y, además, va a ser rediseñado, de modo que hay que recurrir a almacenar la información en un servidor externo con unas mínimas condiciones de seguridad y que no sea muy caro.


Por fin
Tras un ciento de peripecias, ya estamos realizando las última pruebas y parece ir bien, aunque aun resta diseñar la pantalla para que el usuario pueda ver los datos de sus visitas y aún no es posible poner el cuadro en la pantalla del perfil, ya está terminado el mecanismo y funcionando como debe y ......

¿Otro cambio?
Pues sí, resulta que en la hoja de ruta de las modificaciones que se han hecho, se están realizando o se van a realizar, aparece que el actual modelo de permisos de acceso a los datos está diseñado y va a empezar a funcionar a partir de mañana, así que a ver como afecta todo esto al desarrollo que llevamos hecho.

A ver con que nos encontramos ahora, ya que con todos los cambios que se han producido en las API's, la gran mayoría de la información obtenida de Internet es obsoleta y la documentación de Facebook está siendo modificada constantemente, pero mucho puntos aún no están correctamente definidos.