[Facebook SDK .NET] Buscar amigos (VI)

La sexta entrega la vamos a dedicar a ver la forma de buscar en facebook, para por ejemplo buscar amigos, eventos, grupos… Para ello necesitamos el token de acceso y vamos a usar la librería Facebook SDK .NET con Graph API.

Vamos a recordar la hoja de ruta de esta serie de artículos

1. Crear aplicación Facebook.

2. Obtener Token de acceso.

3. Graph API

4. Obtener información básica de una cuenta facebook.

5. Obtener la lista de amigos

6. Buscar Amigos (actual)

7. Obtener las publicaciones del muro

8. Publicar una nueva entrada en el muro

Para buscar entidades en facebook, hemos implementado el método BuscarAsync de la clase smpFacebookApi, el cual tiene 2 sobrecargas:

– BuscarAsync(string query): busca usuarios en base a la petición especificada en el parámetro query.

– BuscarAsync(string query, TipoEntidadBusqueda tipo, int numResultadosPagina = 10): busca entidades  del tipo especificado, en cuyo nombre aparezca la cadena buscada y por defecto retorna 10 resultados por página.

        public async Task<Busqueda> BuscarAsync(string consulta, TipoEntidadBusqueda tipo, int numResultadosPagina = 10)
        {

            if (string.IsNullOrEmpty(consulta))
                throw new ArgumentException("consulta");

            return await BuscarAsync(string.Format(@"search?q={0}&type={1}&limit={2}", consulta, tipo.ToString(), numResultadosPagina));

        }
        public async Task<Busqueda> BuscarAsync(string query)
        {
            InfoUsuario datosUsuario = new InfoUsuario();
            Busqueda resultadoBusqueda = new Busqueda();

            if (string.IsNullOrEmpty(this.TokenAcceso))
                throw new Exception("No ha ha definido smpFaceBookApi.TokenAcceso");

            Facebook.FacebookClient clienteFB = new Facebook.FacebookClient(this.TokenAcceso);

            dynamic resultado = await clienteFB.GetTaskAsync(query);
            if (resultado != null)
            {
                foreach (dynamic amigo in resultado.data)
                {
                    datosUsuario = await ObtenerInfoUsuarioAsync(amigo.id);
                    resultadoBusqueda.lstResultados.Add(datosUsuario);
                }
                if (resultado.paging != null)
                {
                    if (!string.IsNullOrEmpty(resultado.paging.next))
                    {
                        resultadoBusqueda.PaginaSiguiente = resultado.paging.next;
                    }
                    if (!string.IsNullOrEmpty(resultado.paging.previous))
                    {
                        resultadoBusqueda.PaginaAnterior = resultado.paging.previous;
                    }

                }
            }
            return resultadoBusqueda;
        }

Como se puede ver el código anterior realiza la siguientes operaciones:

1. Comprueba que se haya definido el token de acceso

2. Se crea una instancia de la clase FacebookClient, y se invoca el método GetTaskAsync, al cual se pasa como parámetro la petición de búsqueda con el siguiente formato:

/search?q=<VALOR_BUSCAR>&type=<TIPO>&limit=<LIMITE>

donde los parámetros son:

– “q“: contiene el texto a buscar

 limit” indica el número de resultados a recuperar. Si no se indica, el valor por defecto es 25.

– “type” el tipo de objeto a buscar. Otros posibles valores para type son post, page, group, place, checkin, event…

En la siguiente imagen podemos ver los resultados usando Graph API Explorer

facebook_client_parte3_graph_api_explorer_buscar

como podemos observar, la respuesta es una cadena JSON que incluye:

– data: es un array donde se incluyen los resultados, de forma que para cada uno se incluye el nombre y el id.

– paging: este contiene los enlaces necesarios para un sistema de paginación, incluyendo el campo “next” y “previous” (en el ejemplo, solo tenemos next, porque es la primera página)

3. Se recorre el array data, y por cada elemento se invoca al método ObtenerInfoUsuarioAsync, guardando los resultados en una lista. Realmente este paso este opcional, ya que las peticiones adicionales provocarán que el método sea procesado más lentamente.

4. Los enlaces del campo paging también son guardados para proporcionar una forma de implementar un sistema de paginación.

5. Por último, se retorna una instancia del tipo Busqueda

    public class Busqueda
    {
        public List<InfoUsuario> lstResultados { get; set; }
        public string PaginaSiguiente { get; set; }
        public string PaginaAnterior { get; set; }

        public Busqueda()
        {
            lstResultados = new List<InfoUsuario>();
        }
    }

En la siguiente imagen se puede ver el aspecto del proyecto de ejemplo para WinRT.

facebook_client_parte6_winrt

En el siguiente enlace se puede descargar el código de ejemplo.