Cómo acceder a la API de Facebook con Java y Spring Boot

Poder acceder a las API de las principales plataformas de redes sociales se puede utilizar como una herramienta poderosa y útil. Afortunadamente, no es difícil hacerlo, especialmente usando Sp...

Visión general

Poder acceder a las API de las principales plataformas de redes sociales se puede utilizar como una herramienta poderosa y útil. Afortunadamente, no es difícil hacerlo, especialmente usando Spring Boot, y más precisamente, el módulo Sociales de primavera.

Spring Social ofrece cuatro proyectos principales:

  • Núcleo social de primavera
  • Primavera Social Facebook
  • Twitter social de primavera
  • Primavera Social LinkedIn

Cada uno de estos proyectos proporciona herramientas para comunicarse con sus respectivas API.

En este tutorial, confiaremos en primavera redes sociales facebook para crear una aplicación simple que autentique y autorice a un usuario, y luego muestre ellos su propio feed de Facebook.

Requisitos previos

Hay dos cosas necesarias para que este proyecto funcione.

Aplicación Spring Boot

Comenzaremos con una aplicación Spring Boot de estado predeterminado. Afortunadamente, usando Spring Initializr o incluso el complemento integrado Idea de IntelliJ Spring Initializr, podemos obtener fácilmente un proyecto de esqueleto para construir.

Cualquiera que sea la opción que elija, seleccione las dependencias Web y Thymeleaf, agregaremos las otras más adelante.

inicialización de primavera

Desarrolladores de Facebook

Además, para que Spring Social pueda comunicarse con la API de Facebook, requiere una aplicación de Facebook.

Para poder crear una Aplicación de Facebook, debe tener una cuenta de Desarrollador de Facebook.

Una vez que se haya registrado, puede agregar una nueva aplicación. Solo requiere un nombre y una dirección de correo electrónico de contacto y se ve así:

desarrolladores de facebook

Al abrir la pestaña de configuración después de seleccionar su aplicación, obtendrá la información necesaria para configurar la conexión entre Spring Social y su aplicación, como "ID de aplicación" y "Secreto de aplicación".

Dependencias Maven

Suponiendo que haya configurado correctamente su aplicación Spring Boot, ahora podemos agregar el resto de las dependencias necesarias:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
    
  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.190</version>
  </dependency>
    
  <dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-facebook</artifactId>
    <version>3.0.0.M1</version>
  </dependency>
    
  <dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-core</artifactId>
    <version>2.0.0.M2</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-config</artifactId>
    <version>2.0.0.M2</version>
  </dependency>
    
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
</dependencies>

Se incluye una dependencia para Base de datos H2 simplemente porque Spring Boot requiere una fuente de datos, y es más fácil proporcionar una para eso.

Acceso a la API de Facebook

