Створіть, оновіть або видаліть календар Google у Java

Календар Google – це служба планування, яка дозволяє створювати та відстежувати події, наприклад зустрічі. Ви можете реєструвати події в календарі та отримувати нагадування про майбутні. Google також дозволяє використовувати службу календаря програмно. Таким чином, ви можете керувати своїми подіями за допомогою Календарів Google із програм. У цій статті ви дізнаєтеся, як програмно створювати, оновлювати та видаляти календар Google у Java.

Java API для створення календаря Google і керування ним

Для роботи зі службою Google Calendar ми будемо використовувати Aspose.Email for Java. Це потужний API, який надає ряд функцій для обробки електронних листів, роботи з клієнтами електронної пошти та використання служб Google для співпраці. Ви можете завантажити API або встановити його за допомогою наведених нижче конфігурацій Maven.

Репозиторій:

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

Залежність:

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

Створіть календар Google на Java

Перш ніж почати, вам потрібно створити проект на Google Developer Console, щоб ваша програма могла спілкуватися зі службами Google. Щоб створити його, виконайте цей посібник.

Тепер створіть допоміжний клас під назвою GoogleOAuthHelper, щоб подбати про автентифікацію облікового запису Google. Крім того, створіть клас під назвою OAuthUser для зберігання інформації про користувача. Нижче наведено повну реалізацію обох класів.

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>
 * Консоль розробника https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Документація 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) {
            // ігнорувати
        }
        return result.toString();
    }
}

Після того, як ви виконали вищенаведену конфігурацію, ви можете приступати до роботи з сервісом Google Calendar. Нижче наведено кроки, щоб створити та оновити календар Google у Java.

  • Отримайте екземпляр класу GmailClient в об’єкт IGmailClient за допомогою методу GmailClient.getInstance(String, String).
  • Створіть екземпляр класу Calendar та ініціалізуйте його назвою, описом та іншими властивостями.
  • Викличте метод IGmailClient.createCalendar(Calendar), щоб створити календар Google.
  • Отримайте повернутий ідентифікатор календаря.

У наведеному нижче прикладі коду показано, як створити календар Google у Java.

OAuthUser user = new OAuthUser();

// Встановіть clientId, clientSecret і електронну адресу 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Ви повинні отримати AuthorizationCode вручну за допомогою згенерованого AuthorizationCodeUrl
// Встановіть код авторизації
String authorizationCode = "<<authCode>>";

// Скопіюйте засіб перевірки коду з вихідних даних попереднього кроку
// Встановіть codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Отримайте маркер оновлення
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Отримати маркер доступу
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Створіть клієнт Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, user.email)) {
    // Вставити, отримати та оновити календар
    Calendar calendar = new Calendar("Summary", "Description", "Location", "America/Los_Angeles");

    // Вставити календар і отримати той самий календар за допомогою ідентифікатора
    String id = client.createCalendar(calendar);
}

Оновіть календар Google на Java

Нижче наведено кроки для програмного оновлення календаря Google на Java.

У наступному прикладі коду показано, як оновити календар Google у Java.

// Створіть клієнт Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Вкажіть ідентифікатор календаря
    String id ="<<calendar ID>>"
      
    // Отримати календар
    Calendar cal = client.fetchCalendar(id);

    // Змініть інформацію в отриманому календарі та оновіть календар
    cal.setDescription("New Description");
    cal.setLocation("New Location");
  
    // Оновлення календаря
    client.updateCalendar(cal);
}

Видалити календар Google у Java

Ви також можете видалити певний календар за допомогою Aspose.Email for Java. Нижче наведено кроки для виконання цієї операції.

У наведеному нижче прикладі коду показано, як видалити календар Google у Java.

// Створіть клієнт Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Доступ і видалення календаря зі зведенням, починаючи з «Підсумку календаря»
    String summary = "Calendar summary";

    // Отримати список календарів
    ExtendedCalendar[] lst = client.listCalendars();

   for (ExtendedCalendar extCal : lst) {
        // Видалити вибрані календарі
        if (extCal.getSummary().startsWith(summary))
            client.deleteCalendar(extCal.getId());
    }
}

Отримайте безкоштовну ліцензію API

Ви можете отримати безкоштовну тимчасову ліцензію на використання Aspose.Email for Java без оціночних обмежень.

Висновок

У цій статті ви дізналися, як програмно створити календар Google на Java. Крім того, ви бачили, як оновлювати та видаляти певний календар Google у Java. Крім того, ви можете переглянути документацію, щоб дізнатися більше про Aspose.Email for Java. Ви також можете поставити свої запитання через наш форум.

Дивись також