Java에서 Google 캘린더 생성, 업데이트 또는 삭제

Google 캘린더는 회의와 같은 이벤트를 만들고 추적할 수 있는 일정 관리 서비스입니다. 캘린더에 이벤트를 기록하고 다가오는 이벤트에 대한 미리 알림을 받을 수 있습니다. 또한 Google에서는 프로그래밍 방식으로 캘린더 서비스를 사용할 수 있습니다. 따라서 애플리케이션 내에서 Google 캘린더를 사용하여 이벤트를 관리할 수 있습니다. 이 기사에서는 Java에서 프로그래밍 방식으로 Google 캘린더를 생성, 업데이트 및 삭제하는 방법을 배웁니다.

Google 캘린더 생성 및 조작을 위한 Java API

Google 캘린더 서비스를 사용하기 위해 Aspose.Email for Java를 사용합니다. 이메일 처리, 이메일 클라이언트 작업, Google 협업 서비스 사용을 위한 다양한 기능을 제공하는 강력한 API입니다. 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 서비스와 통신할 수 있도록 Google 개발자 콘솔에서 프로젝트를 만들어야 합니다. 생성하려면 이 가이드를 따르세요.

이제 Google 계정 인증을 처리하기 위해 GoogleOAuthHelper라는 도우미 클래스를 만듭니다. 또한 사용자 정보를 저장할 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 캘린더 서비스로 작업을 진행할 수 있습니다. 다음은 Java에서 Google 캘린더를 만들고 업데이트하는 단계입니다.

다음 코드 샘플은 Java에서 Google 캘린더를 만드는 방법을 보여줍니다.

OAuthUser user = new OAuthUser();

// clientId, clientSecret 및 이메일 설정 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// 생성된 AuthorizationCodeUrl을 사용하여 AuthorizationCode를 수동으로 검색해야 합니다.
// 인증 코드 설정
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");

    // 캘린더 삽입 및 ID를 사용하여 동일한 캘린더 검색
    String id = client.createCalendar(calendar);
}

Java에서 Google 캘린더 업데이트

다음은 Java에서 프로그래밍 방식으로 Google 캘린더를 업데이트하는 단계입니다.

다음 코드 샘플은 Java에서 Google 캘린더를 업데이트하는 방법을 보여줍니다.

// Gmail 클라이언트 만들기
try (IGmailClient client = GmailClient.getInstance(accessToken, email)) {
    // 캘린더 ID 지정
    String id ="<<calendar ID>>"
      
    // 캘린더 가져오기
    Calendar cal = client.fetchCalendar(id);

    // 가져온 캘린더 정보 변경 및 캘린더 업데이트
    cal.setDescription("New Description");
    cal.setLocation("New Location");
  
    // 캘린더 업데이트
    client.updateCalendar(cal);
}

Java에서 Google 캘린더 삭제

Java용 Aspose.Email을 사용하여 특정 캘린더를 삭제할 수도 있습니다. 다음은 이 작업을 수행하는 단계입니다.

다음 코드 샘플은 Java에서 Google 캘린더를 삭제하는 방법을 보여줍니다.

// 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 라이선스 받기

평가 제한 없이 Java용 Aspose.Email을 사용하기 위해 무료 임시 라이선스를 얻을 수 있습니다.

결론

이 기사에서는 Java에서 프로그래밍 방식으로 Google 캘린더를 만드는 방법을 배웠습니다. 또한 Java에서 특정 Google 캘린더를 업데이트 및 삭제하는 방법을 살펴보았습니다. 또한 문서를 탐색하여 Java용 Aspose.Email에 대해 자세히 알아볼 수 있습니다. 또한 포럼을 통해 질문할 수 있습니다.

또한보십시오