API de Facebook con PHP

Esta mañana he tenido que dedicar un buen rato a lidiar con los caprichos de la API de Facebook, API que no había tenido necesidad de utilizar nunca, y cuya documentación, si hemos de ser sinceros, no me ha dejado un buen sabor de boca. Por eso, por si alguno os encontrarais alguna vez con cualquier complicación al intentar publicar una nota en el muro, subir una imagen al álbum o publicar un evento usando PHP, os dejo una pequeña explicación de cómo lo he hecho yo. Procedimiento que no tiene por qué ser el mejor o ser si quiera correcto, ojo: si tenéis cualquier sugerencia, os espero en los comentarios.

Lo primero que necesitaremos, evidentemente, es la API oficial de Facebook, que podemos descargar desde GitHub. Descomprimimos el archivo y lo subimos a nuestro servidor.

También necesitamos crear una aplicación, que será la encargada de llevar a cabo estas operaciones sobre nuestra cuenta de usuario o de marca. Para ello os podéis dirigir al sitio web de desarrolladores de Facebook, donde os pedirán amablemente que validéis vuestra cuenta, bien introduciendo vuestro teléfono móvil, para que os envíen un código de confirmación, o bien introduciendo vuestro número de cuenta. En serio, es escalofriante, pero ya sabemos todos como es Facebook.

Una vez hayáis creado la aplicación, podréis consultar el id de la aplicación y la clave secreta de aplicación en esa misma página. Estos son dos de los datos que vamos a necesitar, así que tenerlos a mano.

Lo siguiente que necesitamos es que nuestro usuario dé permisos a nuestra aplicación para poder interactuar con nuestra cuenta. Esto lo podemos hacer de forma sencilla utilizando una URL especialmente diseñada a tal efecto, que tendrá el siguiente aspecto:

https://graph.facebook.com/oauth/authorize?type=user_agent&
client_id=ID_APLICACION&
redirect_uri=http://www.facebook.com/connect/login_success.html&
scope=offline_access,manage_pages,publish_stream,create_event

donde:

  • client_id es el id de la aplicación, que habíamos apuntado en el paso anterior
  • redirect_uri es la página a la que redireccionar el navegador una vez hayamos dado los permisos a la aplicación
  • y scope es una lista de permisos, cuyos posibles valores podemos consultar en la documentación al respecto. El permiso offline_access es uno de los más importantes: permite que el token que nos va a pasar Facebook para autenticarnos no caduque, incluso cuando el usuario esté desconectado. Si quieres interactuar con las páginas que gestiona tu usuario, en lugar, o además de con tu propia cuenta personal, necesitarás requerir también el permiso manage_pages
Dando permisos a nuestra aplicación PHP para Facebook

Al cargar la URL en tu navegador y pulsar ‘Permitir’, si no ha pasado nada raro, Facebook debería redirigirte a la página que indicaste como valor de redirect_uri, añadiendo a esta un parámetro access_token, que es el que utilizaremos para identificarnos, y otro expires_in, que nos informa de que el token de acceso no va a caducar.

Para comprobar que todo funciona correctamente puedes intentar cargar la siguiente URL:

https://graph.facebook.com/me?access_token=ACCESS_TOKEN

Si el token de acceso es el adecuado, Facebook nos mostrará un objeto JSON con la información de nuestra cuenta de usuario. En caso contrario, mostrará un objeto JSON informando del error.

Ahora bien, si queremos interactuar con las páginas de marca que administremos, en lugar de con nuestra página personal, necesitaremos un access token distinto. Para obtenerlo preguntaremos a Facebook por la información de las distintas páginas y aplicaciones que administramos utilizando la URL:

https://graph.facebook.com/me/accounts?access_token=ACCESS_TOKEN

Listo. Ahora sí, ya estamos preparados para empezar a jugar con la API de Facebook. Para publicar en el muro, crear eventos y subir imágenes en Facebook utilizaremos la clase del mismo nombre, a cuyo constructor le pasamos un array con el identificador de nuestra aplicación y su secreto:

