Conociendo el PHP SDK de Facebook

Facebook provee a los desarrolladores un kit de desarrollo para poder trabajar con su API de una manera más sencilla, dentro de estas herramientas se encuentran el JavaScript SDK, PHP SDK, iOS SDK (iPhone & iPad) y el Android SDK. Para este caso veremos el funcionamiento del PHP SDK de Facebook, trabajaremos algunos de sus métodos más usados, eso si, es primordial haber leído antes el funcionamiento de la Graph API de Facebook para entender lo que se hace en el código.

Puedes descargar el archivo facebook.php que necesitamos desde github. La versión actual es la 3.1.1, muy importante en tener en cuenta esto para las personas que ya habían desarrollado aplicaciones antes, ya que algunos métodos no funcionan en las nuevas versiones del SDK, como es el caso de getSession() que hacía parte de la Rest API, así que si ven un Fatal error: Call to undefined method Facebook::getSession() ya saben la razón.

Autenticación

El siguiente código siempre será necesario usarlo para poder autenticar el usuario con una aplicación (obtener un token, pedir permisos), si buscas por la red te podrás encontrar con múltiples formas para hacer este paso, hay personas que hacen varios tipos de validaciones (recomiendo que tu también lo hagas) para evitar errores; en este caso para ahorrar código y para que se entienda mejor he puesto lo estrictamente necesario:

<?php
/*
	Código de ejemplo para obtener datos del usuario en Facebook
	www.BrianUR.info
*/
// URL de la aplicación
$urlApp = "http://apps.facebook.com/brianur/";
// ID y Secret ID de la aplicación
$appId = "0000000000000";
$secret = "00000000000000000000000000000000";
//Llamada al Facebook SDK
include_once "facebook.php";
// Instanciamos el objeto Facebook
$facebook = new Facebook(array('appId' => $appId,
							   'secret' => $secret,
							   'cookie' => true));
// Obtenemos una session
$user = $facebook->getUser();
if (!$user){
// Si el usuario no está autentificado crea una URL para hacerlo.
// Se usa 'scope' para pedir permisos separados por coma.
// Se usa 'redirect_uri' para redireccionar a esa URL despues de la acción del usuario
$loginUrl = $facebook->getLoginUrl(
            array(
                'scope' => 'user_about_me',
                'redirect_uri' => $urlApp
            )
    );
echo "<script type=\"text/javascript\">top.location.href = '$loginUrl';</script>";
} else {
	// Hasta aquí el usuario tendría que estar autentificado con la aplicación.
	$yo = $facebook->api('/me');
	print_r($yo);
}
?>

El anterior código retorna varios datos del usuario, para ver datos ocultos se requiere el uso de permisos extendidos.

Métodos

NombreUso
apiLlamadas a la conexiones y objetos disponibles en la Graph API. Tambien puede realizar consultas FQL.
getAccessTokenObtiene un token de acceso que puede ser usado posteriormente con otros métodos.
getApiSecretObtiene la secret ID de la aplicación
getAppIdObtiene la App ID de la aplicación
getLoginStatusUrlDevuelve la URL con el estado de la autentificación actual del usuario
getLoginUrlDevuelve una URL para que el usuario se pueda autenticar y luego redirecciona a la aplicación
getLogoutUrlDevuelve una URL para que termine la sesión del usuario en la aplicación y luego redirecciona a la misma
getSignedRequestObtiene una solicitud firmada que utiliza el SDK
getUserDevuelve el ID del usuario, sino está autenticado devuelve un 0.
setAccessTokenFija el token de acceso actual que se este usando
setApiSecretFija la secret ID de la aplicación que se este usando
setAppIdFija la App ID de la aplicación que se este usando
setFileUploadSupportSirve para subir archivos para trabajar luego con ellos, el servidor debe permitir la carga de los mismos.
useFileUploadSupportPermite verificar si la carga de archivos está disponible en el servidor

Ejemplos útiles

Mostrar todos los amigos de un usuario:

<?php
$amigos=$facebook->api('/me/friends');
foreach($amigos['data'] as $amigo){
echo "Nombre: ".$amigo['name']." ID: ".$amigo['id'];
}
?>

