Crear, actualizar o eliminar Google Calendar en Java

Google Calendar es un servicio de programación que le permite crear y realizar un seguimiento de eventos como reuniones. Puede registrar los eventos en el calendario y recibir recordatorios sobre los próximos. Google también le permite utilizar su servicio de calendario mediante programación. Por lo tanto, puede administrar sus eventos utilizando Google Calendars desde sus aplicaciones. En este artículo, aprenderá cómo crear, actualizar y eliminar Google Calendar mediante programación en Java.

API de Java para crear y manipular Google Calendar

Para trabajar con el servicio Google Calendar, utilizaremos Aspose.Email for Java. Es una potente API que proporciona una variedad de funciones para procesar correos electrónicos, trabajar con clientes de correo electrónico y utilizar los servicios de colaboración de Google. Puede descargar la API o instalarla usando las siguientes configuraciones de Maven.

Repositorio:

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>http://repository.aspose.com/repo/</url>
</repository>

Dependencia:

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-email</artifactId>
    <version>22.3</version>
    <classifier>jdk16</classifier>
</dependency>

Crear un calendario de Google en Java

Antes de comenzar, debe crear un proyecto en Google Developer Console para que su aplicación se comunique con los servicios de Google. Para crear uno, puede seguir esta guía.

Ahora, cree una clase auxiliar llamada GoogleOAuthHelper para encargarse de la autenticación de una cuenta de Google. Además, cree una clase denominada OAuthUser para almacenar la información del usuario. La siguiente es la implementación completa de ambas clases.

public class OAuthUser {
        String email;
        String clientId;
        String clientSecret;
        String refreshToken;
    }
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.xml.bind.DatatypeConverter;

/**
 * <p>
 * Consola de desarrolladores https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Documentación https://developers.google.com/identity/protocols/OAuth2InstalledApp
 * </p>
 */
class GoogleOAuthHelper {
    public static final String AUTHORIZATION_URL = "https://accounts.google.com/o/oauth2/v2/auth";
    public static final String TOKEN_REQUEST_URL = "https://oauth2.googleapis.com/token";
    public static final String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
    public static final String REDIRECT_TYPE = "code";
    public static final String SCOPE = "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" // Calendar
            + "+https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds%2F" // Contacts
            + "+https%3A%2F%2Fmail.google.com%2F"; // IMAP & SMTP

    static String createCodeChalange() {
        String verifierStr = UUID.randomUUID().toString() + "-" + UUID.randomUUID().toString();
        System.out.println("Code Verifier: " + verifierStr);

        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalAccessError(e.getMessage());
        }
        byte[] hash = digest.digest(verifierStr.getBytes(StandardCharsets.UTF_8));
        String base64Hash = DatatypeConverter.printBase64Binary(hash);

