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;
    }
}


84 pensamientos en “API de Facebook con PHP”

  1. 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.

    1. 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.

  2. 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.

  3. 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!!!

        1. 🙂 es que tengo tu canal rss, y me interesa mucho aprender de los mejores y vos sos uno de ellos cualquier duda que tenga te consutlo 😉

  4. 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.

  5. Pingback: Obtener el número de fans en Facebook con PHP

  6. 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

  7. 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..

  8. 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.

  9. 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.

  10. 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

  11. 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.

  12. 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.

  13. 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.

  14. 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?

  15. 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

  16. 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?

    1. 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ú

  17. 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

    1. 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.

  18. 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

  19. 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??

    1. 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

  20. 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

  21. 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.

  22. 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

  23. 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

  24. 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

  25. 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

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.