Do not speak Spanish? Read this post in English.

Sábado, 06 d junio d 2009.

API de FaceBook : Creando acciones a un usuario desde una aplicación

Nota
La Api de Facebook antigua, en la que está basada la mayor parte de este post, está siendo reemplazada poco a poco por una nueva api de facebook. Es necesario que sepas que Facebook cada día da menos soporte a su antigua api y a Facebook Connect.

Si estás buscando información general sobre este tema te recomiendo que leas los artículos más actuales en la categoría Facebook Graph Api de este mismo blog.

Más concretamente, y en relación a este artículo, puedes leer:

Sin duda este es el punto que considero más útil en una aplicación de FaceBook: La capacidad de crear mensajes de un usuario o interactuar realmente con sus amigos. La API de faceBook tiene algunas limitaciones pero entre otras cosas nos permite desde nuestros programas realizar acciones de SMO realmente complejas.

Básicamente, una vez el usuario ha dado permisos suficientes a la aplicación la API nos permite realizar por él cuantas acciones de interrelación con otros usuarios deseemos: Cambiar su Status, publicarle links, fotos o Vídeos, enviar notificaciones a sus amigos o incluso, dentro de poco, publicar en los muros de sus amigos. Vistro desde el punto de vista del SMO esto habre una gran cantidad de oportunidades nuevas a las empresas si lo hacen bien.

Extended Permisions

Por defecto casi ninguna de estas acciones está permitida para las aplicaciones. Los usuarios deben consentir explicitamente que van a permitir a nuestras aplicaciones realizar estas tareas. Una vez lo permitan tenemos vía libre para actuar como si fuesemos el usuario con su propia cuenta. Pero eso sí, debemos recordar que FaceBook tiene normas en contra del Spam y que el usuario y todos sus amigos pueden desactivar o banear nuestra aplicación cuando lo deseen.

Para controlar los permisos que tiene una aplicación sobre un usuario concreto FaceBook usa una parte de su API llamada Extended Permisions. En ella se detallan uno a uno los permisos que ha dado el usuario para cada una de estas acciones por separado y como hacer que nuestras aplicaciones soliciten a los usuarios otorgar estos permisos.

En otro post de este blog tratamos este tema en particular dando distintas opciones para conseguir que un usuario nos de permisos.

Una vez tenemos los permisos apropiados podemos dirigirnos a la referencia de la API de FaceBook para ver como realizar las distintas acciones sobre la cuenta del usuario.

Seguidamente unos cuantos ejemplos de como realizar las acciones más títpicas...

Cambiando el Status de un usuario desde nuestra aplicación

De esta forma conseguimos que el usaurio deje un mensaje de estado que podrán leer todos sus amigos, que quedará reflejado en el histórico de su muro y que servirá como identificador en los chats que tenga hasta que el mismo escriba un nuevo mensaje.

Esta publicación requiere que el usuario haya aceptado los permisos para 'status_update'.

$facebook->api_client->status_set('Mi Nuevo Status','');

O bien con la forma genérica:

$facebook->api_client->call_method("facebook.status.set", array(
  'uid'		=> $user_id,
  'status'	=> 'Tu nuevo Status'
));  

Publicandole un link a un usuario

Otra de las opciones es la de publicarle directamente un link. De esta forma podemos hacer que un usuario recomiende a sus amigos las páginas que a nosotros nos interesen.

Esta publicación requiere que el usuario haya aceptado los permisos para 'share_item'.

$facebook->api_client->links_post('http://blog.ikhuerta.com','Este blog deberías leerlo todos!!!',$user_id);

O bien con la forma genérica:

$facebook->api_client->call_method("facebook.links.post", array(
	'uid'			=> $user_id, 
	'url'			=> "http://blog.ikhuerta.com",
	'comment' 		=> 'Este blog deberías leerlo todos!!!'
)); 

Enviando notificaciones de parte de un usuario a sus amigos