        base64Hash = base64Hash.split("=")[0];
        base64Hash = base64Hash.replace('+', '-').replace('/', '_');
        return base64Hash;
    }

    static String getAuthorizationCodeUrl(OAuthUser acc) {
        return getAuthorizationCodeUrl(acc, SCOPE, REDIRECT_URI, REDIRECT_TYPE);
    }

    static String getAuthorizationCodeUrl(OAuthUser acc, String scope, String redirectUri, String responseType) {
        System.out.println("---------------------------------------------------------");
        System.out.println("------------- OAuth 2.0 AuthorizationCodeUrl -------------");
        System.out.println("---------------------------------------------------------");
        System.out.println("Login: " + acc.email);
        String codeChallenge = createCodeChalange();

        String state = urlEncode(UUID.randomUUID().toString());
        String approveUrl = AUTHORIZATION_URL + "?client_id=" + acc.clientId + "&redirect_uri=" + redirectUri + "&response_type=" + responseType + "&scope=" + scope
                + "&code_challenge=" + codeChallenge + "&code_challenge_method=S256&state=" + state;

        System.out.println("Approve Url: " + approveUrl);
        return approveUrl;
    }

    static String urlEncode(String value) {
        try {
            return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
        } catch (UnsupportedEncodingException e) {
            throw new IllegalAccessError(e.getMessage());
        }
    }

    static String urlDecode(String value) {
        try {
            return URLDecoder.decode(value, StandardCharsets.UTF_8.toString());
        } catch (UnsupportedEncodingException e) {
            throw new IllegalAccessError(e.getMessage());
        }
    }

    static String getAccessTokenByAuthCode(String authorizationCode, String codeVerifier, OAuthUser user) {
        String encodedParameters = "client_id=" + urlEncode(user.clientId) + "&client_secret=" + urlEncode(user.clientSecret) + "&code=" + urlEncode(authorizationCode)
                + "&code_verifier=" + codeVerifier + "&redirect_uri=" + urlEncode(REDIRECT_URI) + "&grant_type=authorization_code";
        System.out.println("---------------------------------------------------------");
        System.out.println("------------- OAuth 2.0 AccessTokenByAuthCode -------------");
        System.out.println("---------------------------------------------------------");
        System.out.println("Authorization code: " + authorizationCode);

        String result = "";
        Map<String, String> token = geToken(encodedParameters);
        for (String key : token.keySet()) {
            System.out.println(key + ": " + token.get(key));
            if (key.equals("refresh_token")) {
                result = token.get(key);
            }
        }

        System.out.println("---------------------------------------------------------");

        return result;
    }

    static String getAccessTokenByRefreshToken(OAuthUser user) {
        String encodedParameters = "client_id=" + urlEncode(user.clientId) + "&client_secret=" + urlEncode(user.clientSecret) + "&refresh_token=" + urlEncode(user.refreshToken)
                + "&grant_type=refresh_token";
        System.out.println("---------------------------------------------------------");
        System.out.println("----------- OAuth 2.0 AccessTokenByRefreshToken -----------");
        System.out.println("---------------------------------------------------------");
        System.out.println("Login: " + user.email);

        String result = "";
        Map<String, String> token = geToken(encodedParameters);
        for (String key : token.keySet()) {
            System.out.println(key + ": " + token.get(key));
            if (key.equals("access_token")) {
                result = token.get(key);
            }
        }

        System.out.println("---------------------------------------------------------");

        return result;
    }

    static Map<String, String> geToken(String encodedParameters) {
        try {
            HttpURLConnection connection = (HttpURLConnection) new URL(TOKEN_REQUEST_URL).openConnection();
            connection.setRequestMethod("POST");

            byte[] requestData = encodedParameters.getBytes(StandardCharsets.UTF_8);

            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length", "" + requestData.length);

            final OutputStream st = connection.getOutputStream();
            try {
                st.write(requestData, 0, requestData.length);
            } finally {
                st.flush();
                st.close();
            }

            connection.connect();

            if (connection.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) {
                throw new IllegalAccessError("Operation failed: " + connection.getResponseCode() + "/" + connection.getResponseMessage() + "\r\nDetails:\r\n{2}"
                        + readInputStream(connection.getErrorStream()));
            }

            String responseText = readInputStream(connection.getInputStream());

            Map<String, String> result = new HashMap<String, String>();
            System.out.println(responseText);
            String[] strs = responseText.replace("{", "").replace("}", "").replace("\"", "").replace("\r", "").replace("\n", "").split(",");
            for (String sPair : strs) {
                String[] pair = sPair.split(":");
                String name = pair[0].trim().toLowerCase();
                String value = urlDecode(pair[1].trim());
                result.put(name, value);
            }

            return result;
        } catch (IOException e) {
            throw new IllegalAccessError(e.getMessage());
        }
    }

    static String readInputStream(InputStream is) {
        if (is == null)
            return "";

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder result = new StringBuilder();
        String line;
        try {
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }
        } catch (IOException e) {
            // pasar por alto
        }
        return result.toString();
    }
}

Una vez que haya realizado la configuración anterior, puede proceder a trabajar con el servicio Google Calendar. Los siguientes son los pasos para crear y actualizar un Calendario de Google en Java.

El siguiente ejemplo de código muestra cómo crear un calendario de Google en Java.

OAuthUser user = new OAuthUser();

// Establezca clientId, clientSecret y correo electrónico 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";

// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";

// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Crear cliente de Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, user.email)) {
    // Insertar, obtener y actualizar calendario
    Calendar calendar = new Calendar("Summary", "Description", "Location", "America/Los_Angeles");

    // Insertar calendario y recuperar el mismo calendario usando id
    String id = client.createCalendar(calendar);
}

Actualizar un calendario de Google en Java

Los siguientes son los pasos para actualizar Google Calendar mediante programación en Java.

El siguiente ejemplo de código muestra cómo actualizar un calendario de Google en Java.

// Crear cliente de Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Especificar ID de calendario
    String id ="<<calendar ID>>"
      
    // Obtener calendario
    Calendar cal = client.fetchCalendar(id);

    // Cambiar la información en el calendario obtenido y actualizar el calendario
    cal.setDescription("New Description");
    cal.setLocation("New Location");
  
    // Actualizar calendario
    client.updateCalendar(cal);
}

Eliminar un calendario de Google en Java

También puede eliminar un calendario en particular usando Aspose.Email for Java. Los siguientes son los pasos para realizar esta operación.

El siguiente ejemplo de código muestra cómo eliminar un calendario de Google en Java.

// Crear cliente de Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Acceder y eliminar calendario con resumen a partir de "Resumen de calendario"
    String summary = "Calendar summary";

    // Obtener lista de calendarios
    ExtendedCalendar[] lst = client.listCalendars();

    for (ExtendedCalendar extCal : lst) {
        // Eliminar calendarios seleccionados
        if (extCal.getSummary().startsWith(summary))
            client.deleteCalendar(extCal.getId());
    }
}

Obtenga una licencia de API gratuita

Puede obtener una licencia temporal gratuita para usar Aspose.Email for Java sin limitaciones de evaluación.

Conclusión

En este artículo, ha aprendido a crear Google Calendar mediante programación en Java. Además, ha visto cómo actualizar y eliminar un calendario de Google en particular en Java. Además, puede explorar la documentación para leer más sobre Aspose.Email for Java. Además, puede hacer sus preguntas a través de nuestro foro.

Ver también