$fb = new Facebook(array(
  'appId'  => 'ID_APP',
  'secret' => 'SECRETO',
  'cookie' => true
));

El método que nos interesa de esta clase es api, que normalmente tendrá como primer parámetro una cadena del tipo "/ID_USUARIO/SERVICIO" o "/ID_PAGINA/SERVICIO". El segundo parámetro es siempre el método a utilizar (POST o GET), y el tercero, un array con los argumentos necesarios para ese servicio.

Para publicar algo en el muro, por ejemplo, utilizaríamos como primer parámetro una cadena "/ID_USUARIO/feed" y como tercer parámetro, un array con claves message (el mensaje a publicar) y access_token, siendo este último el valor que obtuvimos anteriormente para identificar a nuestro usuario o alguna de las páginas de marca que administramos (OJO: el token de acceso del usuario no sirve para identificar a la página, evidentemente, y viceversa).

$fb = new Facebook(array(
  'appId'  => 'ID APLICACION',
  'secret' => 'SECRETO',
  'cookie' => true
));

$params = array(
    'access_token' => 'TOKEN ACCESO',
    'message' => 'Hola mundo'
);
$res = $fb->api('/ID_USUARIO/feed', 'POST', $params);
if(!$res)
    echo 'Ha ocurrido un error indeterminado';
elseif($res->error)
    echo "Ha ocurrido un error: {$res->error}";
else
    echo "OK";

Para terminar, os dejo una pequeña clase con la que podréis publicar en el muro, subir una imagen o crear un evento fácilmente:

<?php
require_once 'facebook.php';


/**
 * Clase para facilitar el trabajo con Facebook. Proporciona métodos para
 * publicar imágenes en un álbum, notas en el muro, y eventos
 *
 * Ejemplos de uso:
 * $fb = new Fb();
 * $fb->publicarNota('Prueba');
 * $fb->publicarImagen('/home/zootropo/html/imagenes/mi-imagen.jpg');
 * $fb-gt;publicarEvento('Prueba de evento', 'Descripción del evento', '2011-03-08');
 */
class Fb {
    const ID_APP = 'ID APLICACION';
    const SECRETO = 'SECRETO APLICACION';
    const ACCESS_TOKEN = 'TOKEN ACCESO';
    const ID_ALBUM = 'ID ALBUM';
    const ID_PAGINA = 'ID PAGINA';
    private $fb;

    /**
     * Constructor de la clase. Crea el objeto Facebook que utilizaremos
     * en los métodos que interactúan con la red social
     */
    function __construct() {
        $this->fb = new Facebook(array(
          'appId'  => self::ID_APP,
          'secret' => self::SECRETO,
          'cookie' => true
        ));
    }


    /**
     * Publica un evento
     * @param string $titulo Título del evento
     * @param string $descripcion Descripción del evento
     * @param string $inicio Fecha o fecha y hora de inicio del evento, en formato ISO-8601 o timestamp UNIX
     * @return bool Indica si la acción se llevó a cabo con éxito
     */
    function publicarEvento($titulo, $descripcion, $inicio) {
        $params = array(
            'access_token' => self::ACCESS_TOKEN,
            'name' => $titulo,
            'description' => $descripcion,
            'start_time' => $inicio,
        );
        $res = $this->fb->api('/'.self::ID_PAGINA.'/events', 'POST', $params);
        if(!$res or $res->error)
            return false;

        return true;
    }


    /**
     * Publica una nota en el muro de la página
     * @param string $mensaje
     * @return bool Indica si la acción se llevó a cabo con éxito
     */
    function publicarNota($mensaje) {
        $params = array(
            'access_token' => self::ACCESS_TOKEN,
            'message' => $mensaje
        );
        $res = $this->fb->api('/'.self::ID_PAGINA.'/feed', 'POST', $params);
        if(!$res or $res->error)
            return false;

        return true;
    }