Otra opción es la de crear una notificación para los amigos que deseemos. Las notificaciones son alertas que aparecen en la esquina inferior derecha de la página de faceBook y por su vistosidad son algo que casi todos los usuarios de FaceBook revisan nada más entrar en la web.

La API nos permite publicar notificaciones dejando bien claro que es nuestra aplicación quien las ha creado o bien dejarlas como si el usuario las hubiese publicado. Esta segunda opción resulta mucho más interesante pero nos acerca demasiado hacia el Spam.

Aunque suene extraño, parece que esta publicación no requiere de aceptación del usuario.

// id's de usuarios que recibiran la notificación separados por comas	
$facebook->api_client->notifications_send($users_ids, 'Te he dejado una notificación con la API de Facebook', 'user_to_user');

O bien con la forma genérica:

$facebook->api_client->call_method("facebook.notifications.send", array(
  // id's de usuarios que recibiran la notificación separados por comas	
  'to_ids'		=> $users_ids, 
  'type' 		=> 'user_to_user',
  'notification'	=> 'Te he dejado una notificación con la API de Facebook'
));  

Escribiendo en el Muro de un amigo del usuario

Esta opción actualmente está todavía en Beta y por eso tiene la limitación de que solo los creadores de la aplicación pueden dar permisos a esta para que publique como ellos en sus muros. Aún así me parece una herramienta muy potente. Un ejemplo: Podemos crear nuestra marca en FaceBook y crearle una aplicación que le permita escribir directamente en los muros de todos los amigos que tenga la marca, asegurando que los mensajes llegarán a sus destinatarios y serán visibles además para todos los amigos de los amigos de la marca.

Esta publicación requiere que el usuario haya aceptado los permisos para 'publish_stream'. Aun con estos permisos esta publicación solo puede hacerse con los desarrolladores de la API.

$facebook->api_client->call_method("facebook.stream.publish", array(
	'uid'			=> $user_id, 
	'target_id'		=> '11214261', // Usuario en el que escribimos en su muro
	'message' 		=> 'Dejando un mensaje en tu muro mediante la API de facebook'
));  

Publicandole al usuario mensajes de aplicación en su Feed

Por último la forma más común que usan las aplicaciones de Facebook para dejar mensajes en los hilos de los usuarios es mediante el publish_stream. Con este metodo podemos publicar un elemento compuesto por varias partes que nos permite una publicación mucho más vistosa (aunque también mucho más identificable como mensaje de una aplicación). El uso de Stream publish se realiza enviando un array asociativo a la funciónd e PHP, el echo de que incluyamos distintos elementos en el mismo cambiará la apariencia del mensaje en la aplicación. Se recomienda hacer unas cuantas pruebas para ver el resultado. En el ejemplo aqui mostrado intentamos incluir todos los elementos posibles del array, seguramente tu necesitaras algunos menos.

Esta publicación requiere que el usuario haya aceptado los permisos para 'publish_stream'.

// Definimos los datos adjuntos al mensaje publicado
$attachment = array(
  // Nombre dado al adjunto
  'name' => 'Mi adjunto',
  // Link al que lleva el nombre
  'href' => 'http://blog.ikhuerta.com',
  // Descripción que lo acompaña en color gris
  'description' => 'a funny looking cat',
  // Nombre de la captura (sin documentacion)
  'caption' => '{*actor*} rated the lolcat 5 stars',
  // Propiedades extra (sin documentacion)
    'properties' => array(
      'category' => array(
      'text' => 'humor',
      'href' => 'http://www.icanhascheezburger.com/category/humor'
    ),
    'ratings' => '5 stars'
  ),
  // contenido multimedia
  // Tipos y datos: http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29
  'media' => array(
    // un array por elemento a incluir
    array(
      // tipo imagen
      'type' => 'image',
      // url de la imagen
      'src' => 'http://icanhascheezburger.files.wordpress.com/2009/03/funny-pictures-your-cat-is-bursting-with-joy1.jpg',
      // link de la imagen
      'href' => 'http://icanhascheezburger.com/2009/04/22/funny-pictures-bursting-with-joy/'
    )
  ),
  'latitude' => '41.4',
  'longitude' => '2.19'
);

