programamar_votaciones_facebook

Programar un sistema de votaciones para un concurso o promoción basándonos en Facebook tiene más ventajas aparte de la de facilitar al usuario votar sin tener que registrarse en nuestra web. Utilizando la API que el propio Facebook pone a nuestra disposición podremos imponer como requisito que el usuario haga me gusta en nuestra página de Facebook antes de votar o que publique una actualización en su muro con un enlace recomendándonos.

Ventajas de utilizar Facebook para votar

A continuación detallo algunas de las ventajas que este sistema nos aporta:

  • Una de las principales ventajas de utilizar Facebook para identificar al votante es que no tendremos que preocuparnos de registrar ni posteriormente validar el email ni los datos del usuario porque Facebook ya se encargó de eso en el proceso de alta. Es cierto que pueden existir (y existen) usuario falsos de Facebook, pero aún así, su sistema de validación sigue siendo muchísimo mejor que cualquiera que nosotros pudiéramos programar.
  • Como decíamos antes, esto conlleva que el usuario no necesita volver a introducir sus datos en nuestra web y le resultará más rápido y fácil emitir su voto.
  • Utilizar la API de Facebook nos abre un mundo de posibilidades: la más utilizada nos permite saber si el usuario es fan de nuestra página de facebook y mostrarle así uno u otro contenido, lo que seguro nos ayudará a captar un nuevo «me gusta».

Descargamos la SDK para Facebook

En la sección developers encontramos las instrucciones para descargar e instalar la SDK para PHP. Es imprescindible haber dado de alta previamente una aplicación de Facebook, ya que necesitaremos la APP-ID y la APP-SECRET de la misma para poder utilizar la API. Al crear una instancia de la clase Facebook, le pasaremos al constructor esos dos parámetros.

El archivo index.php

En archivo principal será el encargado de conducir a nuestro usuario para completar los pasos requeridos antes de votar:

  1. Conectarse a Facebook a través de nuestra aplicación y aceptar los permisos.
  2. Hacerse fan de nuestra página de Facebook (tendremos que mostrar un enlace y sugerirle que haga clic en Me Gusta, ya que la API no permite automatizar el proceso de publicar Me Gusta para páginas de Facebook.
  3. Ya que el usuario es fan, comprobamos si puede votar (si no ha emitido su voto todavía, por ejemplo) y mostramos el botón «Votar».
  4. El código para procesar el voto irá en el archivo votar.php que más adelante detallaré.

Para controlar si el usuario es fan o no de nuestra página, necesitaremos el ID de Facebook de la misma. Para averiguarlo basta con introducir la URL de la página aquí.

Así, el código del archivo index.php quedaría como sigue:

 'APP_ID_DE_NUESTRA_APLICACION','secret'=>'SECRET_DE_NUESTRA_APLICACION'));
$uid = $facebook->getUser();
if($uid==0)
{
 //No hay usuario identificado, mostramos el login
 $params = array(
   //'scope' => 'read_stream, friends_likes, user_likes, publish_actions',
   'scope' => 'read_stream, friends_likes, user_likes',
   'redirect_uri' => 'URL_A_LA_QUE_VOLVER_DESPUES_DEL_LOGIN'
 );
 $loginUrl = $facebook->getLoginUrl($params);
 
 echo("Conectar con Facebook");
}
else
{
 //El usuario ya ha conectado, mostramos el contenido
 //Botón de logout para permitirle al usuario desconectar
 $params = array(
 'next' => 'URL_A_LA_QUE_VOLVER_DESPUES_DEL_LOGOUT'
 );
 $logoutUrl = $facebook->getLogoutUrl($params);
 echo("Cerrar sesión");
 try {

 $user_profile = $facebook->api('/me','GET');
 $idusuario=$user_profile['id'];
 
 //Vemos si ya le ha dado a Me Gusta en nuestra página 
 
 $checkMeGusta =  $facebook->api(array(
 "method"    => "fql.query",
 "query"     => "select uid from page_fan where uid=me() and page_id=ID_PAGINA_FACEBOOK"
 ));
 
 if( sizeof($checkMeGusta) == 1 )
 {
 //Le ha dado a ME GUSTA, podemos mostrar el botón de voto
 //Veamos si ya ha votado esta opcion
 //La función checkvoto controla si ese usuario ya ha votado esa opción.
 
 if(checkvoto($idvotado,$idusuario))
 {
 //No ha votado, mostramos el boton Votar
 echo("Votar");
 }
 else
 {
 //Ya ha votado, mostramos el YA HAS VOTADO
 echo("Ya has votado");
 }
 }
 else
 {
 //Si no le ha dado a ME GUSTA a nuestra Página
 echo("Hacer clic en ME GUSTA");
 }
 } catch(FacebookApiException $e) {
 // Algo ha salido mal, mostramos el Login nuevamente seguido del error
 
 $loginUrl = $facebook->getLoginUrl($params);
 
 echo("Conectar con Facebook");
 error_log($e->getType());
 error_log($e->getMessage());
 }
}

function checkvoto($idvotado,$idusuario)
{
 /**
 *Devuelve true si el usuario puede votar (no ha votado previamente) y false en caso contrario
 *El contenido de esta función dependerá del tipo de concurso, criterios de votos, tipo de concurso...
 **/
}
?>

El archivo votar.php

Mediante este archivo recogeremos el idvotado que recibimos por GET y el idusuario que sacaremos de la API para tratarlo con la correspondiente función emitirvoto().

 'APP_ID_DE_NUESTRA_APLICACION','secret'=>'SECRET_DE_NUESTRA_APLICACION'));
 
 //Capturamos el id de lo que estamos votando
 $idvotado=$_GET['idvotado'];

 $uid = $facebook->getUser();
 if($uid==0)
 {
 //Ha ocurrido un error en el proceso
 echo('No estás identificado en Facebook');
 }
 else
 {
 try {
 $user_profile = $facebook->api('/me','GET');
 $idusuario=$user_profile['id'];
 if(emitirvoto($idvideo,$idusuario,date('Y-m-d')))
 {
 //Posteamos en el muro del usuario un mensaje promocionando el concurso
 //CUIDADO: según FB hay que darle la opción al usuario de omitir este paso
 $post_url = '/'.$user_profile['id'].'/feed';
 $msg_body = array(
 'link' => 'http://www.nuestra_web.com',
 'message' => utf8_encode('Acabo de votar en el concurso ¡Vota tú también!')
 );
 $postResult = $facebook->api($post_url, 'post', $msg_body );
 
 //Mostramos el resultado
 echo("Gracias por tu voto");
 }
 else
 {
 echo('Ha ocurrido un error al votar. Posiblemente ya hayas votado antes con este ususario de Facebook.');
 }
 }
 catch (FacebookApiException $e) {
 echo $e->getMessage();
   }
 }
 
 function emitirvoto($idvideo,$idusuario,$fecha)
 {
 //Función que controla y graba los votos emitidos
 //Si el proceso va bien devuelve true
 //Si algo va mal o el usuario ya ha votado, devuelve false
 }
?>

Conclusiones

Una vez que se pierde el miedo a programar con el SDK y la API de Facebook podemos profundizar mucho más en posibles aplicaciones de uso.

Hemos obviado el paso de crear una aplicación en Facebook, pero es más que probable que, si el tiempo lo permite, pronto escribamos un post explicando cómo hacerlo.

Cualquier duda o mejora que tengáis, os invito a dejarla en los comentarios.

DESCARGAS

Los archivos de este manual están disponibles en el repositorio de Github

https://github.com/davidmerinas/votarconfb