    /**
     * Publica una imagen en el álbum de la página
     * @param string $ruta Ruta absoluta a la imagen en nuestro servidor
     * @param string $mensaje Mensaje a mostrar en el muro, si queremos avisar
     * de la subida de la imagen
     * @return bool Indica si la acción se llevó a cabo con éxito
     */
    function publicarImagen($ruta, $mensaje='') {
        $this->fb->setFileUploadSupport(true);

        $params = array(
            'access_token' => self::ACCESS_TOKEN,
            'source' => "@$ruta"
        );
        if($mensaje) $params['message'] = $mensaje;

        $res = $this->fb->api('/'.self::ID_ALBUM.'/photos', 'POST', $params);
        if(!$res or $res->error)
            return false;

        return true;
    }
}


Comentarios
  1. alex

    por eso me gusta tu pagina, muy claro el articulo.

    Responder

  2. Errepunto

    Quizás sea el código PHP más claro que he visto nunca escrito. ¡Casi parece Java! 🙂

    Quizás me anime a continuar con mi proyecto de dominaci… pruebas con esto, gracias por la info.

    Responder

    • Hombre, no es que sea un código muy complicado. Lo más difícil es aclararse con la documentación de Facebook, y con el hecho de que mucha gente todavía utilice la librería antigua.

      Responder

  3. Como comentario adicional, si usas JavaScript y XFBML, podes poner los permisos a solicitar en el botón de login, así “”””””. ¡Saludos!

    Responder

  4. the_maco

    Muy buen articulo, como siempre. Hace unos meses me vi en la necesidad de hacer una aplicacion en FB y estoy seguro que este articulo me hubiese sido de mucha utilidad.Yo al final termine haciendo muchas cosas con CURL ya que resultaba mas sencillo que la cambiante php-sdk.

    Responder

  5. Os felicito, excelente post !!!

    Responder

  6. He probado todo como lo indicas aca.
    La respuesta es esta:
    Invalid or no certificate authority found, using bundled information

    que debemos poner en ID PAGINA??

    lo unico que yo quiero es enviar una nota a mi muro.

    Gracias!!!

    Responder

  7. Daniel

    Muchísimas gracias, aquí encontré lo que en otras páginas no habían sabido explicar

    Responder

  8. Daniel

    Que tal,disculpa pero soy nuevo en esto y tengo una pregunta? Cómo puedo obtener desde php el access_token correspondiente al usuario?
    Estoy haciendo una aplicación y requiero subir una foto al usuario que visita mi página web.

    Responder

  9. […] un artículo anterior explicaba cómo publicar en el muro de Facebook con PHP, cómo publicar eventos, y cómo publicar imágenes en el álbum de la página, utilizando siempre […]

    Responder

  10. bibiana

    Si no me deja ver mi id que hago!!!
    me salta este error:

    Fatal error: Uncaught GraphMethodException: Unsupported post request. thrown /base_facebook.php on line 988

    Ayuda !!!!

    gracias

    Responder

  11. JuanCapitolio

    Solo me esta funcionando el mensaje.. eventos y fotos no me ha funcionado… que podra ser!

    Responder

  12. sheniff

    Eres el puto amo tio! No sabes la de quebraderos de cabeza que me he llevado con esto!

    Muchísimas gracias!!!

    Responder

  13. Me puedes decir cual es o como saco el ID_ALBUM no me funciona el script al subir o publicar una foto o imagen.

    gracias.. un saludo.

    Responder

    • Sale en la URL cuando visitas la página del álbum, si no recuerdo mal.

      Responder

  14. que buena los felicito es grato y muy producente esta pagina

    Responder

  15. mee

    Y como se hace para obterner el Nombre del usuario?

    Responder

  16. El mejor tutorial que he encontrado para usar la api de fb, gracias!

    Responder

  17. Jesus

    Hola, muy interesante el articulo, disculpa que os moleste con esto pero me han pedido en el trabajo que brindemos premios a usuarios de nuestra empresa a quienes posteen o compartan en sus propios muros los posts que se hagan en facebook/nuestra_empresa, eso se puede hacer? he visto que con facebook connect puedes obtener datos de los usuarios de facebook e identificarlos por su ID y asociarlos a nuestros propios ids d usuarios que usamos en nuestra base d datos, pero sobre lu otro, no tengo ni idea de como hacerlo, os agradeceria enormemente una ayuda al respecto y si se puede hacer o no.. Muchas Gracias de antemano..

    Responder

  18. Pues la parte de eventos no consigo que me lo cree….
    Me responde con una pantalla en blanco y sin respuesta (ni error ni nada, navegador en blanco).

    Responder

  19. aplicacion que se pude usar muy bien

    Responder

  20. Simón

    Hola! Grande tu post…logré que funcionase bien a la primera lo que hace tu post una maravilla porque las cosas a la primera no suelen salir 🙂

    A ver si me puede ayudar alguien: desde el domingo 4 de sep de 2011 ha dejado de funcionar el código que funcionaba si haberlo tocado. Todos los posts a FB fallan con este error:
    (
    [type] => OAuthException
    [message] => Error validating application.
    )
    Si cambio la cuenta de FB y la App de FB me ocurre lo mismo y la info de la App pone que está “valid”.

    ¿Alguien sabe algo? ¿Ha cambiando algo?

    Mencionar que una de las cuentas que he probado y no funciona me pide un captcha para hacer posts en la propia web de FB. Igual tiene que ver, igual no.

    Responder

  21. Cristian

    Muy bueno, clarisimo el codigo.
    En caso de querer publicar con esta api en el muro de un amigo (usuario->amigo) ¿como seria?,
    estoy buscando por muchos lados, pero no encuentro nada claro.

    Responder

  22. Pipo

    Muy buena entrada, la estudiaré a fondo para conseguir hacer aplicaciones facebook con el SDK de PHP, anteriormente usé el SDK de javascript que también viene bién para publicar en muros de forma sencilla, como viene en este ejemplo:

    http://aplicacionesfacebookparadummies.blogspot.com/2011/09/landing-page-utilizando-el-api-de.html

    Responder

  23. Anónimo

    favor detallar los pasos a seguir

    Responder

  24. Daniela

    Hola, al querer crear la aplicacion para obtener la clave api y demas obtengo:

    You can no longer create apps because our systems indicated that your account may not be authentic. Facebook requires users to provide their real first and last names, and fake accounts are a violation of our Statement of Rights and Responsibilities (SRR 4.1), even when used to host or test apps. Also note that maintaining multiple accounts, even if they are authentic, is also prohibited. If you would like to create a test user to test app functionality, you can do so here: http://developers.facebook.com/docs/test_users/

    La cuenta esta autentificada por celular. Como puedo solucionarlo?

    Gracias por el aporte. Saludos

    Responder

  25. kevin

    gracias, me sirvio para mi pagina en facebook

    Responder

  26. ada

    necesito entrar en mi facebool y no lo consigo como puedo hacerlo si lo an cambiado todo

    Responder

  27. Santi

    EXCELENTE WEB! POCAS, MUY POCAS veces he encontrado una web tan bien explicada y util

    Muchas gracias!

    Responder

  28. Ya… por lo que he revisado, la Clase FB solo sirve para un usuario predefinido… le hice algunos cambios, para que pueda ser adaptado a cualquier usuario que se conecte al sitio… por lo que he revisado se puede obtener informacion… pero y si quiero hacer lo inverso… que desde mi sitio postee cosas en el usuario? humm… creo que ya se que podria ser… pero…

    TOKEN_USER, va cambiado cada X tiempo verdad? o sea si se pudiese almacenar en una DB podria generar que envie informacion a un grupo de usuarios…. mmmmm….. sigo mi investigacio… gracias por las Clases.

    Responder

  29. Daniela

    Muchas gracias por el tutorial.
    Pude crear correctamente la aplicacion, pero lo que no puedo hacer es “añadirla a mi pagina”, no sale en ningun lado el boton que dicen que tiene que estar.
    Alguna idea?.
    Gracias.

    Responder

  30. Alberto

    100001 Gracias ojala que FB escribiera su ayuda de la manera que la has explicado ya que lo unico que hacen es publicar cosas que ni se entienden y de cola que ni funcionan los ejemplos del PHP Sdk que ellos publican no funcionan.

    Responder

    • Adrián

      Hola, ¿conseguiste subir fotos desde php? Un saludo.

      Responder

  31. Alex

    Una pregunta, este script redirecciona a la web de Facebook para autentificar, no debería abrir un popup para identificar y tb para los permisos?

    Responder

  32. Johan

    Por favor, necesito saber si facebook pide ahora https para poder publicar en el muro, pues estoy haciendo todo muy claro segun los pasos, pero no me da error, pero tampoco pone el post en el muro de mis amigos, gracias por su ayuda

    Responder

  33. Carlos

    Hola. He probado de enviar una nota al muro y funciona. Pero despues de la segunda publicación, cuando intento publicar una nota me salta el error:

    Fatal error: Uncaught OAuthException: (#506) Duplicate status message thrown in base_facebook.php on line 1106

    Si espero unos 5 minutillos me vuelve a dejar publicar notas, pero solo 2. A la tercera publicacion vuelve a “bloquearse”.

    Alguien sabe porque?

    Responder

    • Oscar Rivas

      Hola, yo lo he resuelto añadiéndole la fecha al final del mensaje, por ejemplo:

      $req = array(
      ‘access_token’ => $token,
      ‘message’ => ‘Mensaje de prueba con mi aplicación ‘.date(“d/m/Y H:i:s”));

      De esa forma el mensaje no es el mismo y documento la fecha y hora en la cual se hizo.

      Espero haberte ayudado, un abrazo desde Lima, Perú

      Responder

  34. Hola, muchas gracias por el código se ve muy bien detallado, pero no se porque razón no me funciona!!

    siempre me sale este msj de error

    Fatal error: Uncaught OAuthException: Error validating application. thrown in /home/galaxumc/public_html/fa_prue/src/base_facebook.php on line 1106

    alguien sabe por qué este error? gracias 🙂 saludos

    Responder

    • Danny

      Hola Carlos, disculpa que no vaya a responder tu pregunta, yo también tengo el mismo problema y me pregunto si es que durante este tiempo lograste solucionarlo, porque yo estoy hacer un par de días con el mismo problema y no lo puedo solucionar, cualquier dato que me dieras te lo agradecería mucho.

      Responder

  35. Omar

    Hola una duda despues que pongo el ID_APLICACION y doy enter como guardo la segunda URL que me da el navegador agradecere mucho tu ayuda gracias
    Url 1:
    https://graph.facebook.com/oauth/authorize?type=user_agent&amp;
    client_id=ID_APLICACION&
    redirect_uri=http://www.facebook.com/connect/login_success.html&
    scope=offline_access,manage_pages,publish_stream,create_event

    Url 2:
    http://www.facebook.com/connect/login_success.html#access_token=TOKEN_ACCESS&expires_in=0&code=AQB-Q6FsESjIsAEGshB9etv6oCqmnxEcZwV9SYclbRVhXfT3KKF6jBq4Zdh6BY4B7bmJtYxj4V0PLoT8bKLNBfbv05bJuQha62dY5nAGS1OqgWJBcu-JnwlbVBubPFkoRuJ2srEGcunJJeIhrJbFDRwK_JOnRiatXgl_MAPofG7ILd-gfEyZMBeHpnsH7uSdGQo

    Responder

  36. Alberto

    Tengo un problema!! todo va de maravilla pero después de que me regresa a la web donde redirecciono no tengo idea de como llevar el ACCES TOKEN

    me pueden ayudar??

    Responder

    • Jonathan

      Lo obtienes via get $_GET[‘access_token’]

      se supone que la pagina que recibe la redirección contiene la lógica para interáctuar con Facebook

      Responder

  37. Alberto

    creo que el problema es el # en la URL que no me deja recibir los parametros!!

    ALGUNA IDEA DE COMO REMOVERLO?

    Responder

  38. Pedro Barco Carrasco

    gracias esto esta muy interesante…

    Por si acaso no usaste esta API para enviar SMS?
    me interesa mucho saber si esto se puede, para mi proyecto

    Responder

  39. Interesante Articulo, muy necesario para iniciar, gracias.

    Responder

  40. Adrián

    Hola, se que es de hace tiempo el articulo pero ……. no consigo subir fotografías, solamente notas y eventos … creo que es problema de la id_album, o la pongo mal o nose como extraerla, ya que como cambio todo un poco en octubre de 2011….hoy, en abril de 2012, ….tengo ese problema. Un saludo.

    Responder

  41. cristian palacios

    Muy buena la pagina muy útil

    Responder

  42. itachi uchiha

    ola un pregunta como hago para asociar esta clase a los eventos de wordpress plisss gracias

    Responder

  43. uchiha

    olep una duda q clase de la Events Manager debo modificar para asociar a esta clase

    Responder

  44. junior

    Saludos, alguien podria pasarme el codigo completo en un zip por favor.
    No entendi lo del acces_token
    https://graph.facebook.com/oauth/authorize?type=user_agent&amp;
    client_id=ID_APLICACION&
    redirect_uri=http://www.facebook.com/connect/login_success.html&
    scope=offline_access,manage_pages,publish_stream,create_event

    En que parte debo poner esto.

    Agradezco la pronta ayuda

    Responder

  45. Excelente material.. la simplicidad reluce, creo que cualquier persona que desee iniciarse en el desarrollo sobre redes sociales debe considerar seguir tus publicaciones. desde mi rincon mil Felicidades…

    Cesar A. Rangel Cohen
    Networker Profesional
    GBM Core Founder

    Responder

  46. ESTUPENDO! andaba algo perdido sobre cómo crear aplicaciones y esto me ha orientado para comenzar, gracias !

    Responder

  47. Francisco

    Porfavor si me podrian ayudar, soy novato en realizar aplicaciones en facebook, tengo un error al ejecutar el código:

    Parse error: syntax error, unexpected T_CONST, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in D:\inetpub\vhosts\mi_dominio.com\httpdocs\facebook\Aplicacion1\index.php on line 15

    Responder

  48. Jose Antonio

    Buenos días,

    Tengo una consulta por que ya no se que hacer,

    Tengo una app de facebook, que publica en el muro de los usuarios.

    pero mi problema es que cuando el usuario instala la app, y acepta los permisos,

    hago un direccionamiento a una nueva pestaña mostrando la información.

    El problema es que cuando el usuario vuelve a la pestaña de facebook, sigue la ventana popup de la aplicación solicitando que el usuario vuelva a instalar la app.

    el usuario ya tiene instalada la app, con que no debería de salir ese mensaje.

    por otra parte si el usuario vuelve a aceptar que la vuelva a instalar, sale un mensaje de que el usuario ya tiene instalada la app.

    me gustaría que si alguien me pudiera ayudar.

    Un saludo

    Responder

  49. Marcos

    Hola “Zootropo”

    Muy bueno tu aporte. si me permites te hago una consulta realcionada con las aplicaciones.

    He hecho una para un cliente. Una aplicación que muestra una serie de imagenes. cada imagen tiene asociada un l,ink de tal forma que al pulsar encima de l aimagen accedes a una página web. Esta lista de imagenes y sus links se cargan de una base de datos.

    Elhosting donde está alojada la aplicacion dispone de un acceso a través de SSL.

    El tema es que despues de un mes funcionando tranquilamente, ahora la aplicacion de mi cliente se ve en blanco y si uso el DEBUGER de facebook me dice esto:
    “La aplicacion Bloggs Amigos” Esta temporalmente inhabilitada debido a un problema con un desarrollador externo. Estamos investigando la situacion y pedimos disculpas por los inconvenientes ocasionados”

    la graph API dice:
    { “error” :
    { “mensaje” : ” (# 803) Algunos de los alias que ha solicitado no existe: bloggsamigos ” ,
    “type” : ” OAuthException ”
    , “código” : 803 }
    }

    Sabrias decirme qué pasa y porqué tengo la aplicacion bloqueada?

    Muchas gracias por tu ayuda, de verdad
    Marcos

    Responder

  50. Hernan

    Alguien sabe cómo postear en las noticias del usuario de acuerdo a un parámetro? Gracias.

    Responder

Deja un comentario