Buat, Perbarui, atau Hapus Kalender Google di Jawa

Google Kalender adalah layanan penjadwalan yang memungkinkan Anda membuat dan melacak acara seperti rapat. Anda dapat mencatat acara di kalender dan mendapatkan pengingat tentang acara yang akan datang. Google juga mengizinkan Anda untuk menggunakan layanan kalendernya secara terprogram. Dengan demikian, Anda dapat mengelola acara Anda menggunakan Kalender Google dari dalam aplikasi Anda. Pada artikel ini, Anda akan mempelajari cara membuat, memperbarui, dan menghapus Kalender Google secara terprogram di Java.

Java API untuk Membuat dan Memanipulasi Kalender Google

Untuk bekerja dengan layanan Google Kalender, kami akan menggunakan Aspose.Email for Java. Ini adalah API canggih yang menyediakan serangkaian fitur untuk memproses email, bekerja dengan klien email, dan menggunakan layanan kolaborasi Google. Anda dapat mengunduh API atau menginstalnya menggunakan konfigurasi Maven berikut.

Gudang:

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

Ketergantungan:

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

Buat Kalender Google di Jawa

Sebelum memulai, Anda perlu membuat proyek di Google Developer Console agar aplikasi Anda dapat berkomunikasi dengan layanan Google. Untuk membuatnya, Anda dapat mengikuti panduan ini.

Sekarang, buat kelas pembantu bernama GoogleOAuthHelper untuk menangani autentikasi akun Google. Buat juga kelas bernama OAuthUser untuk menyimpan informasi pengguna. Berikut implementasi lengkap dari kedua class tersebut.

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>
 * Konsol pengembang https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Dokumentasi 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) {
            // mengabaikan
        }
        return result.toString();
    }
}

Setelah Anda melakukan konfigurasi di atas, Anda dapat melanjutkan bekerja dengan layanan Kalender Google. Berikut adalah langkah-langkah untuk membuat dan mengupdate Google Calendar di Java.

Contoh kode berikut menunjukkan cara membuat Kalender Google di Java.

OAuthUser user = new OAuthUser();

// Atur clientId, clientSecret dan email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Anda harus mengambil AuthorizationCode secara manual dengan AuthorizationCodeUrl yang dihasilkan
// Setel kode otorisasi
String authorizationCode = "<<authCode>>";

// Salin Pemverifikasi Kode dari output langkah sebelumnya
// Tetapkan pemverifikasi kode
String codeVerifier = "<<codeVerifier>>";

// Dapatkan Token Penyegaran
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Dapatkan Token Akses
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Buat klien Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, user.email)) {
    // Sisipkan, dapatkan, dan perbarui kalender
    Calendar calendar = new Calendar("Summary", "Description", "Location", "America/Los_Angeles");

    // Masukkan kalender dan Ambil kalender yang sama menggunakan id
    String id = client.createCalendar(calendar);
}

Perbarui Kalender Google di Jawa

Berikut adalah langkah-langkah untuk mengupdate Google Calendar secara terprogram di Java.

Contoh kode berikut menunjukkan cara memperbarui kalender Google di Java.

// Buat klien Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Tentukan ID kalender
    String id ="<<calendar ID>>"
      
    // Ambil kalender
    Calendar cal = client.fetchCalendar(id);

    // Ubah informasi di kalender yang diambil dan perbarui kalender
    cal.setDescription("New Description");
    cal.setLocation("New Location");
  
    // Perbarui kalender
    client.updateCalendar(cal);
}

Hapus Kalender Google di Jawa

Anda juga dapat menghapus kalender tertentu menggunakan Aspose.Email for Java. Berikut ini adalah langkah-langkah untuk melakukan operasi ini.

Contoh kode berikut menunjukkan cara menghapus Kalender Google di Java.

// Buat klien Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Akses dan hapus kalender dengan ringkasan mulai dari "Ringkasan kalender"
    String summary = "Calendar summary";

    // Dapatkan daftar kalender
    ExtendedCalendar[] lst = client.listCalendars();

   for (ExtendedCalendar extCal : lst) {
        // Hapus kalender yang dipilih
        if (extCal.getSummary().startsWith(summary))
            client.deleteCalendar(extCal.getId());
    }
}

Dapatkan Lisensi API Gratis

Anda bisa mendapatkan lisensi sementara gratis untuk menggunakan Aspose.Email for Java tanpa batasan evaluasi.

Kesimpulan

Pada artikel ini, Anda telah mempelajari cara membuat Google Kalender secara terprogram di Java. Selain itu, Anda telah melihat cara memperbarui dan menghapus Kalender Google tertentu di Jawa. Selain itu, Anda dapat menjelajahi dokumentasi untuk membaca lebih lanjut tentang Aspose.Email for Java. Selain itu, Anda dapat mengajukan pertanyaan melalui forum kami.

Lihat juga