Créer, mettre à jour ou supprimer Google Calendar en Java

Google Calendar est un service de planification qui vous permet de créer et de suivre des événements tels que des réunions. Vous pouvez enregistrer les événements sur le calendrier et recevoir des rappels sur les événements à venir. Google vous permet également d’utiliser son service de calendrier par programmation. Ainsi, vous pouvez gérer vos événements à l’aide de Google Calendars depuis vos applications. Dans cet article, vous apprendrez à créer, mettre à jour et supprimer Google Agenda par programmation en Java.

API Java pour créer et manipuler Google Calendar

Afin de travailler avec le service Google Calendar, nous utiliserons Aspose.Email for Java. Il s’agit d’une API puissante qui fournit une gamme de fonctionnalités pour le traitement des e-mails, l’utilisation de clients de messagerie et l’utilisation des services de collaboration de Google. Vous pouvez soit télécharger l’API ou l’installer à l’aide des configurations Maven suivantes.

Repository:

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

Dependency:

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

Créer un agenda Google en Java

Avant de commencer, vous devez créer un projet sur la Google Developer Console pour que votre application puisse communiquer avec les services de Google. Pour en créer un, vous pouvez suivre ce guide.

Maintenant, créez une classe d’assistance nommée GoogleOAuthHelper pour prendre en charge l’authentification d’un compte Google. Créez également une classe nommée OAuthUser pour stocker les informations utilisateur. Ce qui suit est l’implémentation complète des deux classes.

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>
 * Console développeurs https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Documentation 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) {
            // ignorer
        }
        return result.toString();
    }
}

Une fois que vous avez effectué la configuration ci-dessus, vous pouvez continuer à travailler avec le service Google Calendar. Voici les étapes pour créer et mettre à jour un agenda Google en Java.

L’exemple de code suivant montre comment créer un agenda Google en Java.

OAuthUser user = new OAuthUser();

// Définissez clientId, clientSecret et email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Vous devez récupérer AuthorizationCode manuellement avec AuthorizationCodeUrl généré
// Définir le code d'autorisation
String authorizationCode = "<<authCode>>";

// Copier le vérificateur de code à partir de la sortie de l'étape précédente
// Définir le codeVérificateur
String codeVerifier = "<<codeVerifier>>";

// Obtenir un jeton d'actualisation
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Obtenir un jeton d'accès
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Créer un client Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, user.email)) {
    // Insérer, obtenir et mettre à jour le calendrier
    Calendar calendar = new Calendar("Summary", "Description", "Location", "America/Los_Angeles");

    // Insérer un calendrier et récupérer le même calendrier en utilisant l'identifiant
    String id = client.createCalendar(calendar);
}

Mettre à jour un agenda Google en Java

Voici les étapes pour mettre à jour un agenda Google par programmation en Java.

L’exemple de code suivant montre comment mettre à jour un agenda Google en Java.

// Créer un client Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Spécifiez l'ID du calendrier
    String id ="<<calendar ID>>"
      
    // Récupérer le calendrier
    Calendar cal = client.fetchCalendar(id);

    // Modifier les informations dans le calendrier récupéré et mettre à jour le calendrier
    cal.setDescription("New Description");
    cal.setLocation("New Location");
  
    // Mettre à jour le calendrier
    client.updateCalendar(cal);
}

Supprimer un agenda Google en Java

Vous pouvez également supprimer un calendrier particulier en utilisant Aspose.Email for Java. Voici les étapes pour effectuer cette opération.

L’exemple de code suivant montre comment supprimer un agenda Google en Java.

// Créer un client Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Accéder et supprimer le calendrier avec un résumé à partir de "Résumé du calendrier"
    String summary = "Calendar summary";

    // Obtenir la liste des calendriers
    ExtendedCalendar[] lst = client.listCalendars();

    for (ExtendedCalendar extCal : lst) {
        // Supprimer les calendriers sélectionnés
        if (extCal.getSummary().startsWith(summary))
            client.deleteCalendar(extCal.getId());
    }
}

Obtenez une licence API gratuite

Vous pouvez obtenir une licence temporaire gratuite pour utiliser Aspose.Email for Java sans limitation d’évaluation.

Conclusion

Dans cet article, vous avez appris à créer Google Agenda par programmation en Java. De plus, vous avez vu comment mettre à jour et supprimer un calendrier Google particulier en Java. En outre, vous pouvez explorer la documentation pour en savoir plus sur Aspose.Email for Java. Vous pouvez également poser vos questions via notre forum.

Voir également