צור, עדכן או מחק את יומן Google ב-Java

יומן Google הוא שירות תזמון המאפשר לך ליצור ולעקוב אחר האירועים כגון פגישות. אתה יכול לרשום את האירועים בלוח השנה ולקבל תזכורות לגבי האירועים הקרובים. גוגל גם מאפשרת לך להשתמש בשירות לוח השנה שלה באופן פרוגרמטי. כך, אתה יכול לנהל את האירועים שלך באמצעות יומני Google מתוך האפליקציות שלך. במאמר זה, תלמד כיצד ליצור, לעדכן ולמחוק את יומן Google באופן תכנותי ב-Java.

Java API ליצירה ומניפולציה של יומן Google

על מנת לעבוד עם שירות Google Calendar, נשתמש ב-Aspose.Email for Java. זהו ממשק 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 ב-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 style=";text-align:right;direction:rtl">
 * מסוף המפתחים 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. להלן השלבים ליצירה ולעדכון של יומן Google ב-Java.

דוגמת הקוד הבאה מראה כיצד ליצור יומן Google ב-Java.

OAuthUser user = new OAuthUser();

// הגדר ClientId, ClientSecret ואימייל 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// עליך לאחזר את AuthorizationCode באופן ידני באמצעות AuthorizationCodeUrl שנוצר
// הגדר קוד הרשאה
String authorizationCode = "<<authCode>>";

// העתק את Code Verifier מפלט השלב הקודם
// הגדר codeVerifier
String codeVerifier = "<<codeVerifier>>";

// קבל Refresh Token
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.

דוגמת הקוד הבאה מראה כיצד לעדכן יומן של גוגל ב-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 עבור 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 בחינם

אתה יכול לקבל [רישיון זמני] בחינם20 לשימוש ב-Aspose.Email עבור Java ללא מגבלות הערכה.

סיכום

במאמר זה, למדת כיצד ליצור יומן Google באופן תוכנתי ב-Java. יתר על כן, ראית כיצד לעדכן ולמחוק יומן Google מסוים ב-Java. חוץ מזה, אתה יכול לחקור את תיעוד כדי לקרוא עוד על Aspose.Email עבור Java. כמו כן, אתה יכול לשאול את השאלות שלך דרך הפורום שלנו.

ראה גם