Crear una aplicación con Facebook Graph Api, en modo FBML


Extraer datos de Facebook Graph Api para nuestras aplicaciones de facebook se ha vuelto, sin duda, mucho más sencillo que con la api antigua. En este post veremos como dar los primeros pasos para desarrollar nuestra propia aplicación.

En este caso desarrollaremos una aplicación en modo FBML que es un método por el cual ‘metemos’ nuestra aplicación dentro de Facebook de forma que este va preguntándole a nuestro servidor que es lo que tiene que mostrar pero quien realmente acaba mostrando la aplicación es el propio Facebook. Esto difiere del modo Iframe en el que facebook solo crea un frame (un marco) donde carga nuestra web.

Antes de nada aclarar que Facebook ya ha declarado que a partir del 1 de enero de 2011 dejará de permitir crear aplicaciones en modo FBML. Se supone que esto es para obligar a que todas las aplicaciones sean visibles tanto en Facebook como en Webs. Por mi parte creo que es más que nada para ahorrarse ancho de banda. Aún así creo que a todos los que ya tienen aplicaciones en FBML y a aquellos que empiezan les puede venir bien esta explicación ya que con FBML solo lidiamos con la api en el servidor y con Iframe debemos ir manejando el SDK de servidor y el javascript SDK.

Para empezar, deberemos crear una aplicación en facebook, para ello puedes consultar el tutorial de facebook de este blog y configurarla para trabajar con ella como una aplicación FBML. Apuntar la url de la aplicación al index de nuestro servidor y ver que todo responde correctamente:

  • En la sección «Acerca de» escribimos los datos de nuestra app. Estos datos no van a afectar a la programación de la aplicación aunque es importante tomarse algunos minutos en rellenarlos.
  • La sección «Web Site» la dejamos vacía, de otra forma se entenderá que tambiñen hay una aplicación en tu web accesible aparte de la de Facebook.
  • En la sección «Facebook Integration», rellenamos «canvas URL» con la carpeta a partir de la cual nace nuestra aplicación -el «index»-. «Canvas Type» lo seleccionamos como FBML.
  • El resto de las secciones podemos dejarlas como vienen por defecto

A partir de ahi, dependerá del lenguaje de programación que use nuestro servidor que SDK debemos descargar. La lista de SDK’s disponibles la podemos encontrar en este enlace. Para los ejemplos de este artículo usamos la facebook PHP SDK. Nos la bajamos y la incluimos -con un «include()»- en el flujo de todas las páginas que vaya a ir cargando la aplicación.

A patir de aquí ya podemos empezar a escribir el código PHP de nuestra aplicación. Este lo subiremos a la carpeta que hemos indicado como «canvas URL» para que Facebook pueda ir a buscarlo en cada petición que hagan los usuarios. Vamos a ir tratando por orden distintas pártes esenciales del código de nuestra aplicación una a una. Al final de este post uniremos todo este código en una única aplicación.

1. Creando el objeto $facebook

Para crear nuestro objeto facebook, basta con incluir el facebook PHP SDK al principio de nuestro código y llamar a la clase «Facebook». A esta le pasaremos 3 parametros en un array numérico:

– appId, es el id numérico que le da Facebook a nuestra aplicación.
– secret, es el código secreto (que no debe ser publicado) que nos permite identificar las conexiones.
– cookie, es un valor con el que indicar si se aceptan sesiones por cookie o no. Por defecto es mejor marcarlo a «true» aunque para aplicaciones FBML no sirve de mucho.

Así pues nuestro código quedará así:

require 'facebook.php';
/*
Los datos de configuración los sacamos...
- De La página de resumen de nuestra aplicacion
- De la pestaña de configuracion "Facebook Integration"
- Viendo el código de ejemplo que nos ofrece facebook.
*/

$facebook = new Facebook(array(
  'appId'  => '123456789012', // Id. de aplicación
  'secret' => '1234567890abcdef1234567890abcde', // Aplication Secret|Clave Secreta
  'cookie' => true
));

2. Garantizando la sesión en Facebook con Facebook Graph Api y el PHP SDK

Aunque dispongamos de la clase iniciada esta para trabajar necesita disponer de una sesión de Facebook Iniciada. Con esta sesión la clase podrá hacer las consultas a Facebook incluyendo un código especial -llamado token- en las peticiones. Este código es la base de la conexión con Facebook -llamada OAuth2.0- y sin el nuestro desarrollo no accederá a ningún dato del usuario.

Empezamos por una declaración muy simple…

// Extraemos la sesión, sin ella Facebook graph no va a funcionar
$fbSession = $facebook->getSession();

Esto informará en «$fbSession» de si la sesión ha sido iniciada o no… por desgracia como Facebook se está orientando más hacia el modo Iframe que hacia el FBML por defecto nuestra sesión no va a venir informada y tendremos que forzar que se inicie. Para esto el truco más usado es redirigir al usuario nada más entra hacia la url de login de sesión.

Para esto usaremos el método «getLoginUrl()» que nos permite crear urls de login muy fácilmente.

// Si no tenemos sesión: Forzamos la sesión 
// Esto es importante en FBML, ya que no viene dada por defecto.
if (!$fbSession)
{
  $url = $facebook->getLoginUrl(array(
  	'canvas' => 1,
  	'fbconnect' => 0
  ));
  echo '';
  // Debe existir solo un redirect con fbml para crear la sesión y pedir permisos, por eso hacemos un 'die' (aunque no es nada elegante).
  die();  
}

A partir de aquí ya disponemos de la clase $facebook iniciada y podemos empezar a pedir datos a facebook. Sin embargo, en este mismo punto facebook nos permite realizar el login pidiendo ya los permisos de uso que necesitaremos al usuario, por lo que vamos a complicarlo un poco…

3. Pidiendo permisos al usuario con Facebook Graph Api y el PHP SDK

Los permisos son accesos a información o acciones que los usuarios dan a nuestras aplicaciones. Por defecto no podemos hacer mucho más que consultar el nombre del usuario y algunos de sus datos. Pero podemos preguntarle a este si nos permite hacer otras cosas con su cuenta. Estos permisos van desde acciones simples como permitir a la aplicación ver las fotos del usuario hasta controlar totalmetne la cuenta del usuario en cualquier momento desde dentro y fuera de Facebook. Es preciso examinar que permisos vamos a necesitar para que nuestra aplicación haga lo que nosotros deseamos y pedirle al usuario tan solo estos permisos… de otra forma podemos perder demasiados usuarios en el proceso.

