إنشاء أو تحديث أو حذف تقويم Google في جافا

Google Calendar هي خدمة جدولة تتيح لك إنشاء ومتابعة الأحداث مثل الاجتماعات. يمكنك تسجيل الأحداث في التقويم والحصول على تذكيرات حول الأحداث القادمة. تتيح لك Google أيضًا استخدام خدمة التقويم الخاصة بها برمجيًا. وبالتالي ، يمكنك إدارة الأحداث الخاصة بك باستخدام Google Calendar من داخل تطبيقاتك. في هذه المقالة ، سوف تتعلم كيفية إنشاء وتحديث وحذف تقويم Google برمجيًا في Java.

Java API لإنشاء تقويم Google ومعالجته

من أجل العمل مع خدمة تقويم Google ، سنستخدم Aspose.Email for Java. إنها واجهة برمجة تطبيقات قوية توفر مجموعة من الميزات لمعالجة رسائل البريد الإلكتروني ، والعمل مع عملاء البريد الإلكتروني ، واستخدام خدمات التعاون من 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 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 وتحديثه في جافا.

يوضح نموذج التعليمات البرمجية التالي كيفية إنشاء تقويم 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>>";

// احصل على رمز التحديث
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 بجافا

فيما يلي خطوات تحديث تقويم Google برمجيًا في جافا.

يوضح نموذج التعليمات البرمجية التالي كيفية تحديث تقويم 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 بجافا

يمكنك أيضًا حذف تقويم معين باستخدام Aspose.Email لجافا. فيما يلي خطوات إجراء هذه العملية.

يوضح نموذج التعليمات البرمجية التالي كيفية حذف تقويم 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 لجافا دون قيود تقييم.

استنتاج

في هذه المقالة ، تعلمت كيفية إنشاء تقويم Google برمجيًا في Java. علاوة على ذلك ، لقد رأيت كيفية تحديث وحذف تقويم Google معين في Java. بالإضافة إلى ذلك ، يمكنك استكشاف التوثيق لقراءة المزيد عن Aspose.Email لجافا. يمكنك أيضًا طرح أسئلتك عبر المنتدى.

أنظر أيضا