domingo, 29 de abril de 2012

Subscribirme a cambios de los usuarios de mi app que hagan ellos en sus Facebook con el Real-time Updates

Facebook permite muchas mas cosas que logear a tus usuarios con su cuenta de Facebook. Mediante su Open Graph API permite que nos subscribamos a cambios que ellos hagan en sus Facebook.

Estoy desarrollando una idea y era esto lo que queria lograr.
Es algo que tengo muy verde. Pero voy a explicar las herramientas que estoy usando para intentar conseguirlo:
  1. Rails 3.2
  2. Ruby 1.9
  3. Unicorn como server en local
  4. Fb_grahp (gema que nos permite acceder al grafo de Facebook de manera comoda)
  5. Omniauth-facebook
  6. Devise como sistema de utenticacion
Para detectar los cambios que hacen los usuarios hay un protocolo que Facebook implementa que se llama [pubsubhubbub]
http://code.google.com/p/pubsubhubbub/

Aqui esta la Doc en Facebook:
https://developers.facebook.com/docs/reference/api/realtime/

Los problemas con los que me he encontrado:

1- Facebook necesita que tu Pagina sea visible en INTERNET

Segun explican en esa pagina, le tengo que pasar a FB una URL de callback para que me de un toque cada vez que me subscriba a un objeto de su Open Graph (user, page o permissions)

El problema es que esta URL tiene que ser accesible a internet. Y estando en mi maquina local esto es una putada!!!.
Solucion: me he instalado esta gema:
http://progrium.com/localtunnel/

Que lo que hace es hacer accesible to server de desarrollo al mundo. Solo le tienes que pasar una clave ssh.pub para que sepa como hacerlo. He leido que Facebooker tambien hacia algo parecido. De hecho hay un archivo que explica como hacerlo. Aunque estando esto no quiero montar mi propio server solo para que Facebook me vea.

2- Doble peticion al mismo tiempo

¿Cual es el problema con esto?
Cuando tu te subscribes a algo en FB haces una peticion via POST. En esa peticion envias una URL de callback para que Facebook sepa donde notificarte. Pero tambien por motivos de seguridad.
El problema estando con el server local de rails es que no es multi thread. Y esto es un problemon, ya que mientras se esta procesando la peticion por POST FB ya te ha lanzado una segunda peticion al esa URL de callback. Si no le respondes simultaneamente Facebook se queja y te suelta time out
Soulucion: Instalar unicorn en local y levantar un par de workers para que den abasto.

Solventados estos dos problemas ya estamos a la escucha de cambios en los datos de los users o paginas que se hayan logado en nuestra pagina.

Lo siguiente sera darle forma a la captacion de esos datos.

Un ultimo dato es que las notificaciones que Facebook te hace no son con los datos cambiados. Son solo los ID de esos datos. Eres tu el que tienes que pedirle a Facebook de nuevo los datos mas recientes. Facebook solo te avisa de que algo a cambiado.

Esto no pretende ser un articulo. Es tarde y lo escribo para que no se me olvide. Asi que cualquier correccion sera bien venida


---------------------

Segundo dia: ¿Como simular el JSON que nos manda Facebook cuando hay una notificacion?

Esto será muy básico para mucha gente. Pero puede que le sea útil a algun novato.
Problema:
Con el set up que he explicado arriba es complicado debuggar en la URL de callback que proporcionamos a Facebook. Que yo sepa corriendo unicorn no es posible parar el codigo con un punto de ruptura y ver que es lo que nos manda Facebook y que hacemos con ello.

Para no depender de un stack tan complicado. Y una vez comprobado que me se subscribir, voy a olvidarme por un rato de Facebook y voy a volver al server local de rails.

Si no lo hiciese asi tendria que por ejemplo hacer un cambio en mi muro de Facebook y a continuacion esperar a que facebook notifique a mi app.

Prefiero simular la peticion de Facebook. Hago yo la peticion desde un script local con la info que se supone me llegara de Facebook. Intento replicar la estructura de datos de Facebook para las notificaciones:
https://developers.facebook.com/docs/reference/api/realtime/
Esta en la zona que pone "change notifications"

Dejo aqui el script que uso:
https://gist.github.com/2567637

Ahora solo hay que meter un punto de ruptura e ir viendo que es lo que haces con esa notificacion.





No hay comentarios:

Publicar un comentario