Mostrar los primeros 10 amigos por ID y Nombre:

<?php
$amigos=$facebook->api('/me/friends?limit=10&fields=id,name');
foreach($amigos['data'] as $amigo){
echo "Nombre: ".$amigo['name']." ID: ".$amigo['id'];
}
?>

Mostrar foto de perfil del usuario:

<?php
$yo=$facebook->api('/me');
$fotoPerfil = "<img src='http://graph.facebook.com/".$yo&#91;'id'&#93;."/picture?type=large'/>";
echo $fotoPerfil;
?>

Publicar en muro:

<?php
$parametros=array('message' => 'Aprendiendo a desarrollar aplicaciones en Facebook',
				  'name' => 'BrianUR.info',
				  'caption' => 'Mi primer aplicacion en Facebook',
				  'link' => 'http://www.brianur.info',
				  'description' => 'Es genial',
				  'picture' => 'http://brianur.info/brianur.png',
				  'actions' => array(array('name' => 'Entra ya!',
                                      'link' => 'http://www.brianur.info')));
$facebook->api('/me/feed','post',$parametros);
?>

  39 Comentarios

  1. David Morales   •  

    Yo ya pude hacer que funcione, si gustan comunicarse conmigo puedo ayudarles!

  2. Ernesto Villeda   •  

    Buenas tardes Brian Urban. una consulta tu puedes hacer una app que si me urge entregarla en mi univesidad y me gustaria que me explicaras mejor empiezo con esto de la programada.

    la app es sencilla.

    1. Tomar una foto desde la web que cree (la web tiene que ser responsive con bootstrap).
    2. quitarle el fondo de la foto y solo dejar a la persona. (poder seleccionar 5 a 6 opciones de fondo de foto)
    3. publicarla en fb y si es posible que se guarde en un album especifico en fb (para publicarla que pida usuario y contraseña ) para poder logearse al fb de la persona que e tomo la foto.

    te lo agradeceria es mas estoy dispuesto a pagar x eso.

    avisame y estamos ready!

  3. Jose Luis   •  

    Buenas tardes Brian, quisiera saber como obtener la foto de portada de un usuario, la de perfil fue facil
    solo con esto
    pero la de portada no tengo idea de como obtenerla, podria ayudarme por favor?

    • Brian Urban   •     Autor

      Con $yo[‘cover’] debería devolver un array que contiene ‘source’ con la URL de la imagen. Con $yo[‘cover’][‘source’] debería funcionar.
      Saludos.

  4. yail   •  

    Cuando es necesario el access token??

  5. manuel   •  

    pregunta como hago que para que cuando acepten los permisos me vuelva a llevar al post donde estaba, es decir
    si la persona que este en ” http://www.midominio.com/post1.php ” y va a la app desde ese link me vuevla a llevar a ese post, intente cambiando la $urlApp pero esa solo acepta una url la q esta predeterminada en al configuracion entonces solo me lleva a esa url predeterminada, pero veo la forma de luego q acepten los permisos me lleve al post donde estaba 🙁 hay alguna solucion para eso???

  6. manuel   •  

    MMMM hola muy buen tuto pero tengo un problema, cuando el usuarios acepta los permisos y todo eso le manda ami web pero luego se vuelve a redireccionar y asi un circulo de redireccionamiento infinito mmm no entiendo por q pasa eso si hice todo lo q histe tu 🙁 helpmeeeeeeeeeee

  7. karime   •  

    genial!!!!

  8. Fabian   •  

    Hermano una pregunta por que sera que la conexión a Facebook consume demasiado CPU segun el proveedor del host me informo eso que el problema es de la conexión con Facebook y estoy utilizando este metodo

  9. Pingback: Publicar una foto con el PHP SDK en Facebook | BrianUR

  10. ANDREA   •  

    Era eso, muchas gracias :):)

  11. ANDREA   •  

    Hola Brian, intento utilizar el codigo q colocaste de hacer una publicacion en el muro, me sale lo siguiente:
    Fatal error: Uncaught OAuthException: (#200) The user hasn’t authorized the application to perform this action thrown in /home/smartco/public_html/proseinfb/Facebook/base_facebook.php on line 1039
    en la parte de permisos que debe ir para que me permita publicar en su muro?

    • Brian Urban   •     Autor

      Eso quiere decir que el usuario no aceptó el permiso, debe estar en scope’ => ‘publish_stream’ y al aceptarlo debería publicar.

  12. Laura   •  

    Hola Brian, como hago para traer la url del perfil de facebook

    • Brian Urban   •     Autor

      Hay varias formas, podría ser tomando el ID del usuario:
      $yo = $facebook->api(‘/me’);
      $id = $yo[‘id’]:

      Y luego generar una URL:
      $url = “http://www.facebook.com/profile.php?id=” . $id;

  13. Francisco   •  

    Hola brian, excelente material me ha servido mucho, tengo una consulta ¿cómo puedo hacer para que el usuario envie una solicitud a determinados usuarios que el elija? me imagino que obteniendo el ID del amigo con api(‘me/friends’) ¿pero una vez que lo tenga cual sería el comando para enviarle la solicitud?

  14. nacho   •  

    Muchas gracias! muy bueno

  15. Edgar Hernandez   •  

    Muchas Gracias Brother Me Salvaste la Vida de Casualidad.
    No tienes un Código para Subir una Foto o Hacer un Album A travez desde un Aplicación.

  16. jennifer arias   •  

    hola, quisiera consultarte. Tengo el codigo para subir fotos a un album de facebook (el de la app) como hago para obtener la ruta de la imagen que acabo de subir, como para mostrar la imagen de facebook y no la que esta en mi servidor. Gracias.

    • Brian Urban   •     Autor

      Lo que puedes hacer es leer a id_album/photos y tomar el ultimo valor, si no conoces el id del álbum lo que puedes hacer es buscarlo dentro /me/albums. Para que me entiendas mejor puedes hacer uso de http://developers.facebook.com/tools/explorer/ e ir haciendo pruebas y luego será mucho mas sencillo hacer el código.

      • jennifer arias   •  

        gracias! lo solucione asi:

        $result = json_decode(file_get_contents(‘https://graph.facebook.com/me/albums?access_token=’.$access_token));
        $result = $result->data;
        foreach($result as $album){
        $rs_album=$album->id;

        $photos = $facebook->api(“/”.$rs_album.”/photos”);
        foreach($photos[‘data’] as $photo)
        {
        if($photo[‘id’]==$foto_info){
        $foto_final_facebook=$photo[‘source’];
        }
        }
        }

  17. Gabriel   •  

    Hola Brian, muchas gracias por tu valiosa información. He estado trabajando estas ultimas semanas con esto de Facebook Connect. Incluso ya puedo publicar en el muro de la persona, pero en algunos casos he notado que algunas personas tienen configurado su FB para que no se pueda publicar a pesar de haber solicitado permisos previamente.

    Existe alguna manera de validar esto?

    Gracias por tu amable ayuda.

    • Brian Urban   •     Autor

      Hola Gabriel, usando excepciones y leyendo los permisos que aceptó el usuario. Esto se puede hacer con el parámetro permissions, en la sección accounts de la documentación se encuentra la forma de hacerlo.

  18. mike   •  

    Hey Brian como puedo hacer que se llene un combo con los amigos de un usuario en un select para que puedan elegir determinado usuario
    algo así como esta aplicación

    https://apps.facebook.com/darihati

    espero me puedas ayudar ^^

    • Brian Urban   •     Autor

      Usando uno de los ejemplos de arriba lo puedes hacer (Mostrar los primeros 10 amigos por ID y Nombre) algo como:

      echo "(menorque)option value='$amigo['id']'(mayorque)$amigo['name']
      (menorque)/option(mayorque)";

  19. Alex Roel Castañeda Aquino   •  

    Hola Brian la verdad es que este y todos los artículos que vas publicando en tu blog son realmente excelentes!… la verdad es que estuve buscando mucha información sobre como utilizar la api de faceboook y felizmente me tope con tu blog donde encontré prácticamente todo lo necesario para crear una aplicación. No te escribo con la intensión de preguntarte algo sobre lo que has posteado, simplemente estoy escribiendo este mensaje para agradecerte la enorme ayuda que nos brindas… Gracias Brian… Muchas Gracias y Exitos!!!

  20. Jesús Santos   •  

    Hola Brian:

    Otra vez yo molestando, fíjate que ya logré traer las fotos de mi usuario, pero si le doy:

    $facebook->api(‘/me(albums’); me trae la info de los albumes y sus portadas;

    Y si le doy:

    $facebook->api(‘/me/photos’); me trae las fotos donde el usuario ha sido etiquetado.

    ¿Habrá una forma de traer las fotos de un determinado album (como el del muro o el del perfil)?

    Muchas Gracias de antemano y espero no molestar!!

  21. Brian Urban   •     Autor

    Hola Alberto, bien para guardar datos es cuestión de después de tener la autentificación del usuario (el permiso si es necesario) enviar ese dato a la BD, por ejemplo si tengo $yo = $facebook->api(‘/me’); luego para guardar el nombre se hace un insert con $yo[“name”] a la base de datos (usando la forma que sea) y listo. Si es para guardar los datos de session entonces se puede usar el método llamado getAccessToken.
    Saludos.

  22. Alberto   •  

    hola senor he visto sus publicaciones y estan muy buenas yo soy programador pero ahora estoy desarrollando aplicaciones facebook y quisiera pedirle su ayuda en sus posibilidades, yo tengo una duda, yo quiero guardar los datos de session de usuarios de facebook pero en mi base datos, pero no logro que se me guarden los datos en mi base datos, como pudiera resolver eso??? si usted sabe o me diera una pista se lo agradeceria enormemente

    gracias

    Alberto

  23. Jesús Santos   •  

    Muchas Gracias Brain me faltaba pedir los permisos por eso el array me llegaba vacío!!!

  24. Brian Urban   •     Autor

    Hola Jesús, para hacer eso primero debes pedir los permisos user_photos o friends_photos y hacer algo como $fotos = $facebook->api(‘/me/albums’); eso debería devolver un array con todos los albums del usuario y sus respectivas fotos.

  25. Jesús Santos   •  

    Hola Brian:

    Primero que nada me gustó mucho tu publicación, he estado buscando como hacer aplicaciones facebook y es de lo mejor que he encontrado, por ello quería comentarte si de casualidad sabes cómo podría hacer para mostrar las fotos del usuario que se loggea en mi sitio web, ya que en mi aplicación necesito que el usuario pueda escoger una de sus fotos del facebook, he buscado por todos lados y no he encontrado nada.

    De antemano muchas Gracias!!

  26. Brian Urban   •     Autor

    Tocaría ver el código para ver que pasa.

  27. Ghost   •  

    Tengo un pequeño problema. Que cuando el usuario acepta la aplicación no me redirige a la página de la aplicación si no a la página del servidor.

    Y otra cosa, cuando agrego permisos para publicar en el muro primero se pide acceso a la aplicación como tal y luego redirige a una nueva página para pedir permisos de publicación en el muro.

    ¿Qué podrá ser?

  28. Brian Urban   •     Autor

    Hola Andrés, algunas veces me pasó eso y es cuando uno hace un iframe a alguna pagina de Facebook entonces ellos muestran como una imagen para ir directamente a esa pagina. Debe ser algún error mínimo en el código, no olvides reemplazar las variables $urlApp, $secret y $appId con los datos de tu aplicación.

  29. Andres   •  

    Hola, estoy haciendo mi primera aplicación en Facebook, y la tengo casi lista, pero el único problema que tengo, es al pedir permisos. Tengo el pedido tal cual este artículo, pero antes de ir a la pantalla de aceptar los permisos pedidos, facebook me lleva a una pagina con el logo de Facebook, si hago click en el logo de Facebook, recién ahí me lleva a la pagina de aceptar permisos. Sabes que puede ser?? Muchas gracias

  30. Oyagum   •  

    Muchas gracias por la información aquí mostrada por fin encuentro un sitio donde expliquen decentemente como funciona el php-sdk de Facebook 🙂 lo que ahora me queda por saber es como hacer para publicar una pestaña de una aplicación dentro de una página de facebook, a ver si me puedes echar un cable o ponerlo ahi como ejemplo, gracias 😉

  31. Pingback: Publicar en el muro con el PHP SDK | BrianUR

Deja un comentario

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