ایجاد، به روز رسانی یا حذف تقویم گوگل در جاوا

Google Calendar یک سرویس زمان‌بندی است که به شما امکان می‌دهد رویدادهایی مانند جلسات را ایجاد و پیگیری کنید. می‌توانید رویدادها را در تقویم ثبت کنید و یادآوری‌هایی درباره رویدادهای آینده دریافت کنید. گوگل همچنین به شما اجازه می دهد تا از سرویس تقویم خود به صورت برنامه ریزی شده استفاده کنید. بنابراین، می‌توانید رویدادهای خود را با استفاده از تقویم‌های Google از درون برنامه‌های خود مدیریت کنید. در این مقاله با نحوه ایجاد، به روز رسانی و حذف تقویم گوگل به صورت برنامه نویسی در جاوا آشنا خواهید شد.

Java API برای ایجاد و دستکاری Google Calendar

برای کار با سرویس Google Calendar، از Aspose.Email for Java استفاده خواهیم کرد. این یک API قدرتمند است که طیف وسیعی از ویژگی‌ها را برای پردازش ایمیل‌ها، کار با کلاینت‌های ایمیل و استفاده از سرویس‌های همکاری 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>

یک تقویم گوگل در جاوا ایجاد کنید

قبل از شروع، باید یک پروژه در کنسول برنامه نویس گوگل ایجاد کنید تا برنامه شما با سرویس های گوگل ارتباط برقرار کند. برای ایجاد یکی، می توانید [این راهنما] را دنبال کنید.

اکنون یک کلاس کمکی به نام 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 Calendar ادامه دهید. در زیر مراحل ایجاد و به روز رسانی تقویم گوگل در جاوا آمده است.

نمونه کد زیر نحوه ایجاد تقویم گوگل در جاوا را نشان می دهد.

OAuthUser user = new OAuthUser();

// clientId، clientSecret و email را تنظیم کنید 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// شما باید AuthorizationCode را به صورت دستی با AuthorizationCodeUrl ایجاد شده بازیابی کنید
// تنظیم کد مجوز
String authorizationCode = "<<authCode>>";

// کد تأیید کننده را از خروجی مرحله قبل کپی کنید
// codeVerifier را تنظیم کنید
String codeVerifier = "<<codeVerifier>>";

// Refresh Token را دریافت کنید
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// رمز دسترسی را دریافت کنید
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// کلاینت جیمیل ایجاد کنید
try (IGmailClient client = GmailClient.getInstance(accessToken, user.email)) {
    // درج، دریافت و به روز رسانی تقویم
    Calendar calendar = new Calendar("Summary", "Description", "Location", "America/Los_Angeles");

    // درج تقویم و بازیابی همان تقویم با استفاده از id
    String id = client.createCalendar(calendar);
}

یک تقویم گوگل را در جاوا به روز کنید

مراحل زیر برای به روز رسانی یک تقویم گوگل به صورت برنامه نویسی در جاوا آمده است.

نمونه کد زیر نحوه به روز رسانی یک تقویم گوگل در جاوا را نشان می دهد.

// کلاینت جیمیل ایجاد کنید
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);
}

حذف تقویم گوگل در جاوا

همچنین می توانید یک تقویم خاص را با استفاده از Aspose.Email برای جاوا حذف کنید. مراحل زیر برای انجام این عملیات آورده شده است.

نمونه کد زیر نحوه حذف تقویم گوگل در جاوا را نشان می دهد.

// کلاینت جیمیل ایجاد کنید
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 برای جاوا بدون محدودیت ارزیابی، مجوز موقت رایگان دریافت کنید.

نتیجه

در این مقاله با نحوه ایجاد تقویم گوگل به صورت برنامه نویسی در جاوا آشنا شدید. علاوه بر این، نحوه به روز رسانی و حذف یک تقویم گوگل خاص در جاوا را مشاهده کرده اید. علاوه بر این، برای مطالعه بیشتر درباره Aspose.Email برای جاوا، می‌توانید اسناد را کاوش کنید. همچنین، می‌توانید سؤالات خود را از طریق [تالار گفتمان22 ما بپرسید.

همچنین ببینید