Habilitación de Facebook {#habilitación de Facebook}

Se requiere una conexión entre su aplicación Spring y la aplicación de Facebook para continuar.

Para configurar la conexión, abra el archivo application.properties ubicado en src/main e ingrese:

1
2
spring.social.facebook.appId = // your application ID
spring.social.facebook.appSecret = // your application secret

La definición de estas dos propiedades alerta a Spring Social Facebook y configura dos beans cruciales para nuestra aplicación.

  • ConnectController: esta clase administra el flujo de conexión de la cuenta al proveedor de servicios y maneja todas las solicitudes relacionadas con Facebook.
  • FacebookConnectionFactory - La implementación de Facebook de Spring [Fábrica de conexiones](https://docs.spring.io/spring-social/docs/1.0.3.RELEASE/api/org/springframework/social/connect/ConnectionFactory .html) clase. Proporciona un conjunto de métodos para crear <a rel=nofollow" target="_blank" href="https://docs.spring.io/spring-social/docs/1.0.3.RELEASE/ api/org/springframework/social/connect/Connection.html">Instancias de Connection para Facebook.

Creación de una conexión

Como se mencionó anteriormente, el ConnectController es la fuerza de trabajo principal en esta área. Este controlador manejará nuestras solicitudes GET cuando queramos conectarnos a Facebook. Solo requiere dos vistas simples para funcionar correctamente: connect/facebookConnect y connect/facebookConnected.

Facebook se puede sustituir aquí con cualquier otra ID de proveedor, como 'twitter', en cuyo caso requeriría connect/twitterConnect y una vista connect/twitterConnected.

Definamos estas vistas nosotros mismos:

conexion a Facebook:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html xmlns:th="www.thymeleaf.org">
<head>
    <!-- Bootstrap core CSS -->
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
    <title>Spring Boot Facebook Application</title>
</head>

<body>
<!-- Page Content -->
<div class="container">
    <div class="row">
        <div class="col-lg-12 text-center">
            <h1 class="mt-5">Connect to Facebook:</h1>
            <p class="lead">By clicking connect, you will be asked to authorize the application.</p>

            <form action="/connect/facebook" method="POST">
                <input type="hidden" name="scope" value="user_posts"/>

                <button class="btn btn-default" type="submit">Connect</button>
            </form>
        </div>
    </div>
</div>
</body>
</html>

facebookConectado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html xmlns:th="www.thymeleaf.org">
<head>
    <!-- Bootstrap core CSS -->
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
    <title>Spring Boot Facebook Application</title>
</head>

<body>
<!-- Page Content -->
<div class="container">
    <div class="row">
        <div class="col-lg-12 text-center">
            <h1 class="mt-5">Connected successfully!</h1>
            <p class="lead">Welcome to facebook!</p>

            <p>You can now browse your own feed <a href="/feed">here</a>.</p>
            <p>You can also see your friend list <a href="/friends">here</a>.</p>
        </div>
    </div>
</div>
</body>
</html>

Una vez que haga clic en "Conectar" en la primera vista, el formulario enviará una solicitud POST para que la maneje nuestro ConnectController, y se iniciará la autorización OAuth.

Recuperación de datos de Facebook

Con una conexión de Facebook completamente configurada, podemos continuar y escribir nuestro controlador principal:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Controller
public class MainController {
    private Facebook facebook;
    private ConnectionRepository connectionRepository;

    public MainController(Facebook facebook, ConnectionRepository connectionRepository) {
        this.facebook = facebook;
        this.connectionRepository = connectionRepository;
    }

    @RequestMapping(value = "feed", method = RequestMethod.GET)
    public String feed(Model model) {

        if(connectionRepository.findPrimaryConnection(Facebook.class) == null) {
            return "redirect:/connect/facebook";
        }

        User userProfile = facebook.userOperations().getUserProfile();
        model.addAttribute("userProfile", userProfile);
        PagedList<Post> userFeed = facebook.feedOperations().getFeed();
        model.addAttribute("userFeed", userFeed);
        return "feed";
    }
}

Este controlador funciona de manera simple. Requiere que inyectemos Facebook y ConnectionRepository en su constructor. La clase Facebook proporciona métodos básicos para la interacción con Facebook, mientras que la clase ConnectionRepository, como su nombre lo indica, es una interfaz de acceso a datos para objetos Connection.

La anotación @RequestMapping define dos cosas: el valor y el método:

  • Valor - Corresponde al parámetro de la solicitud que deseamos mapear.
  • Método - Corresponde al tipo del método HTTP esperado.

connectionRepository.findPrimaryConnection(Facebook.class) solo será nulo si el usuario no autorizó nuestra aplicación para recuperar datos de Facebook. Si este es el caso, la aplicación simplemente regresa a /connect/facebook.

El objeto Usuario de la API de Spring Social Facebook se utiliza para almacenar los datos de nuestro usuario. Este objeto puede contener toda la información pública del usuario, como el nombre y apellido, rango de edad, cumpleaños, ciudad natal, dirección de correo electrónico, etc.

Luego creamos una PagedList de Publicaciones que corresponde al propio feed del usuario y la agregamos como un atributo de modelo a nuestra vista.

Ahora necesitamos definir la vista en la que renderizamos esta información con hoja de tomillo.

feed.html:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html xmlns:th="www.thymeleaf.org">

<head>
    <!-- Bootstrap core CSS -->
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
    <title>Spring Boot Facebook Application</title>
</head>
<body>
    <div class="container">

        <h3 class="mt-5">Welcome, <span th:text="${userProfile.name}"></span>!</h3>

        <h4 class="mt-5">Facebook Feed:</h4>
        <div class="row">
            <div class="col-lg-12 text-center" th:each="post:${userFeed}" style="border:1px">
                <b class="lead" th:text="${post.from.name}">from</b> posted:
                <p class="lead" th:text="${post.message}">message text</p>
                <img th:if="${post.picture}" th:src="${post.picture}" class="img-thumbnail"/>
                <hr>
            </div>
        </div>
    </div>
</div>
</body>
</html>

Nota: Desde la versión 2.0 de Facebook, se eliminó la capacidad de recuperar una lista de amigos de Facebook. Esta funcionalidad ya no es compatible con Facebook y tratar de obtener una lista de amigos en Spring simplemente devolverá una lista vacía.

Y con eso, se concluye esta aplicación. Ejecutémoslo y veamos el resultado.

Demostración de la aplicación

Después de implementar la aplicación e ir a localhost:8080/connect/facebook, nuestra aplicación nos saluda y nos pide que nos conectemos:

conectar

Al conectarnos somos redirigidos a Facebook, pidiéndonos permiso para proporcionar nuestros datos a esta aplicación:

autorizar

Al seleccionar "Continuar", autenticamos la aplicación y somos redirigidos a nuestra vista facebookConnected.html.

Desde aquí, podemos visitar nuestro feed:

conectado

Visitar nuestro feed nos muestra algunas de nuestras últimas publicaciones:

feed

Funcionalidades adicionales

Spring Social no termina ahí. Hay muchas otras funcionalidades que ofrece además de verificar su feed:

  • AchievementOperations: proporciona operaciones para los logros de Facebook.
  • CommentOperations: proporciona operaciones CRUD para comentarios.
  • EventOperations: proporciona operaciones CRUD para eventos, así como invitaciones.
  • FeedOperations - Recuperación y publicación en un muro de Facebook.
  • FriendOperations - Recuperación de listas de amigos.
  • GroupOperations - Recupera información de grupos (miembros, detalles, etc.)
  • LikeOperations - Recuperación y realización de Me gusta en publicaciones, páginas, etc.
  • MediaOperations: proporciona operaciones CRUD para medios como fotos, videos y álbumes.
  • OpenGraphOperations - Proporciona operaciones para la API OpenGraph de Facebook.
  • PageOperations - Proporciona operaciones para las páginas de Facebook.
  • SocialContextOperations - Proporciona operaciones para el contexto social de un usuario.
  • TestUserOperations: proporciona operaciones para crear y usar usuarios de prueba.
  • UserOperations - Recuperar información del usuario.
  • RestOperations: se usa para colocar un encabezado de autorización de OAuth para tokens de acceso enviados a través de solicitudes.

Cada uno de estos proporciona conjuntos de métodos para su propósito designado y, en conjunto, se pueden usar para crear herramientas poderosas.

Cubrir todo esto estaría fuera del alcance de este blog, por lo que cubriremos solo los más importantes y útiles, como publicar en muros, leer feeds, etc.

Recuperación de otros perfiles

Al igual que hicimos cuando recuperamos nuestros propios datos, también podemos recuperar datos de otros usuarios pasando su ID como parámetro:

1
2
// Retrieves authenticated user's profile
User profile = facebook.userOperations().getUserProfile();
1
2
// Retrieves the user's profile whose id is 4.
User profile = facebook.userOperations().getUserProfile(4);

Dato curioso: la identificación con el valor numérico '4' pertenece a Mark Zuckerberg y todas las identificaciones anteriores a esta fueron cuentas de prueba en los primeros días de Facebook.

Estados de publicación

Publicar en su feed es tan fácil como llamar a un solo método con un parámetro String. Pero tenga en cuenta que solo puede publicar en las fuentes de los usuarios que autentican la aplicación, y ellos no pueden publicar en los muros de sus amigos.

Es posible que quieras usar esto para escribir servicios automatizados como IFTT o Buffer:

1
facebook.feedOperations().updateStatus("Hello World!!!");

Esto simplemente publicará un solo estado con la ‘Cadena’ que ingresó.

Otra forma de publicar un estado es publicar un enlace:

1
2
FacebookLink facebookLink = new FacebookLink("link", "name", "caption", "description");
facebook.feedOperations().post("Posting a link!", facebookLink);

Publicación en el feed de un amigo

Facebook eliminó esta función en 2013.

Recuperación de una lista de amigos

Facebook eliminó esta funcionalidad en 2014.

Conclusión

En este tutorial, nos sumergimos en Spring Social y, más precisamente, en el proyecto Spring Social Facebook.

Creamos una cuenta de desarrollador de Facebook y una aplicación Spring Boot con una conexión a nuestra aplicación de Facebook.

Posteriormente, exploramos algunas de las funcionalidades del proyecto de Facebook por nuestra cuenta, así como algunas otras funcionalidades que ofrece esta API.

El código fuente de este proyecto está disponible en GitHub.