Tạo, Cập nhật hoặc Xóa Lịch Google trong Java

Lịch Google là dịch vụ lập lịch cho phép bạn tạo và theo dõi các sự kiện, chẳng hạn như cuộc họp. Bạn có thể ghi lại các sự kiện trên lịch và nhận lời nhắc về những sự kiện sắp tới. Google cũng cho phép bạn sử dụng dịch vụ lập lịch của nó theo chương trình. Do đó, bạn có thể quản lý các sự kiện của mình bằng Lịch Google từ trong các ứng dụng của mình. Trong bài viết này, bạn sẽ học cách tạo, cập nhật và xóa Lịch Google theo chương trình trong Java.

API Java để tạo và thao tác trên Lịch Google

Để làm việc với dịch vụ Lịch Google, chúng tôi sẽ sử dụng Aspose.Email dành cho Java. Đây là một API mạnh mẽ cung cấp một loạt các tính năng để xử lý email, làm việc với các ứng dụng email và sử dụng các dịch vụ cộng tác của Google. Bạn có thể tải xuống API hoặc cài đặt nó bằng cách sử dụng các cấu hình Maven sau.

Kho:

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

Sự phụ thuộc:

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

Tạo Lịch Google bằng Java

Trước khi bắt đầu, bạn cần tạo một dự án trên Bảng điều khiển dành cho nhà phát triển của Google để ứng dụng của bạn giao tiếp với các dịch vụ của Google. Để tạo một tài khoản, bạn có thể làm theo hướng dẫn này.

Bây giờ, hãy tạo một lớp trợ giúp có tên GoogleOAuthHelper để đảm nhận việc xác thực tài khoản Google. Ngoài ra, hãy tạo một lớp có tên OAuthUser để lưu trữ thông tin người dùng. Sau đây là cách thực hiện đầy đủ của cả hai lớp.

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>
 * Bảng điều khiển dành cho nhà phát triển https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Tài liệu 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) {
            // phớt lờ
        }
        return result.toString();
    }
}

Khi bạn đã thực hiện xong cấu hình trên, bạn có thể tiếp tục làm việc với dịch vụ Lịch Google. Sau đây là các bước để tạo và cập nhật Lịch Google bằng Java.

Mẫu mã sau đây cho biết cách tạo Lịch Google bằng Java.

OAuthUser user = new OAuthUser();

// Đặt clientId, clientSecret và email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";

// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Nhận mã thông báo làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Tạo ứng dụng Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, user.email)) {
    // Chèn, tải và cập nhật lịch
    Calendar calendar = new Calendar("Summary", "Description", "Location", "America/Los_Angeles");

    // Chèn lịch và Truy xuất cùng một lịch bằng id
    String id = client.createCalendar(calendar);
}

Cập nhật Lịch Google bằng Java

Sau đây là các bước để cập nhật Lịch Google theo chương trình trong Java.

Mẫu mã sau đây cho biết cách cập nhật lịch Google trong Java.

// Tạo ứng dụng Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Chỉ định ID lịch
    String id ="<<calendar ID>>"
      
    // Tìm nạp lịch
    Calendar cal = client.fetchCalendar(id);

    // Thay đổi thông tin trong lịch đã tìm nạp và cập nhật lịch
    cal.setDescription("New Description");
    cal.setLocation("New Location");
  
    // Cập nhật lịch
    client.updateCalendar(cal);
}

Xóa Lịch Google trong Java

Bạn cũng có thể xóa một lịch cụ thể bằng cách sử dụng Aspose.Email for Java. Sau đây là các bước để thực hiện thao tác này.

Mẫu mã sau đây cho biết cách xóa Lịch Google trong Java.

// Tạo ứng dụng Gmail
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // Truy cập và xóa lịch có tóm tắt bắt đầu từ "Tóm tắt lịch"
    String summary = "Calendar summary";

    // Nhận danh sách lịch
    ExtendedCalendar[] lst = client.listCalendars();

   for (ExtendedCalendar extCal : lst) {
        // Xóa các lịch đã chọn
        if (extCal.getSummary().startsWith(summary))
            client.deleteCalendar(extCal.getId());
    }
}

Nhận giấy phép API miễn phí

Bạn có thể nhận giấy phép tạm thời miễn phí để sử dụng Aspose.Email dành cho Java mà không có giới hạn đánh giá.

Sự kết luận

Trong bài viết này, bạn đã học cách tạo Lịch Google theo chương trình bằng Java. Hơn nữa, bạn đã thấy cách cập nhật và xóa một Lịch Google cụ thể trong Java. Ngoài ra, bạn có thể khám phá tài liệu để đọc thêm về Aspose.Email for Java. Ngoài ra, bạn có thể đặt câu hỏi của mình qua diễn đàn của chúng tôi.

Xem thêm