Los distintos tipos de permisos, así como las acciones que nos permite hacer los usuarios al aceptarlos quedan descritos en esta página.

La función «getLoginUrl()» nos permite pedir estos permisos al usuario durante la misma redirección que vamos a hacer. Para ello es precios añadirle 3 parámetros nuevos:

  • next, indica la página de destino en la que caerá al usuario si acepta los permisos solicitados
  • cancel_url, indica la página de destino en la que caerá el usuario si no acepta los permisos
  • req_perms, es una cadena donde indicamos separados por comas todos los permisos que vamos a pedirle al usuarios
  • Así pues, para nuestra redirección que garantiza la sesión en Facebook lo que haremos será indicar estos permisos y declarar como ‘next’ y ‘cancel_url’ la propia url de la aplicación. Así que nuestro código anterior se complica un poco y queda de esta forma…

    if (!$fbSession)
    {
      $appUrl =  'http://apps.facebook.com/ikprueba/'; // aqui hay que poner la app propia 
      $url = $facebook->getLoginUrl(array(
      	'canvas' => 1,
      	'fbconnect' => 0,
      	'next' => $appUrl,
      	'cancel_url' => $appUrl,
      	'req_perms' => 'read_stream,publish_stream' 
            // Más permisos en: http://developers.facebook.com/docs/authentication/permissions
      ));
      echo '';
      die();  
    }
    

    Con esto habremos acabado con el tema de la solicitud de permisos. Es cierto que hay otras formas de solicitarlos pero para nuestra primera aplicación nos basta con un método.

    Para zanjar este tema simplemente recordar que durante el desarrollo es bastante probable que queramos consultar los permisos que nos a dado (o no) el usuario. Para ello Facebook siempre nos pasa al pedir nuestra página una variable por post que podemos incluir en un array que nos facilite las validaciones…

    $fbPerms = array();
    if ( isset($_POST['fb_sig_ext_perms']) && !empty($_POST['fb_sig_ext_perms']))
    {
    	$fbPerms = explode(",",$_POST['fb_sig_ext_perms']);
    }
    

    Ahora $fbPerms contiene todos los permisos que la aplicación tiene sobre el usuario en formato array. Así que si yo quiero saber si el usuario me ha dado permiso para publicar mensajes en su muro puedo validarlo con un simple «in_array()»

    if ( in_array('publish_stream',$fbPerms) )
    {
      // tenemos permiso
    }
    else
    {
      // no lo tenemos
    }
    

    4. Solicitando datos a la Facebook Graph Api con el PHP SDK

    La nueva Facebook Graph Api ha simplificado mucho la forma de hacer peticiones. Básicamente tenemos que ir formando los nodos sobre los que queremos ir accediendo en forma de url. Con esta uri montada llamaremos al método «api()» que nos devolverá un array con la información solicitada. La documentación de la Graph api es bastante clara con lo que no deberías tener serios problemas para entenderla. Por ejemplo:

    • «/me» Me dará la información del usuario logado.
    • «/me/friends» Me dará información de quienes son sus amigos.
    • «/me/feed» me dará los mensajes en su muro…

    A partir de esta información yo puedo ir anidando una petición tras otra hasta encontrar lo que busco. Primero podría sacar mi lista de amigos y de ahi, con su id, solicitar cualquiera de sus datos (siempre que tenga permiso para acceder al él).

    Así pues, y conociendo ya el funcionamiento de la API, pasemos a hacer ya algo con nuestra aplicación: mostrar los datos del ususuario logado y la lista de sus amigos…

    Para terminar de mostrar los datos usaremos las etiquetas FBML estas son unas etiquetas en un formato parecido al FBML pero que facebook interpreta para cambiarlas por elementos propios (nomres de usuarios, fotos, etc.) o aplicaciones utiles que puedas querer incluir (foros, comentarios, cuadros de selección de amigos, etc.) Puedes ver todas las etiquetas FBML a tu alcance en esta página.

    El siguiente fragmento de código es un poco más largo pero lo he ido comentando para que se entienda…

    // Usando la Api:
    // Primero validamos que la sesión haya sido iniciada correctamente...
    if ($fbSession )
    {
      // el php sdk usa excepciones php así que al usarlo lo hacemos dentro de un try para capturarlas...
      // si no sabes usarlas simplemente copia el formato del código
      try 
      { 
        // para rescatar tus propios datos de usuario...
        $myUser = $facebook->api('/me'); 
        
        // Y printarlos con FBML básico ( http://developers.facebook.com/docs/reference/fbml/#user/groups )
        echo "

    Mi nombre es: " . $myUser['name'] . "

    "; // Uso de profile-pic: http://developers.facebook.com/docs/reference/fbml/profile-pic echo '

    Y esta es mi foto: '; // y ahora a por los amigos... $myFriends = $facebook->api('/me/friends'); echo '

    Y estas las de mis amigos...

    '; echo "
      "; foreach ($myFriends['data'] as $friend) { echo '
    • '; } echo "


    "; } // Acabando con la aplicación solo queda tratar las posibles excepciones... catch (FacebookApiException $e) { // Funciones propias para capturar el error de la excepcion "$e" y mostrarlo y/o guardarlo en logs var_dump($e); } }

    5. Creando un mensaje en el muro del usuario que usa nuestra aplicación

    Por último, nos queda lo más intersante de todo. Poder hacer cosas con el usuaurio. Esta es una de las partes más importantes del SMO, ya que nos permite forzar la viralidad de nuestras acciones.

    Como ya hemos pedido permisos de stream_publish a nuestro usuario lo que haremos será ver si los ha aceptado. En caso de que sea así, le dejaremos un mensajito de regalo en su muro que puedan leer todos sus amigos. Para hacer la publicación usaremos también el método «api()» solo que en este caso en vez de incluirle una sola variable tendremos que pasarle 3:

    • La url en el formato de Facebook Graph que indica a que nos referimos
    • El método de la llamada, en este caso POST, porque enviamos datos
    • Los datos que enviamos en forma de array
    // Publicando en el muro del usuario
    // comprobamos si tenemos permisos de publish_stream (para publicar en el muro)...
    if ( in_array('publish_stream',$fbPerms) ) 
    {
      $newPostId = $facebook->api( '/me/feed', 'POST', array ( 
        // configuración del array para hacer un post en http://developers.facebook.com/docs/reference/api/post 
        'message' => 'Estoy aprendiendo a usar la API de facebook',
        'link' => 'http://blog.ikhuerta.com/crear-una-aplicacion-con-facebook-graph-api-en-modo-fbml', 
        'name' => 'Tutorial para aprender a usar la facebook graph api'
      ));
      echo "

    Se ha publicado un mensaje en el muro del usuario

    "; } else { echo "

    No se ha podido publicar nada: El usuario no ha dado permiso a esta aplicación para publicar en su muro

    "; }

    y FIN

    Y con esto ya estamos… acabamos de crear una aplicación capaz de logarse, mostrar datos del usuario y publicar en su muro. El resto es lo que tu tienes que hacer para que la aplicación sea interesante.

    Puedes ver como funciona esta aplicación visitándola en…

    Y seguidamente puedes copiar el código completo de la misma a partir de aquí:

    Ejemplo Aplicacion de Facebook

    Más info en el blog de ikhuerta

    "; // Preparando e iniciando la clase de facebook SDK require 'facebook.php'; /* Los datos de configuración los sacamos... - De La página de nuestra aplicacion - De la pestaña de configuracion "Facebook Integration" - Viendo el código de ejemplo que nos ofrece facebook. */ $facebook = new Facebook(array( 'appId' => '123456789012', // Id. de aplicación 'secret' => '1234567890abcdef1234567890abcde', // Aplication Secret|Clave Secreta 'cookie' => true, )); // Extraemos la sesión, sin ella no sabremos si graph va a funcionar $fbSession = $facebook->getSession(); // Si no tenemos sesión: Forzamos la sesión y pedimos permisos al usuario... // Esto es importante en FBML, ya que no viene dada por defecto. if (!$fbSession) { $url = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0, 'next' => 'http://apps.facebook.com/ikprueba/', 'cancel_url' => 'http://apps.facebook.com/ikprueba/', 'req_perms' => 'read_stream,publish_stream' // Más permisos en: http://developers.facebook.com/docs/authentication/permissions )); echo ''; die(); // Debe existir solo un redirect con fbml para crear la sesión y pedir permisos, por eso hacemos un 'die' (que no es nada elegante). } // Creando una variable con los permisos que nos ha dado el usuario. // Info sobre permisos en: http://developers.facebook.com/docs/authentication/permissions $fbPerms = array(); if ( isset($_POST['fb_sig_ext_perms']) && !empty($_POST['fb_sig_ext_perms'])) { $fbPerms = explode(",",$_POST['fb_sig_ext_perms']); } // Usando la Api // Primero validamos que la sesión haya sido iniciada correctamente... if ($fbSession ) { // el php sdk usa excepciones php así que al usarlo lo hacemos dentro de un try para capturarlas... try { // para rescatar tus propios datos de usuario... $myUser = $facebook->api('/me'); // Y printarlos con FBML básico ( http://developers.facebook.com/docs/reference/fbml/#user/groups ) echo "

    Mi nombre es: " . $myUser['name'] . "

    "; echo '

    Y esta es mi foto: '; // y ahora a por los amigos... $myFriends = $facebook->api('/me/friends'); echo '

    Y estas las de mis amigos...

    '; echo "
      "; foreach ($myFriends['data'] as $friend) { echo '
    • '; } echo "


    "; // Publicando en el muro del usuario if ( in_array('publish_stream',$fbPerms) ) // comprobamos si tenemos permisos de publish_stream (para publicar en el muro)... { $newPostId = $facebook->api( '/me/feed', 'POST', array ( // configuración del array para hacer un post en http://developers.facebook.com/docs/reference/api/post 'message' => 'Estoy aprendiendo a usar la API de facebook', 'link' => 'http://blog.ikhuerta.com/crear-una-aplicacion-con-facebook-graph-api-en-modo-fbml', 'name' => 'Tutorial para aprender a usar la facebook graph api' )); echo "

    Se ha publicado un mensaje en el muro del usuario

    "; } else { echo "

    No se ha podido publicar nada: El usuario no ha dado permiso a esta aplicación para publicar en su muro

    "; } } catch (FacebookApiException $e) { // Funciones propias para capturar el error de la excepcion "$e" var_dump($e); } } ?>


56 respuestas a “Crear una aplicación con Facebook Graph Api, en modo FBML”

  1. hola muy interesante este tutorial , pero quiciera saber como hago con esta api graph para enviar emal y notificaciones a los usuarios.?

    saludos

  2. Hola esteban,

    La nueva Api de Facebook ya no permite crear tantos tipos de mensajes como antes… 🙁

    Si echas un vistazo a la referencia ( http://developers.facebook.com/docs/reference/api/ ) verás que solo se pueden crear en el usuario los mensajes más típicos (status, fotos, links, etc.) los identificarás porque son los únicos elementos que incluyen al final el apartado «Editorial».

    Por lo que he podido ver solo queda «viva» la parte de enviar invitaciones a los amigos que el usuario seleccione mediante los FBML apropiados: ( http://developers.facebook.com/docs/reference/fbml/#notifications-and-requests ).

    Los emails, así como enviar al inbox de los usuarios, tampoco son posibles ya.

  3. hola bueno si me lo presentia pero , me queda una ultima duda, hay alguna forma de mostrar la parte de enviar invitaciones a los amigos en una ventana emergente?

    saludos

  4. buenas amigos ,,

    Tengo la duda . si se puede ? hacer que automaticamente una persona se haga fan de una pagina .. al utilizar una aplicacion ?

  5. Hola!

    He probado el código con mi clave secreta y demás y no consigo que funcione, tengo servidor y demás.

    No entiendo si es que ya no funciona por los cambios de Facebook o por otra cosa.

    SI fuera porque el código se a quedado anticuado, me gustaría que subierais el nuevo código ya que la aplicación de muestra esta activa y funciona correctamente :Dç

    Saludos amigos! y enhorabuena por la entrada que esta muy bien explicada y hay pocas que hablen de aplicaciones de Facebook.

  6. Gabriel!, primero que nada agradecerte y felicitarte por tus articulos; luego para consultarte si hay alguna pagina, guia o libro que tu puedas recomendar para aquellos que nos iniciamos en la programacion de aplicaciones para facebook, dado que el material bibliografico que he consultado esta orientado a la API antigua.
    Gracias nuevamente y saludos.

  7. Esteban,

    Perdona, recordaba que ya te había contestado. La parte de invitaciones ha quedado fuera de la api, ahora ya solo se puede hacer mediante el cuadro de seleccionar amigos de FBML. 🙁

    Hola Santos,

    Esta aplicación esta escrita hace solo unas semanas y a mi me funciona bien… (bueno, no siempre pero eso es por culpa de que mi servidor no se comunica bien con graph.facebook.com, pero es una excepcion que no pasa fuera de OVH). Mira tu configuración y lo que has subido al servidor. Se de más gente que lo ha hecho asi y no le ha ido mal…

    Alexander,

    Quien es Gabriel???? 😛

    lo siento pero no conozco libros sobre el tema. Yo voy mirando directamente la api y para dudas puntuales los foros de facebook.

  8. Hola!

    Te agrege al Facebook, espero que me confirmes para poder hablar mejor.

    Soy de Canet de mar(Barcelona) 😉 me gustaria que me ayudaras a instalar la aplicacion de muestra.

    Un saludo y muchas gracias de antemano, que no sabes lo que ma cosatdo encontrar alguien que sepa de aplicacion para Facebook.

  9. Hola, quisiera saber si puedo crear un formulario HTML
    y enviar por get o por post un parametro.
    ¿Es posible?.

    Lo estoy intentando y me da un http 200 como error.
    Este seria el formulario:

    Link:

    Si acceso a «http://apps.facebook.com/xxxxxx/» funciona todo bien, tal y como esta escrito en el tutorial.

    A ver si alguien me puede echar una manilla con el paso de parámetros.

    Gracias, un saludo.

    Pd: Excelente tutorial.

  10. Tengo un problema (demas que de nub) es que intento usar el codigo que sale en esta pagina (cambiando la appid y too eso) pero cuando la cargo , me sale que no tengo autentificacion del usuario para poner informacion en su muro . nose que puede ser, al menos entra en getsession bien a travez de el if de las cookies 😛 . si alguien me pudiese ayudar taria muuuy agradecido

  11. Una duda…

    Es posible usar la API para poner automáticamente «ME GUSTA» de una web creada en FACEBOOK ???

    Gracias !!!

    • Puedes interactuar con facebook para solicitar que paginas le gustan al usuario y asi ofrecerle el boton o no. Eso es bastante sencillo con graph. Sin embargo, no puedes hacer que el usuario se marque como que le gusta algo con la api, esto lo tiene que hacer el de forma activa.

  12. hola

    seguí los pasos que publicas y no logro que ande…

    por lo que ví parece que los arrays myUser y myFriends están vacíos, por lo que no publica información sobre el usuario y tira un error al querer acceder a los de los amigos.

    es posible que el hosting que estoy usando (000webhost) no soporte alguna funcionalidad?

    gracias

  13. lugolu,

    Es posible, a mi me ha pasado con el modo Iframe (aunque con FBML no he tenido problemas). Asegurate en la asistencia tecnica de tu hosting de que el CURL hacia graph.facebook.com les vaya bien…

  14. Hola Iñaki,

    Lo primero darte las gracias por toda la información que nos dejas a los pobres mortales que nos estamos empezando a pegar con las aplicaciones de Facebook ;).

    Me gustaría comentarte mi problemilla por si tuvieras alguna sugerencia…

    He seguido este tutorial para crear la aplicación y todo me ha funcionado perfectamente, el tema es que necesito que la aplicación quede integrada en una página bajo una pestaña, pero aunque configuro la aplicación en el panel para que tenga su nombre la pestaña y le indico una URL de mi servidor desde la que tirar, me da problemas el <fb:redirect que propones para la petición de permisos, concretamente: «fb:redirect: redirect forbidden by flavor TabFBMLFlavor».

    Tampoco sé si lo que quiero hacer se puede ya que no he encontrado todavía ninguna aplicación funcionando integrada en una página.
    En fin, agradecería tus comentarios…

    Salu2
    Susana

    PD. Te acabo se solicitar como amigo en FB, para comentarte este tema…sorry XD

  15. Tengo una super pregunta tengo una app de noticias:
    http://apps.facebook.com/noticiasvc/
    esta está hecha en php y mysql y se alimenta por medio de un asistente que tengo en mi hosting… necesito que esas noticias aparescan en una pestaña de una pagina de fans
    http://www.facebook.com/pages/Proyectos-en-Web/178461868835880
    Ahi ya puse en el canvas como se llama la pesataña y ya esta la pestaña
    pero me sale un error al mostrar la app: es el siguiente:

    Aplicación no disponible temporalmente
    Errores de tiempo de ejecución:

    fb:redirect: redirect forbidden by flavor TabFBMLFlavor

    Que tengo que hacer para que la app se muestre correctamente como en este ejemplo:
    http://www.facebook.com/EnriquePN?v=info#!/EnriquePN?v=app_107374415985455

    Espero que me puedan ayudar saludos

  16. Susana, Chuy,

    Vuestro problema es el mismo. Entiendo que llegasteis a este ejemplo buscando cosas de FBML y al crear la pestaña FBML habeis entendido que se comporta como una aplicación.

    No es así. Una pestaña FBML puede crearse de dos formas:

    – Como pestaña estatica desde el propio editor de la página. Lo cual te da acceso a un HTML estático pero con el añadido de las etiquetas FBML (muchas de ellas, no todas)

    – Como url de pestaña al crear una aplicación. Esto te permite que el contenido sea alimentado desde tu server (por ejemplo con mysql como dice Chuy) pero no te aporta más que eso: contenido dinamico. En lo demás sigue siendo una pestaña limitada.

    Las limitaciones de las pestañas a día de hoy podríamos englobarlas en dos grupos:

    1) No hay datos de usuario: no podemos usar lo que aqui se explica porque no hay api realmente solo FBML. Vosotros estais intentando hacer el redirect que dice este post para logar al usuario… eso no es posible en una pestaña.

    2) No todas las etiquetas de FBML funcionan. No tengo una lista, pero como veis a ambos se os queja de que no le gusta dentro de una pestaña.

    En consecuencia la mayoría de las apps resuelven el tema mostrando un pequeño resumen de lo que hace la app en una pestaña con varios links a la aplicación de verdad donde si que tenemos más libertades (una vez nos concede el usuario los permisos).

    Espero haberos ayudado.

  17. Hola, muchas gracias por todos los tutoriales.

    Lo he intentado todo pero me sale este error….no se que hacer…

    Parse error: syntax error, unexpected ‘{‘ in /home/zhmiwhoj/public_html/calzoncillospornavidad/index.php on line 62

    x favor, si alguien puede ayudarme que publique un comentario…

    gracias!!

  18. Buenas david,

    No se que codigo usas por lo que no puedo saber que hay en la linea 62… El error lo tienes ahi, el mensaje es muy claro. Curratelo un poco por favor y debuga el codigo que usas antes de preguntar. Recuerda que esto es un blog, no un foro 😉

    Valida que:

    – Este todo bien copiado y no haya nada sin un punto y coma al final o un parentesis o comilla no cerrados. Este tipo de errores suelen deberse precisamente a errores de escritura. Si vieses que el error es de alguna parte publicada aqui, por favor, hazmelo saber y lo corregire.

    – Uses PHP5 de otra forma las excepciones no funcionarán y puedes olvidate de usar facebook con su php SDK

  19. Gracias Ikhuerta, revisé el código una y otra vez y estaba todo bien…. pero me fijé que en la linea de error había una excepcion de php5, entonces se me ocurrio cambiar de servidor y vuala!! FUNCIONA..

    era problema de mi servidor, que no soportaba php5.

    muchas gracias por todo…

  20. buenas de nuevo Iñaki,

    Perdona que te pregunte otra cosita pero no sé a quién más recurrir…
    Necesito saber desde una aplicación que está agregada en una página si el usuario que ha entrado ha pinchado o no el botón de «Me gusta» de la página, pero sin haber pedido ningún permiso…

    ejemplo: http://www.facebook.com/Pringles.ES?v=app_155739374467874

    ¿Alguna sugerencia?

    Gracias de antemano…

    Susana

  21. Buenas susana,

    Lo unico que tienes que hacer es llamar a

    https://graph.facebook.com/me/likes

    que te dará una lista de todas las páginas que «le gustan» al usuario y con ella podrás validar si entre la lista elstá el id de tu app.

    Sobre permisos CREO que con tener al usuario logado ya tendrás acceso a sus páginas… Pero no lo he probado más que con usuarios desarrolladores (que por defecto tienen todos los permisos dados) asi que no puedo asegurartelo. Lo que si que es seguro es que necesitas que el usaurio se identifique en tu APP o no sacarás nada de él.

    Si no te vieniese dado ese permiso por defecto tienes los permisos:

    user_likes

    para garantizar que te dan acceso a sus «me gusta»

    o

    friends_likes

    para sacar los likes de sus amigos.

    Así que en el ejemplo de esta página con llamar a:

    $url = $facebook->getLoginUrl(array(
    ‘canvas’ => 1,
    ‘fbconnect’ => 0,
    ‘next’ => ‘http://apps.facebook.com/ikprueba/’,
    ‘cancel_url’ => ‘http://apps.facebook.com/ikprueba/’,
    ‘req_perms’ => ‘user_likes’
    ));

    Para logar al usuario, ya te bastaría.

  22. Gracias Iñaki por contestar y encima en domingo!

    El problema que tengo es que en esta Apps no me dejan pedir más permisos, (en la otra que hice ya los pido y no quieren que se vayan los usuarios con tanta petición), y como ya han visto que se puede hacer como el caso de Pringles España que te he puesto, pues tengo que ver la manera de conseguirlo y más desde dentro de una pestaña de una página.

    No entiendo como la gente de Pringles lo hace, es más, ya empiezo a pensar que estén utilizando algún método de la OLD Api que te devuelva los IDS de los fans de tu página (a los que deberías tener acceso)* y que lo compares con el ID del usuario que te visita. Después de estar viendo tanto la API nueva como los recursos de FQL o pides permiso o nada.

    En fin, bastante extraño…

    Bueno lo dicho MIL gracias por tu ayuda y si doy con ello te escribo y te lo cuento.

    Ciao

    *te pongo esto por es curioso que con http://graph.facebook.com/163221253716048/ solo tengas acceso a un contador total y no a los IDs…

  23. Buenas,

    Pues lo he mirado ahora un poco mejor y no encuentro la forma por la que deben hacerlo con la api actual.

    – Existen etiquetas FBML del tipo if-is-app-user o if-is-group-user pero no sobre pagina. Con lo que no veo como hacerlo con FBML (tiene pinta de que sea con una etiqueta de este tipo pero no la he encontrado)

    – Desde servidor, podriamos dar permisos remotos sobre un user admin y consultar datos de la pagina. pero aunque tuviesemos la lista de ids de usuario de los fans, dentro de la pestaña FBML no tendriamos el id de usuario con lo que tampoco podríamos rescatarlo…

    Seguire mirando pero no veo como lo hacen a simple vista.

  24. Claro, eso es lo que me parecía a mí…
    Además está lo que comentas del ID del usuario, sin permisos no lo tienes y no puedes utilizarlo para comparar los IDs de tus fans.

    Por eso me daba la sensación que en uno de los métodos de la API antigua todavía se podría obtener algún dato para hacer esa comparación «sin permiso», aunque claro está, si doy con él nadie me dice que dentro de 3 días lo «deprequen» y no se pueda volver a utilizar, no?

    En fin, que no te molesto más.
    Gracias de nuevo por todo!!

  25. Buenas de nuevo Iñaki!!

    Después de mucho mirar y mirar, aquí está la solución:
    http://developers.facebook.com/docs/reference/fbml/visible-to-connection
    una chorrada, vamos, y yo complicándome la vida con la sesión de facebook y el FQL.

    De nuevo te doy las gracias por tu blog, el tiempo que dedicas a hacernos la vida a los desarrolladores más fácil, en definitiva por tu ayuda.

    Saludos!!

    PD. Comparto tu twitt: «Escribir un post sobre como usar una tecnologia no debería convertirte automaticamente en parte del soporte técnico de la misma!!!» y siento sin en algún momento he podido molestarte con mis preguntas…

  26. Pues vaya nombre de tag más mal puesto!

    Gracias por comentarlo Susana, algo más que ya sabemos 😉

    Sobre el tweet, no va sobre comentarios como el tuyo, que como ves lo he aprobado y contestado dentro de lo que sabia (en definitiva lo que te ha pasado creo que aporta un poco más al post). Va por gente con preguntas del tipo «como puedo hacer para publicar en el muro del usuario». O, «lo pruebo y me da un error, podríais arreglarlo»… En definitiva gente con mucho morro.

    Eso la única respuesta que puede tener es: «leete el post y prueba algo, no esperes que programe gratis para ti!». Pero bueno, estoy pasando a no aprobar estos comentarios y ya está.

  27. Hola iñaki

    bueno, mi duda es la siguiente.. he configurado una aplicacion y el unico problema que tengo es el con los permisos, en un momento llegue a pensar que podia ser porque era el OLD REST API pero aqui en tu tutorial veo que esta todo claro, sin embargo me sigue tirando el mismo error.

    pasa que he tratado con el

    $url = $facebook->getLoginUrl(array(
    ‘canvas’ => 1,
    ‘fbconnect’ => 0,
    ‘next’ => ‘http://apps.facebook.com/ikprueba/’,
    ‘cancel_url’ => ‘http://apps.facebook.com/ikprueba/’,
    ‘req_perms’ => ‘user_likes’
    ));

    y sigue sin pedirme los permisos :s , no entiendo que puede estar pasando,.. intente usar el fbpromptpermision, y me sale un link DENTRO de la aplicacion para dar los permisos .

    nose que podria estar fallando en mi configuracion, otra cosa es necesario llamar «graph.facebook.com» ?

    perdon si te incomodo con las pregunta que veo que la han formulado ya, pero es que no me va. quisiera asegurarme si es error del codigo, mio o del host?

    en fin, desde ya gracias por tu respuesta.

    saludos

  28. Hola Jazhiel,

    Disculpa que no publique tu anterior comentario pero estaba en un post equivocado.

    No se si entiendo tu problema… Lo primero es decirte que efectivamente, debes conectar tu servidor con graph.facebook.com, si tienes problemas de perdidas de paquetes en la conexión (como nos ha pasado a muchos) cambia de servidor o pide a tu hosting que te muevan de maquina fisica. Es la unica forma de que puedas conectarte.

    Sobre los permisos, sin entender muy bien que es lo que te pasa te comento algunos detalles por si alguno te ayuda:

    – Solo con usar getLoginUrl no haces nada. Tienes luego que redirigir al usuario hacia la url que consigas para que este te permita el acceso y/o los permisos. Eres tu el que debe controlar esta redirección por lo que no tiene sentido que «no pase nada», como mucho debería darte un error pero no pasar nada, puesto que tu mismo haces la redirección y la controlas.

    – Un problema que puede sucederte si trabajas en serio con FB es que al hacer getSession realmente solo compruebas si existen Coockies o si en la url vienen los datos de conexión. Si algo cambia en tu forma de usar Facebook no te darás cuenta solo viendo si estas logado o no. Me explico, si tu usuario está logado pero no pediste permisos especiales en el login y más tarde pretendes jugar con permisos, lo que deberás hacer es comprobar los permisos que te está dando el usuario y si no tienes los que te gustaría tener volver a usar getLoginUrl para extraeerlos (si, para pasar de un usuario logado sin permisos, a pedirselos, hay que volver a intentar logarlo, solo que Facebook se salta el primer paso si ya está logado).

    – Por ultimo, si trabajas en FBML la desgracia que tienes es que las coockies no irán. Por lo que cuando el usuario se logue te va a enviar sus datos de login en la url y getSession te devolverá el login como creado. Pero a partir de ahí (en siguientes paginas cargadas) si no vas copiando las variables de login en la url esta no mantendrá el login… el usurio entrará en su segunda pagina dentro de la aplicación, tu para procesarla lanzarás getSession y este al no encontrar ni coockies (por cargar por FBML) ni datos en la url dirá que el usuario no está logado. Algunas personas arreglan esto manipulando un poco la clase de facebook para meter en $_SESSION[] el login… yo la verdad es que si la aplicación se hace un poco compleja prefiero usar el modo IFRAME donde las coockies si que funcionan correctamente.

    – Por ultimo, el link con el logo de Facebook para dar permisos que aparece a veces en aplicaciones se produce cuando estás intentando cargar en tu aplicación la url de login del usuario en vez de dirigirle directamente a ella. Intento explicarme: tu aplicación es en realidad una ventana dentro de Facebook con tu aplicacion dentro. Que pasa cuando dentro de esa ventana metes al propio facebook? Pues que a facebook no le gusta (no quiere mostrarte 2 veces su cabecera y su sidebar) y en vez de eso te muestra un link para cargar realmente lo que querías cargar pero como pagina completa, no dentro de una ventana. Para evitar esto, lo que hay que hacer es enviar al usuario a la url de login completa, no dentro de tu app. Para eso a veces (por ejemplo cuando estamos en modo iframe) es necesario usar javascript y otras (por ejemplo en modo FBML) etiquetas FBML. Si te fijas, en el ejemplo de esta pagina para logar al usuario se lanza: echo ‘‘; es una etiqueta fbml para enviar al usuario hacia una url fuera de la aplicación y en este caso se usa para enviarle a la url de login (que queda fuera de la aplicación) para que cuando termine de logarse vuelva a la aplicación.

  29. Hola amigo muchas gracias por la info con eso que Facebook! cambio hacia la nueva api GRAPH todo se complica auque es mas amigable, una pregunta lo he subido tal cual como me indicas pero al dar aceptar en la app se supone que se publica un mensaje en el muro y siempre me sale que no se puede: No se ha podido publicar nada siempre me sale y en tu demo funciona correctamente.
    http://apps.facebook.com/juego-snakes/
    Gracias ojala me puedas ayudar

  30. He probado tu app, y es realmente buena.
    Se puede publicar al muro de un amigo del usuario que te ha pedido permiso?

    PD: Cuando dices que el 1 de enero dejan de permitir crear apps con FBML, quieres decir que las que tengo creadas van a dejar de funcionar?

    Un saludo
    Un saludo

  31. @Guillermo, mirate lo que comentaba en el apartado anterior sobre las coockies en FBML, creo que tu problema va a estar en que pides los permisos pero luego el usuario, cuando toca publicarle no lo tienes logado. Intenta pasar de coockies a sesión los datos de login dentro del propio script de facebook.php

    @marc, con facebook nunca se sabe. No se caracterizan precisamente ni por tener en cuenta a los desarroladores de aplicaciones ni por avisarles de los cambios que hacen. Yo lo entendí como que en enero iban a dejar de permitir crearlas y para las nuevas no sldrá la opción de trabajar en FBML, pero esta claro que a la larga algún día quitarán el soporte sin avisar (como hacen siempre), si tus apps son puntuales yo no me preocuparía, si quieres que vivan mucho tiempo yo empezaría a migrarlas en cuanto tuviese un hueco.

    Un saludo.

  32. Hola amigo Huerta, tu tuto estubo bien chevere, pero tengo un problema no sé si sea el código, xq cuando intento correr la aplicación en el facebook me sale el siguiente mensaje:
    «Se recibió el código de error HTTP 404 mientras se cargaba http://www.itsands.com.pe/Prueba/facebook-php-sdk/examples/

    Lo sentimos, la aplicación que estabas usando está experimentando un problema. Por favor, inténtalo de nuevo más tarde.»

    Espero que me puedas ayudar…. Gracias!!!!!!!!!!!!!

  33. Ya vi cual era mi problema, era que redireccioné mal en mi canvas. Pero tengo otro problema, ahora si me carga la solicitud de permisos, pero cuando le doy permitir me dice que la posiblemente la petición nunca termine…. a que se debe eso?

  34. Hola, muy bueno tu aporte sobre las app en facebook. Yo estoy entrando a este mundo, he probado tu código y muy bueno, xq me salió lo de los permisos, pero cuando le doy en permitir, carga la página y después no pasa nada, a que se puede deber eso?…. te agradecería mucho si puedes disolverme esa duda….
    Gracias x el aporte!!!!!!!!!!!

  35. Buenas Danny! Cuanta actividad!

    A ver, sobre el tema de que «posiblemente nunca termine» se trata de que el navegador ve que haces redirecciones constantemente sin parar y se vuelve loco. Segurametne tienes algun problema detectando el login del usuario de forma que:

    1) Ves que el usuario no esta logado y le rediriges a Facebook
    2) Facebook ve que si que esta logado y te lo devuelve
    3) Ves otra vez que no esta logado (lo detectas mal) y le vuelves a redirigir a facebook…
    y así sucesivamente…

    Sobre la pagina que no hace nada… pues no tengo ni idea ni de que haces ni de que intentas… Mira tu codigo paso a paso a ver si hay errores que paren el proceso. Una vez veas esa parte, mira los condicionales y loops que uses (if, foreach, etc…) y asegurate de que estas entrnado dentro de todos los que crees… Eso de que «no pase nada» con facebook no pasa 😉 o lo hace o te da una exepción (que tu no la captures es otra cosa).

  36. Iñaki, me quedó una duda por responder.
    He probado tu app, y es realmente buena.
    Se puede publicar al muro de un amigo o varios amigos del usuario que te ha pedido permiso?
    Me refiero a usando el mismo sistema que lo haces en esta, pero en lugar de en el propio muro del usuario, en el de algunos amigos.

  37. Gracias x tu respuesta, si tenías razón, probé el código en otra aplicación y ahora si me corre bien. Ahora tengo otra consulta y disculpame x ser tan insistente (kiero aprender jejeje). Cuando publica en el muro lo hace como comentario del usuario, no se puede hacer como comentario de la propia aplicación?

  38. Hola Iñaki, a mi me pasa lo mismo que a Susana y Chuy…
    Te paso las url para ver:

    http://apps.facebook.com/welcomapp/
    Aqui funciona todo OK

    http://www.facebook.com/pages/ICA-Instituto-Cultural-Americano-Mar-del-Plata/163317720377170?v=app_165665596781387&ref=ts

    En esta me tira esos mensajes de error:
    La aplicación no está disponible temporalmente
    Errores de tiempo de ejecución:
    fb:redirect: redirect forbidden by flavor TabFBMLFlavor

    Lei la respuesta que le diste a Susana… en mi caso es que estoy usando contenido que no puedo usar en pestañas? no me queda claro que es lo que estoy haciendo mal… que me sugeris para mostrar bien ese contenido?

    Desde ya mil gracias y un año a pura vida.
    Salu2

  39. Buenas Marcelo,

    Te pasa lo mismo que a Susana. No puedes intentar jugar con el login de usuario y con la API desde servidor en las pestañas. Facebook no te deja.

    Planifica el diseño y funcionalidad de tu pestaña solo usando datos de tu servidor y etiquetas XFBML pero nunca contando con usar la api de facebook. Una forma común de trabajar con esto cuando necesitamos logar al usuario es ofrecer una imágen atractiva que inste a clickar en ella y llevar al usuario a la home real de la app.

  40. Buenas tardes amigo, ikhuerta ya realice la prueba con la libreria sdk, en uno de tus otros post te habia comentado que no podia sacar el correo del usuario, con esta libreria tengo el mismo problema.. Voy a intertar hacer lo que me dijiste, voy a intentar validar mi aplicacion..!

  41. function facebook_open_graph_logout($label = false)
    {
    $user = sfContext::getInstance()->getUser();

    return ‘getFacebook()->getLogoutUrl().’»>’.$label.’‘;
    }

    function facebook_open_graph_login($label = ‘Conectar usando Facebook’)
    {
    return ».$label.»;
    }

    Gracias ikhuerta por aportar esta gran información la cual me ha servido de mucha ayuda para inicar el aprendizaje en el uso de las api de Facebook…

  42. La pagina de ejemplo quedo con el siguiente codigo:

    php-sdk

    body {
    font-family: ‘Lucida Grande’, Verdana, Arial, sans-serif;
    }
    h1 a {
    text-decoration: none;
    color: #3b5998;
    }
    h1 a:hover {
    text-decoration: underline;
    }

    getFacebookApiMe()): ?>

    Using JavaScript & XFBML:

    Without using JavaScript & XFBML:

    Session

    getFacebookApiMe()): ?>

    getFacebookSession()); ?>

    You
    <img src=»https://graph.facebook.com/getFacebookUser(); ?>/picture» alt=»user» />
    getFacebookApiMeName(); ?>

    Your User Object

    getFacebookApiMe()); ?>

    You are not Connected.

  43. Al parecer aplicas algunos filtros a los datos que se envian y no se puede mostrar bien el codigo en el post..! El que desea integrar esta libreria como un plugin en symfony puede cominicarse conmigo y con mucho gusto los ayudare…!

  44. Que tal ikhuerta…!

    Ya estoy usando en mi web el api de Facebook Open Graph… Es muchisimo más facil que las otras api y ademas demasiado facil de implementar.. Actualmente la estoy usando en mi web como un plugin del framework symfony, al usarla como un plugin se hace mas facil el uso de ella, en cada pagina donde desea usarla simplemte utilizo las siguientes funciones sin hacer llamado a mas nada ya que todo lo demas lo realiza el plugin:

    1) Lo primero que debo llamar es a esta funcion incluyendo el nombre del helper que deseo cargar:
    -> Este helper posee tres funciones

    2) Para luego llamar desde el en mi layout principal al medodo: facebook_open_graph_script() el cual pertenece al helper ‘FacebookOpenGraph’ y me devuele un codigo javascript esencial para que funcione las librerias de facebook

    2) Y por ulitmo solo me queda mostrar el link de login y de logueo que lo hago llamando a una de estas dos funciones que tambien pertenecel al helper ‘FacebookOpenGraph’..

    facebook_open_graph_logout() -> Para mostra el link de logout

    facebook_open_graph_login() -> Para mostra el link de login

    _________________________________________________________________

    Por aca les dejo el codigo de los metodos, para que tenga una idea de como lo implemente en un plugin para el framework symfony:

    function facebook_open_graph_script()
    {
    $user = sfContext::getInstance()->getUser();

    return ‘

    window.fbAsyncInit = function() {
    FB.init({
    appId : «‘.$user->getFacebook()->getAppId().’»,
    session : ‘.json_encode($user->getFacebookSession()).’, // don\’t refetch the session when PHP already has it
    status : true, // check login status
    cookie : true, // enable cookies to allow the server to access the session
    xfbml : true // parse XFBML
    });

    // whenever the user logs in, we refresh the page
    FB.Event.subscribe(«auth.login», function() {
    window.location.reload();
    });
    };

    (function() {
    var e = document.createElement(«script»);
    e.src = document.location.protocol + «//connect.facebook.net/en_US/all.js»;
    e.async = true;
    document.getElementById(«fb-root»).appendChild(e);
    }());
    ‘;
    }

  45. Hola eh usado el codigo pero no se publica el mensaje en el muro del usuario me dice que »
    No se ha podido publicar nada: El usuario no ha dado permiso a esta aplicacion para publicar en su muro» como puedo arreglar el codigo?

  46. Buenas Yeltsin que salga eso no significa que el codigo funcione mal.

    Simplemente detecta si el usuario ha dado permisos o no para publicar. Si no los da publica ese mensaje.

    la linea clave para que puedas hacer pruebas es esta:

    if ( in_array(‘publish_stream’,$fbPerms) ) // comprobamos si tenemos permisos de publish_stream (para publicar en el muro)…

  47. Aupa Iñaki. Estoy usando la misma tecnica que tu para publicar en el muro de otros. Hasta ahora me fucnionaba todo perfectamente hasta que de repente me han enviado un mail los de facebook diciendo que infringia una serie de reglas. Concretamente el hecho de no pedir al usuario el mensaje a publicar sino que lo auto rellena la aplicacion. http://developers.facebook.com/docs/guides/policy/application_integration_points/ normas IV.2 y IV.3
    Este es la fucnon que uso:
    $facebook->api( ‘/me/feed’, ‘POST’, array (
    ‘message’ => ‘Estoy aprendiendo a usar la API de facebook’,
    Se refieren al campo ‘message’ que deberia estar relleno por el usuario.
    Tanto asi que me han restringido la aplicacion y me da un error ‘Feed story publishing is disabled for this application’
    Me extraña por que tiu lo tienes igual y te va bien. ¿Te suena el problema? ¿Como puedo hacer que sea el user el que rellene?

  48. Buenas Raul,

    La verdad es que se han puesto más duros con el tema de infringir normas de usaurios. A nosotros nos han baneado ya unas cuantas apps. Tengo pendiente escribir un post sobre esto, de momento simplemente es mejor evitar el campo «message» a no ser que lo escriba el propio usuario.

  49. Hola ik. Me tope con tu blog y es muy bueno, prové muchos ejemplos y todos me daban error, no podia coger el ID de los usuarios y por ende nada mas :S

    Bueno mi pregunta es la siguiente, que tag debo utilizar para que coga las fotos de perfil pero las miniaturas?, con tu código coge la foto principal de perfil y pues se redimenciona de manera no proporcional. Según el ejemplo que trae facebook, la línea que jala la imagen en cuestión es:

    <img src=»https://graph.facebook.com//picture»>

    Pero no logro integrarla a tu código.

    Gracias por la ayuda de antemano 🙂

  50. Hola, antes queria agradecerte por el codigo, y tengo un problema:
    no publica en mi muro sale que no tiene permisos si podrias actualziar esa parte porque sale ese error,
    Gracias.

  51. Hola Iñaki,

    Primero agradercerte por estos artículos que me han sido de mucha utilidad. Estoy tratando de hacer una aplicación tipo iframe, y despues de varios días tratando de saber porque al cargar la página hace una redirección sin fin, me he dado cuenta que no soy el único con el problema, pues pasa tambien con http://apps.facebook.com/ikprueba/ y con tantas otras que he visto.

    Tienes una idea de la causa del problema y como solucionarlo?

    Gracias

  52. Hola,

    Muchas Gracias por su valiosa ayuda.

    Me gustaría saber alguien tiene idea de como configurar mi API para extraer nombre y mail de la persona que se conecta a una base de datos.

    Gracias

  53. Hola..
    Estoy intentando obtener el nombre de las personas que dieron click en «Me Gusta» a mi pagina.
    Pero hay problemas cuando intenta conectarse.
    sale el mensaje Not connected

    Puedes Ayudarme? Gracias 😀

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *