জাভা কুইকস্টার্ট

একটি জাভা কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করুন যা গুগল ড্রাইভ অ্যাক্টিভিটি এপিআই-তে অনুরোধ পাঠায়।

কুইকস্টার্টস ব্যাখ্যা করে কিভাবে একটি অ্যাপ সেট আপ এবং রান করতে হয় যা একটি গুগল ওয়ার্কস্পেস এপিআই কল করে। এই কুইকস্টার্টটি একটি সরলীকৃত অথেনটিকেশন পদ্ধতি ব্যবহার করে যা একটি টেস্টিং এনভায়রনমেন্টের জন্য উপযুক্ত। একটি প্রোডাকশন এনভায়রনমেন্টের জন্য, আমরা আপনার অ্যাপের জন্য উপযুক্ত অ্যাক্সেস ক্রেডেনশিয়াল বেছে নেওয়ার আগে অথেনটিকেশন এবং অথরাইজেশন সম্পর্কে জেনে নেওয়ার পরামর্শ দিই।

এই কুইকস্টার্টটি অথেনটিকেশন এবং অথরাইজেশন ফ্লো-এর কিছু খুঁটিনাটি বিষয় সামলানোর জন্য গুগল ওয়ার্কস্পেসের প্রস্তাবিত এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।

উদ্দেশ্য

  • আপনার পরিবেশ প্রস্তুত করুন।
  • নমুনাটি প্রস্তুত করুন।
  • নমুনাটি চালান।

পূর্বশর্ত

  • একটি গুগল অ্যাকাউন্ট।

আপনার পরিবেশ তৈরি করুন

এই কুইকস্টার্টটি সম্পন্ন করতে, আপনার পরিবেশ সেট আপ করুন।

এপিআই সক্রিয় করুন

গুগল এপিআই ব্যবহার করার আগে, আপনাকে একটি গুগল ক্লাউড প্রজেক্টে সেগুলি চালু করতে হবে। আপনি একটি একক গুগল ক্লাউড প্রজেক্টে এক বা একাধিক এপিআই চালু করতে পারেন।
  • গুগল ক্লাউড কনসোলে গুগল ড্রাইভ অ্যাক্টিভিটি এপিআই (Google Drive Activity API) সক্রিয় করুন।

    এপিআই সক্রিয় করুন

আপনি যদি এই কুইকস্টার্টটি সম্পন্ন করতে একটি নতুন গুগল ক্লাউড প্রজেক্ট ব্যবহার করেন, তাহলে OAuth কনসেন্ট স্ক্রিনটি কনফিগার করুন। যদি আপনি আপনার ক্লাউড প্রজেক্টের জন্য এই ধাপটি ইতিমধ্যেই সম্পন্ন করে থাকেন, তাহলে পরবর্তী বিভাগে চলে যান।

  1. Google API কনসোলে, > Google Auth প্ল্যাটফর্ম > ব্র্যান্ডিং- এ যান।

    ব্র্যান্ডিং-এ যান

  2. আপনি যদি ইতিমধ্যেই Google Auth প্ল্যাটফর্মটি কনফিগার করে থাকেন, তাহলে আপনি Branding , Audience , এবং Data Access- এ নিম্নলিখিত OAuth Consent Screen সেটিংস কনফিগার করতে পারেন। যদি আপনি এমন কোনো বার্তা দেখতে পান যেখানে লেখা আছে ‘Google Auth প্ল্যাটফর্ম এখনও কনফিগার করা হয়নি’ , তাহলে Get Started-এ ক্লিক করুন:
    1. 'অ্যাপ ইনফরমেশন'- এর অধীনে 'অ্যাপ নেম' -এ অ্যাপটির জন্য একটি নাম লিখুন।
    2. ব্যবহারকারী সহায়তা ইমেল- এ, এমন একটি সহায়তা ইমেল ঠিকানা বেছে নিন যেখানে ব্যবহারকারীরা তাদের সম্মতি সম্পর্কে কোনো প্রশ্ন থাকলে আপনার সাথে যোগাযোগ করতে পারে।
    3. পরবর্তী ধাপে যান।
    4. Audience-এর অধীনে Internal নির্বাচন করুন।
    5. পরবর্তী ধাপে যান।
    6. যোগাযোগের তথ্যের অধীনে, একটি ইমেল ঠিকানা লিখুন যেখানে আপনার প্রকল্পের যেকোনো পরিবর্তন সম্পর্কে আপনাকে জানানো যাবে।
    7. পরবর্তী ধাপে যান।
    8. Finish-এর অধীনে, Google API Services ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং যদি আপনি সম্মত হন, তাহলে I agree to the Google API Services: User Data Policy নির্বাচন করুন।
    9. চালিয়ে যান-এ ক্লিক করুন।
    10. তৈরি করুন- এ ক্লিক করুন।
  3. আপাতত, আপনি স্কোপ যোগ করা এড়িয়ে যেতে পারেন। ভবিষ্যতে, যখন আপনি আপনার Google Workspace অর্গানাইজেশনের বাইরে ব্যবহারের জন্য কোনো অ্যাপ তৈরি করবেন, তখন আপনাকে অবশ্যই ইউজার টাইপ (User type) পরিবর্তন করে ‘এক্সটার্নাল’ ( External ) করতে হবে। এরপর আপনার অ্যাপের জন্য প্রয়োজনীয় অথরাইজেশন স্কোপগুলো যোগ করুন। আরও জানতে, সম্পূর্ণ ‘কনফিগার OAuth কনসেন্ট’ (Configure OAuth consent) গাইডটি দেখুন।

একটি ডেস্কটপ অ্যাপ্লিকেশনের জন্য ক্রেডেনশিয়াল অনুমোদন করুন

আপনার অ্যাপে ব্যবহারকারীদের প্রমাণীকরণ করতে এবং তাদের ডেটা অ্যাক্সেস করতে, আপনাকে এক বা একাধিক OAuth 2.0 ক্লায়েন্ট আইডি তৈরি করতে হবে। গুগলের OAuth সার্ভারের কাছে একটি একক অ্যাপকে শনাক্ত করতে ক্লায়েন্ট আইডি ব্যবহৃত হয়। যদি আপনার অ্যাপ একাধিক প্ল্যাটফর্মে চলে, তবে আপনাকে প্রতিটি প্ল্যাটফর্মের জন্য একটি পৃথক ক্লায়েন্ট আইডি তৈরি করতে হবে।
  1. Google API কনসোলে, > Google Auth প্ল্যাটফর্ম > ক্লায়েন্টস- এ যান।

    ক্লায়েন্টদের কাছে যান

  2. ক্লায়েন্ট তৈরি করুন -এ ক্লিক করুন।
  3. অ্যাপ্লিকেশন টাইপ > ডেস্কটপ অ্যাপ-এ ক্লিক করুন।
  4. Name ফিল্ডে ক্রেডেনশিয়ালটির জন্য একটি নাম টাইপ করুন। এই নামটি শুধুমাত্র Google API Console-এ দেখানো হয়।
  5. তৈরি করুন- এ ক্লিক করুন।

    নতুন তৈরি করা ক্রেডেনশিয়ালটি "OAuth 2.0 ক্লায়েন্ট আইডি"-এর অধীনে দেখা যায়।

  6. ডাউনলোড করা JSON ফাইলটি credentials.json নামে সংরক্ষণ করুন এবং ফাইলটি আপনার ওয়ার্কিং ডিরেক্টরিতে নিয়ে যান।

কর্মক্ষেত্র প্রস্তুত করুন

  1. আপনার ওয়ার্কিং ডিরেক্টরিতে একটি নতুন প্রজেক্ট স্ট্রাকচার তৈরি করুন:

    gradle init --type basic
    mkdir -p src/main/java src/main/resources 
    
  2. src/main/resources/ ডিরেক্টরিতে, আপনার পূর্বে ডাউনলোড করা credentials.json ফাইলটি কপি করুন।

  3. ডিফল্ট build.gradle ফাইলটি খুলুন এবং এর ভেতরের লেখাগুলো নিচের কোড দিয়ে প্রতিস্থাপন করুন:

    ড্রাইভ/অ্যাক্টিভিটি-ভি২/কুইকস্টার্ট/বিল্ড.গ্রেডল
    apply plugin: 'java'
    apply plugin: 'application'
    
    mainClassName = 'DriveActivityQuickstart'
    sourceCompatibility = 11
    targetCompatibility = 11
    version = '1.0'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'com.google.api-client:google-api-client:2.0.0'
        implementation 'com.google.oauth-client:google-oauth-client-jetty:1.34.1'
        implementation 'com.google.apis:google-api-services-driveactivity:v2-rev20220926-2.0.0'
    }

নমুনাটি সেট আপ করুন

  1. src/main/java/ ডিরেক্টরিতে, আপনার build.gradle ফাইলের mainClassName মানের সাথে মেলে এমন একটি নাম দিয়ে একটি নতুন জাভা ফাইল তৈরি করুন।

  2. আপনার নতুন জাভা ফাইলে নিম্নলিখিত কোডটি অন্তর্ভুক্ত করুন:

    drive/activity-v2/quickstart/src/main/java/DriveActivityQuickstart.java
    import com.google.api.client.auth.oauth2.Credential;
    import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
    import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
    import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
    import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.gson.GsonFactory;
    import com.google.api.client.util.store.FileDataStoreFactory;
    import com.google.api.services.driveactivity.v2.DriveActivityScopes;
    import com.google.api.services.driveactivity.v2.model.*;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.AbstractMap;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class DriveActivityQuickstart {
      /**
       * Application name.
       */
      private static final String APPLICATION_NAME = "Drive Activity API Java Quickstart";
    
      /**
       * Directory to store authorization tokens for this application.
       */
      private static final java.io.File DATA_STORE_DIR = new java.io.File("tokens");
      /**
       * Global instance of the JSON factory.
       */
      private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
      /**
       * Global instance of the scopes required by this quickstart.
       *
       * <p>If modifying these scopes, delete your previously saved tokens/ folder.
       */
      private static final List<String> SCOPES =
          Arrays.asList(DriveActivityScopes.DRIVE_ACTIVITY_READONLY);
      private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
      /**
       * Global instance of the {@link FileDataStoreFactory}.
       */
      private static FileDataStoreFactory DATA_STORE_FACTORY;
      /**
       * Global instance of the HTTP transport.
       */
      private static HttpTransport HTTP_TRANSPORT;
    
      static {
        try {
          HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
          DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
          t.printStackTrace();
          System.exit(1);
        }
      }
    
      /**
       * Creates an authorized Credential object.
       *
       * @return an authorized Credential object.
       * @throws IOException
       */
      public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in = DriveActivityQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
          throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets =
            GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
    
        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(DATA_STORE_FACTORY)
                .setAccessType("offline")
                .build();
        Credential credential =
            new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver())
                .authorize("user");
        System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
      }
    
      /**
       * Build and return an authorized Drive Activity client service.
       *
       * @return an authorized DriveActivity client service
       * @throws IOException
       */
      public static com.google.api.services.driveactivity.v2.DriveActivity getDriveActivityService()
          throws IOException {
        Credential credential = authorize();
        com.google.api.services.driveactivity.v2.DriveActivity service =
            new com.google.api.services.driveactivity.v2.DriveActivity.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
        return service;
      }
    
      public static void main(String[] args) throws IOException {
        // Build a new authorized API client service.
        com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService();
    
        // Print the recent activity in your Google Drive.
        QueryDriveActivityResponse result =
            service.activity().query(new QueryDriveActivityRequest().setPageSize(10)).execute();
        List<DriveActivity> activities = result.getActivities();
        if (activities == null || activities.size() == 0) {
          System.out.println("No activity.");
        } else {
          System.out.println("Recent activity:");
          for (DriveActivity activity : activities) {
            String time = getTimeInfo(activity);
            String action = getActionInfo(activity.getPrimaryActionDetail());
            List<String> actors =
                activity.getActors().stream()
                    .map(DriveActivityQuickstart::getActorInfo)
                    .collect(Collectors.toList());
            List<String> targets =
                activity.getTargets().stream()
                    .map(DriveActivityQuickstart::getTargetInfo)
                    .collect(Collectors.toList());
            System.out.printf(
                "%s: %s, %s, %s\n", time, truncated(actors), action, truncated(targets));
          }
        }
      }
    
      /**
       * Returns a string representation of the first elements in a list.
       */
      private static String truncated(List<String> array) {
        return truncatedTo(array, 2);
      }
    
      /**
       * Returns a string representation of the first elements in a list.
       */
      private static String truncatedTo(List<String> array, int limit) {
        String contents = array.stream().limit(limit).collect(Collectors.joining(", "));
        String more = array.size() > limit ? ", ..." : "";
        return "[" + contents + more + "]";
      }
    
      /**
       * Returns the name of a set property in an object, or else "unknown".
       */
      private static <T> String getOneOf(AbstractMap<String, T> obj) {
        Iterator<String> iterator = obj.keySet().iterator();
        return iterator.hasNext() ? iterator.next() : "unknown";
      }
    
      /**
       * Returns a time associated with an activity.
       */
      private static String getTimeInfo(DriveActivity activity) {
        if (activity.getTimestamp() != null) {
          return activity.getTimestamp();
        }
        if (activity.getTimeRange() != null) {
          return activity.getTimeRange().getEndTime();
        }
        return "unknown";
      }
    
      /**
       * Returns the type of action.
       */
      private static String getActionInfo(ActionDetail actionDetail) {
        return getOneOf(actionDetail);
      }
    
      /**
       * Returns user information, or the type of user if not a known user.
       */
      private static String getUserInfo(User user) {
        if (user.getKnownUser() != null) {
          KnownUser knownUser = user.getKnownUser();
          Boolean isMe = knownUser.getIsCurrentUser();
          return (isMe != null && isMe) ? "people/me" : knownUser.getPersonName();
        }
        return getOneOf(user);
      }
    
      /**
       * Returns actor information, or the type of actor if not a user.
       */
      private static String getActorInfo(Actor actor) {
        if (actor.getUser() != null) {
          return getUserInfo(actor.getUser());
        }
        return getOneOf(actor);
      }
    
      /**
       * Returns the type of a target and an associated title.
       */
      private static String getTargetInfo(Target target) {
        if (target.getDriveItem() != null) {
          return "driveItem:\"" + target.getDriveItem().getTitle() + "\"";
        }
        if (target.getDrive() != null) {
          return "drive:\"" + target.getDrive().getTitle() + "\"";
        }
        if (target.getFileComment() != null) {
          DriveItem parent = target.getFileComment().getParent();
          if (parent != null) {
            return "fileComment:\"" + parent.getTitle() + "\"";
          }
          return "fileComment:unknown";
        }
        return getOneOf(target);
      }
    }

নমুনাটি চালান

  1. নমুনাটি চালান:

    gradle run
    
  1. আপনি যখন প্রথমবার নমুনাটি চালান, তখন এটি আপনাকে অ্যাক্সেসের অনুমতি দিতে অনুরোধ করে:
    1. আপনি যদি আগে থেকেই আপনার গুগল অ্যাকাউন্টে সাইন ইন না করে থাকেন, তাহলে অনুরোধ করা হলে সাইন ইন করুন। আপনি যদি একাধিক অ্যাকাউন্টে সাইন ইন করে থাকেন, তাহলে অনুমোদনের জন্য একটি অ্যাকাউন্ট বেছে নিন।
    2. গ্রহণ করুন- এ ক্লিক করুন।

    আপনার জাভা অ্যাপ্লিকেশনটি রান করে এবং গুগল ড্রাইভ অ্যাক্টিভিটি এপিআই-কে কল করে।

    অনুমোদনের তথ্য ফাইল সিস্টেমে সংরক্ষিত থাকে, তাই পরের বার আপনি নমুনা কোডটি চালালে আপনাকে অনুমোদনের জন্য অনুরোধ করা হবে না।

পরবর্তী পদক্ষেপ