// definimos los links que debe llevar el mensaje
$action_links = array(
  array(
    'text' => 'Recaption this',
    'href' => 'http://mine.icanhascheezburger.com/default.aspx?tiid=1192742&recap=1#step2'
  )
);

// lanzamos la orden para mandar la publicación
$facebook->api_client->stream_publish($message, $attachment, $action_links);

Y con esto, ya he dado un repaso a las formas más importantes de interactuar con los amigos de los usuarios en Facebook. Pero hay más formas, solo hay que revisar detenidamente para ir viendo más y más posibilidades...

Temas Relacionados: programacion

Autor:

28 Comentarios para “API de FaceBook : Creando acciones a un usuario desde una aplicación”

  1. Franco dice:

    Hola realmente muy bueno tu post, pero hice la prueba el script y me lanza un error, ¿sabes si en el API de facebook hicieron alguna modificación?

    Gracias

    • ikhuerta dice:

      Hola Franco,

      Que yo sepa no han hecho cambios y hoy mismo he estado jugando y estas funciones me siguen funcionando. Solo una cosa, el post son más unos apuntes sobre que funciones usar que un script terminado. Que tipo de error te da? Tal vez no iniciaste bien la clase de facebook, usas otra version de php, o rescataste mal algún dato...

  2. hola... estuve leyendo el post y tuve algunos problemas para extender permisos... copie el codigo completo que tienes tu:

    /**********************************************/
    // Iniciamos el objeto facebook
    require_once('libs/facebook.php');
    $appapikey = '98258a912358b98e9823957ff1239581';
    $appsecret = '4209ca98ae9d9b9e9c8998325ae9c8a';
    $facebook = new Facebook($appapikey, $appsecret);
    // extraemos el id de usuario actual
    $user_id = $facebook->require_login();

    // extraemos si tiene permisos sobre 'share_item'
    $hasPermission = $facebook->api_client->call_method("facebook.users.hasAppPermission",array(
    'uid' => $user_id,
    'ext_perm' => 'share_item'
    ));
    if ( !$hasPermission )
    {
    // Si no los tiene redirigimos a la página para solicitarlos
    header( "location: http://www.facebook.com/authorize.php?api_key=".$appapikey."&v=1.0&ext_perm=share_item");
    }
    else
    {
    // si los tiene seguimos con la acción para publicar el link
    }

    /**********************************************/

    luego cambio el api y el secret... lo pruebo por facebook y me arroja un error.

    /**********************************************/
    Error al cargar la página de VotaFoto
    La URL http://XXXXXX/facebook/?auth_token=8947e225338e7cc78787fff044071004&installed=1 ocasionó demasiadas redirecciones.

    Todavía hay algunos problemas que Facebook y los creadores de VotaFoto están intentando solucionar. Agradeceremos tu paciencia mientras intentamos reparar dichos inconvenientes. El error ha sido registrado , si persiste, por favor, vuelve a intentarlo en otro momento. ¡Gracias!

    /**********************************************/

    ojala me puedas ayudar en esto :)

    saludos

    • ikhuerta dice:

      Hola Daniel,

      Cuando hice estas pruebas no me dió errores. Puedes Probar a pasarle también los paraemtros "next" y "next_cancel" para que cuando se den los permisos reenvie de nuevo a donde tu quieres. La verdad es que esto código era más por mostrar la forma de comprobar los permisos y ordenar las inserciones que por la petición de los permisos y si que ha quedado un poco cojo ese tema.

      He publicado un post dedicado a esto. Ahora en época de vacaciones me es difícil volver a hacer pruebas con este sistema pero lo miraré en cuanto pueda.

      Pedir permisos a un usuario con Facebook Api

  3. Gracias por la respuesta... veré si resulta

    Saludos

  4. KarlanKas dice:

    Muchísimas gracias!! Este post vale su peso en oro!!

  5. KarlanKas dice:

    Para evitar lo de las redirecciones se puede usar fb:redirect (de FBML) en vez de header location:

    http://wiki.developers.facebook.com/index.php/Fb:redirect

  6. ikhuerta dice:

    Gracias KarlanKas,

    Se me hace raro tener que llegar a la capa HTML para poder hacer un simple redirect pero si evitas asi las alertas de error de Facebook pues bienvenido sea este sistema. Lo probaré en cuanto pueda y actualizo los posts.

    De nuevo gracias.

  7. luciano dice:

    hola tengo una duda,quiero usar el (Enviando notificaciones de parte de un usuario a sus amigos)
    como hago para que cuando alguien se una a mi aplicacion aparesca una notificacion en los facebook de todos sus amigos ,porque mi aplicacion es una pagina web , se puede colocar la api en el html ?
    gracias .

  8. ikhuerta dice:

    Buenas luciano,

    Para poder usar esta parte de la api tienes que lanzarla desde el servidor, si solo usas html la unica forma sencilla es con los links de fbml pero no es una forma muy cómoda.

    Para hacerlo desde servidor tienes dos formas:

    - Dentro de una app, simplemente tienes que usar la api como se explica en el post.

    - Y fuera (en tu propia web) necesitarás usar Facebook Connect. Hay también artículos sobre eso en este blog: http://blog.ikhuerta.com/como-usar-facebook-connect-en-nuestras-webs
    Una vez tengas al usuario conectado con FaceBook Connect, crear notificaciones es igual de sencillo que en una app:

    $facebook->api_client->notifications_send($users_ids, 'Te he dejado una notificación con la API de Facebook', 'user_to_user');

    Donde $users_ids es un array con todos los ids de usuario en los que quieres poner la notificación. Ese array también lo sacas con la api:

    http://blog.ikhuerta.com/api-de-facebook-mostrar-datos-de-los-usuarios-en-tus-aplicaciones

  9. luciano dice:

    muchas gracias :) ,me podre a leer , yo lo que queria hacer es que por ejemplo,ust me tiene como amigo ,y usa mi aplicacion ,entonces cuando entre me llege ami que "ikhuerta ah entrado a x juego" pero no solo ami sino que le llege a todos los amigos que tiene ust en su facebook.Asi mas gente puede utilizar el juego y creece su popularidad :)

    Me podria agregar a mi mail porfavor porque me encantaria poder aprender a utilizar bien todo este tema de api´s.Mi mail es

    chavo.toledo@hotmail.com

  10. luciano dice:

    hola nuevamente , perdona que te estoy molestando tanto.
    estube poniendo en practica lo que dice en el post:

    http://blog.ikhuerta.com/como-usar-facebook-connect-en-nuestras-webs

    de :
    Parte técnica 1: ¿cómo integrar la API javascript en nuestro site?

    coloque todo como dice ahi pero tengo un par de problemas ,
    cuando hago lo que dice el paso 3 y entro a la pagina no me aparece el boton de conectar a facebook,pero a los 5 segundos masomenos de haber entrado me redirecciona a facebook diciendo que
    ==========================================================
    Entrar en Facebook
    Clave API especificada no válida.

    La aplicación a la que deseas acceder no existe o ha sido inhabilitada.
    ===========================================================

    si me podrias ayudar te lo agradeseria :)

  11. ikhuerta dice:

    Hola de nuevo,

    Para dudas tan concretas sobre el uso de la Api te recomendaría el foro oficial de facebook developers:

    http://forum.developers.facebook.com/

    Si no se te da bien el inglés también hay foros en español pero de un nivel a veces un poco menor:

    http://www.google.es/search?hl=es&tbo=1&tbs=frm%3A1&q=facebook+api&meta=lr%3Dlang_es&aq=f

    Yo no uso la API uso en mi día a día (solo para cosas pequeñas) y no creo que pueda ayudarte al mismo nivel que esta gente para casos concretos.

    Un saludo.

  12. luciano dice:

    muchas grax vere si logro encontrar mas info :)

  13. Kiki dice:

    Utilizo facebook connect para conseguir los permisos, lo cual me sale sin problemas, el asunto viene cuando utilizo los diversos codigos propuestos que requieren de permisos para ya sea, escribir en el muro, cambiar el status, etc. Según he investigado , al parecer facebook cambio algo en sus librerias y por eso el error es generalizado, pero hago los supuestos cambios y aun no me sale y ya me estoy volviendo loka!, que puede ser hacer?... alguien ha tenido suerte con todo esto?... por favor recomiendenme!!!

  14. ikhuerta dice:

    Hola kiki, ignoro si se han cambiado cosas porque no uso demasiado el codigo...

    El caso es que haya los cambios que haya, si descargas la ultima version de la clase PHP para facebook y en ella lanzas directamente el metodo de lo que quieres hacer, por ejemplo:

    $facebook->api_client->status_set('Mi Nuevo Status','');

    ...debería dejarte hacerlo sin problemas. No tiene sentido que no sea así.

    En caso de que falle cualquier cosa, la clase al estar en php5 lanza una excepción. Así, si cualquier cosa falla, recogiendo la excepcion y tratandola en dentro del catch deberías poder ver porque está fallando exactamente: que linea, con que mensaje de error, etc... Sorry, no tengo tiempo ahora de revisar que todos estos métodos funcionen pero prometo actualizar el post tan pronto como me sea posible.

    Un saludo.

  15. gaboelnuevo dice:

    hola muy buen post de casualidad ¿sabes como postear en el muro de varios usuarios a la vez? ¿hay alguna forma de incluir varias ids en la variable $target_id?

  16. chavo toledo dice:

    hola queria hacerte una pregunta ,tengo una web donde la gente puede ponerle fondos a su facebook, quisiera saber si existe la posibilidad con facebook connect puesto en mi web, de que cuando una persona haga click sobre el boton instalar del fondo que eligieron , se publique algo en su muro diciendo por ejemplo "juancito ah instalado el fondo para facebook..." , osea digo de agregarle algun script o algo.
    si me ayudarias te lo agradeceria a montones :)

  17. Augusto dice:

    Hola

    queria consultarte sobre esto:

    / Definimos los datos adjuntos al mensaje publicado
    $attachment = array(
    // Nombre dado al adjunto
    'name' => 'Mi adjunto',
    // Link al que lleva el nombre
    'href' => 'http://blog.ikhuerta.com',
    // Descripción que lo acompaña en color gris
    'description' => 'a funny looking cat',
    // Nombre de la captura (sin documentacion)
    'caption' => '{*actor*} rated the lolcat 5 stars',
    // Propiedades extra (sin documentacion)
    'properties' => array(
    'category' => array(
    'text' => 'humor',
    'href' => 'http://www.icanhascheezburger.com/category/humor'
    ),
    'ratings' => '5 stars'
    ),
    // contenido multimedia
    // Tipos y datos: http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29
    'media' => array(
    // un array por elemento a incluir
    array(
    // tipo imagen
    'type' => 'image',
    // url de la imagen
    'src' => 'http://icanhascheezburger.files.wordpress.com/2009/03/funny-pictures-your-cat-is-bursting-with-joy1.jpg',
    // link de la imagen
    'href' => 'http://icanhascheezburger.com/2009/04/22/funny-pictures-bursting-with-joy/'
    )
    ),
    'latitude' => '41.4',
    'longitude' => '2.19'
    );

    // definimos los links que debe llevar el mensaje
    $action_links = array(
    array(
    'text' => 'Recaption this',
    'href' => 'http://mine.icanhascheezburger.com/default.aspx?tiid=1192742&recap=1#step2'
    )
    );

    // lanzamos la orden para mandar la publicación
    $facebook->api_client->stream_publish($message, $attachment, $action_links);

    donde esta la ultima linea ,la variable $message
    donde esta definida?

  18. Luis Alberto dice:

    No comprendo lo intrincado y difícil que lo ponen a la hora de requerir la contraseña. Pongo la que que he usado desde el principio hacen dos(2)años y me la rechazan, una y otra vez: He solicitado como cambiarla y tambien eso es má difícil que la fórmula unitaria universal.
    Parece que tendré que renunciar tanto Facebook como a Google.
    Es Lamentable estos imposibles de Google Y Facebook.
    Gracias Luis Alberto Chandeck Alvarez.

  19. Ludo dice:

    Hola ! Gracias por este tutorial.
    Tengo un problema : con este ;
    $status = 'está haciendo un Odiámame. Míralo en el link : ';
    $update_status = $facebook->api_client->links_post($url,$status);

    El estatu sale en la pagina de facebook sin los "á í.
    Tampoco sale bien si pongo :
    $status = 'está haciendo un Odiámame. Míralo en el link : ';

    Tienes algun idea ??

    Gracias.

    Ludo

  20. ikhuerta dice:

    La verdad es que no he tenido problemas de ese tipo: trabajas en uft8? has probado a enviar los enlaces codificados ( & oaute ; )

  21. chavo dice:

    hola , tengo una duda.
    Estoy armando una aplicacion y lo que quiero es que cuando el usuario acepte los permisos se le publique en su muro un texto , la parte de los permisos ya la solucione , pero no puedo lograr publicar el texto en el muro.
    por ejemplo , cuando pego el codigo ( $facebook->api_client->status_set('Mi Nuevo Status',''); )
    en mi web no me lo registra como "codigo" y me aparece como si fuera un texto comun,

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

    el codigo :

    $facebook->api_client->status_set('Mi Nuevo Status','');
    es necesario que este entre o algo por el estilo?

    --------------------------------------------------------------------
    Todo esto lo tengo alojado en un hosting online , tengo que subir algun otro archivo para que me funcione lo de publicar en el muro?

    espero su respueta , muchas gracias :)

  22. ikhuerta dice:

    Hola,

    El problema que comentas no tiene absolutamente nada que ver con facebook sino con PHP. Estás poniendo PHP en zonas que no se está interpretando.

    Vigila que tu hosting interprete PHP correctamente y que todas las sentencias queden entre < ?php y php?> o te pasará lo que comentas.

    Por otro lado te recomiendo que dejes de usar la api antigua de facebook, al principio de este post encontrarás links a otros posts que explican la nueva.

  23. chavo dice:

    Muchas gracias , al final era problema de hosting , ya lo solucione :)

    Ahora me surgio otra duda jajaja, lo que lo que estoy intentando hacer es cargar imagenes en el perfil de la persona.
    por ejemplo:

    * Acepta los permisos de la aplicacion ( ya lo tengo resuelto )

    * Se crea un album nuevo ( no se como hacer )

    * En ese album se sube 1 foto ( no se como hacer )

    Espero que puedas ayudarme por favor , gracias :)

  24. nicolas dice:

    La verdad que muy bueno el post y el de graph tambien , estube leyendo y haciendo varias aplicaciones pero tengo una duda inminente que no puedo solucionar , mi duda es , usando graph api y usando tu otro tutorial de http://blog.ikhuerta.com/crear-una-aplicacion-con-facebook-graph-api-en-modo-iframe que codigo tengo que poner para que la aplicacion al extender los permisos pueda mandar mensaje a muros de los amigos de usuario? , mil gracias por la info de tu blog

    saludos

  25. ikhuerta dice:

    Buenas nicolas,

    Todo lo explicado en este post ya está desfasado. Basate en lo explicado en el tutorial que tu mismo indicas y en el mismo tutorial para fbml. Sobre tu duda mira los comentarios de esos posts ya que ahi se resuelve esto y otras cosas que te encontrarás.

Anímate y deja tu comentario

Esto son experimentos, no preguntes ;) prueba metadescription Prueba title