Python এবং Google Meet REST API-এর সাথে মিটিং ইভেন্টগুলি পর্যবেক্ষণ করুন

এই টিউটোরিয়ালটি দেখায় যে কীভাবে Google Workspace Events API এবং Google Cloud Pub/Sub-এর সাথে Google Meet REST API ব্যবহার করে Meet মিটিং স্পেসে ইভেন্টগুলি পর্যবেক্ষণ এবং প্রতিক্রিয়া জানাতে হয়। নমুনা অ্যাপ্লিকেশনটি কখন কনফারেন্স শুরু হয় এবং শেষ হয়, কখন অংশগ্রহণকারীরা যোগ দেয় বা চলে যায় এবং কখন কোনও জেনারেটেড মিটিং আর্টিফ্যাক্ট উপলব্ধ থাকে তা রেকর্ড করে।

নির্দিষ্ট কোনও মিটিং স্পেসে সাবস্ক্রাইব করার পরিবর্তে, আপনি কোনও Meet ব্যবহারকারীর সাবস্ক্রাইব করতে পারেন যাতে ব্যবহারকারীর মালিকানাধীন বা সংগঠিত যেকোনো মিটিং স্পেসের ইভেন্টগুলি গ্রহণ করা যায়। বিস্তারিত জানার জন্য, Google Workspace Events API ডকুমেন্টেশনে "Google Meet ইভেন্টগুলিতে সাবস্ক্রাইব করুন" দেখুন।

পূর্বশর্ত

আপনার প্রতিষ্ঠানের জন্য যদি এই পূর্বশর্তগুলির কোনওটি চালু করার প্রয়োজন হয়, তাহলে আপনার Google Workspace অ্যাডমিনিস্ট্রেটরকে সেগুলি চালু করতে বলুন:

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

এই বিভাগটি দেখায় কিভাবে আপনার স্থানীয় পরিবেশ এবং এই টিউটোরিয়ালের জন্য Google ক্লাউড প্রকল্প তৈরি এবং কনফিগার করবেন।

একটি কার্যকরী ডিরেক্টরি এবং পাইথন ভার্চুয়াল পরিবেশ তৈরি করুন

একটি নতুন ভার্চুয়াল পরিবেশ তৈরি এবং সক্রিয় করতে, আপনার টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান।

লিনাক্স/ম্যাকওএস

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
source env/bin/activate

উইন্ডোজ (কমান্ড প্রম্পট)

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.bat

উইন্ডোজ (পাওয়ারশেল)

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.ps1

একটি গুগল ক্লাউড প্রকল্প তৈরি করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > IAM & Admin > Create a Project এ যান।

    একটি প্রকল্প তৈরি করুন বিভাগে যান।

  2. প্রকল্পের নাম ক্ষেত্রে, আপনার প্রকল্পের জন্য একটি বর্ণনামূলক নাম লিখুন।

    ঐচ্ছিক: প্রজেক্ট আইডি সম্পাদনা করতে, সম্পাদনা ক্লিক করুন। প্রজেক্ট তৈরির পরে প্রজেক্ট আইডি পরিবর্তন করা যাবে না, তাই এমন একটি আইডি বেছে নিন যা প্রজেক্টের জীবনকাল ধরে আপনার চাহিদা পূরণ করে।

  3. আপনার প্রকল্পের সম্ভাব্য অবস্থানগুলি প্রদর্শন করতে "স্থান" ক্ষেত্রে "ব্রাউজ" এ ক্লিক করুন। তারপর, " নির্বাচন করুন" এ ক্লিক করুন।
  4. তৈরি করুন এ ক্লিক করুন। গুগল ক্লাউড কনসোল ড্যাশবোর্ড পৃষ্ঠায় নেভিগেট করে এবং কয়েক মিনিটের মধ্যেই আপনার প্রকল্প তৈরি হয়ে যায়।

জিক্লাউড সিএলআই

নিম্নলিখিত ডেভেলপমেন্ট পরিবেশগুলির মধ্যে একটিতে, Google Cloud CLI ( gcloud ) অ্যাক্সেস করুন:

  • ক্লাউড শেল : gcloud CLI ইতিমধ্যেই সেট আপ করা আছে এমন একটি অনলাইন টার্মিনাল ব্যবহার করতে, ক্লাউড শেল সক্রিয় করুন।
    ক্লাউড শেল সক্রিয় করুন
  • লোকাল শেল : লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট ব্যবহার করতে, gcloud CLI ইনস্টল এবং ইনিশিয়ালাইজ করুন
    ক্লাউড প্রজেক্ট তৈরি করতে, gcloud projects create কমান্ডটি ব্যবহার করুন:
    gcloud projects create PROJECT_ID
    আপনি যে প্রকল্পটি তৈরি করতে চান তার আইডি সেট করে PROJECT_ID প্রতিস্থাপন করুন।

গুগল ক্লাউড প্রোজেক্টের জন্য বিলিং সক্ষম করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, বিলিং এ যান। মেনু > বিলিং > মাই প্রোজেক্টস এ ক্লিক করুন।

    আমার প্রকল্পের জন্য বিলিং বিভাগে যান।

  2. "একটি প্রতিষ্ঠান নির্বাচন করুন" বিভাগে , আপনার Google ক্লাউড প্রকল্পের সাথে সম্পর্কিত প্রতিষ্ঠানটি বেছে নিন।
  3. প্রজেক্ট সারিতে, অ্যাকশন মেনু ( ) খুলুন, বিলিং পরিবর্তন করুন এ ক্লিক করুন এবং ক্লাউড বিলিং অ্যাকাউন্টটি নির্বাচন করুন।
  4. অ্যাকাউন্ট সেট করুন ক্লিক করুন।

জিক্লাউড সিএলআই

  1. উপলব্ধ বিলিং অ্যাকাউন্টগুলির তালিকা তৈরি করতে, চালান:
    gcloud billing accounts list
  2. একটি Google ক্লাউড প্রকল্পের সাথে একটি বিলিং অ্যাকাউন্ট লিঙ্ক করুন:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PROJECT_ID হল সেই ক্লাউড প্রকল্পের প্রকল্প আইডি যার জন্য আপনি বিলিং সক্ষম করতে চান।
    • BILLING_ACCOUNT_ID হল Google ক্লাউড প্রকল্পের সাথে লিঙ্ক করার জন্য বিলিং অ্যাকাউন্ট আইডি

প্রমাণীকরণ এবং অনুমোদন সেট আপ করুন

প্রমাণীকরণ এবং অনুমোদন অ্যাপটিকে Meet REST API রিসোর্স অ্যাক্সেস করতে দেয়। Meet REST API কল করার জন্য ব্যবহারকারীর অনুমোদন প্রয়োজন। এই বিভাগটি আপনাকে কীভাবে ব্যবহারকারীর শংসাপত্র কনফিগার করতে হয় এবং অনুমোদনের জন্য অনুরোধ করতে হয় তা দেখায়।

OAuth সম্মতি স্ক্রিন কনফিগার করুন এবং স্কোপ বেছে নিন

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

  1. গুগল ক্লাউড কনসোলে, মেনু > এ যানGoogle Auth platform > ব্র্যান্ডিং

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

  2. যদি আপনি ইতিমধ্যেই কনফিগার করে থাকেন Google Auth platform, আপনি ব্র্যান্ডিং , অডিয়েন্স এবং ডেটা অ্যাক্সেসে নিম্নলিখিত OAuth কনসেন্ট স্ক্রিন সেটিংস কনফিগার করতে পারেন। যদি আপনি এমন একটি বার্তা দেখতে পান যা বলে Google Auth platform এখনও কনফিগার করা হয়নি , শুরু করুন ক্লিক করুন:
    1. অ্যাপ তথ্যের অধীনে, অ্যাপের নামে , Meet REST API Tutorial লিখুন।
    2. ব্যবহারকারীর সহায়তা ইমেল বিভাগে, এমন একটি সহায়তা ইমেল ঠিকানা বেছে নিন যেখানে ব্যবহারকারীদের সম্মতি সম্পর্কে প্রশ্ন থাকলে তারা আপনার সাথে যোগাযোগ করতে পারবেন।
    3. পরবর্তী ক্লিক করুন।
    4. অডিয়েন্স এর অধীনে, অভ্যন্তরীণ নির্বাচন করুন।
    5. পরবর্তী ক্লিক করুন।
    6. যোগাযোগের তথ্য এর অধীনে, একটি ইমেল ঠিকানা লিখুন যেখানে আপনার প্রকল্পের যেকোনো পরিবর্তন সম্পর্কে আপনাকে অবহিত করা যেতে পারে।
    7. পরবর্তী ক্লিক করুন।
    8. Finish এর অধীনে, Google API পরিষেবা ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং যদি আপনি সম্মত হন, তাহলে আমি Google API পরিষেবাগুলিতে সম্মত: ব্যবহারকারীর ডেটা নীতি নির্বাচন করুন।
    9. চালিয়ে যান ক্লিক করুন।
    10. তৈরি করুন ক্লিক করুন।
    11. যদি আপনি ব্যবহারকারীর ধরণের জন্য External নির্বাচন করে থাকেন, তাহলে পরীক্ষামূলক ব্যবহারকারী যোগ করুন:
      1. দর্শক ক্লিক করুন।
      2. ব্যবহারকারীদের পরীক্ষা করুন এর অধীনে, ব্যবহারকারীদের যোগ করুন এ ক্লিক করুন।
      3. আপনার ইমেল ঠিকানা এবং অন্য কোনও অনুমোদিত পরীক্ষা ব্যবহারকারী লিখুন, তারপর সংরক্ষণ করুন ক্লিক করুন।
  3. Data Access > Add or Remove Scopes এ ক্লিক করুন। আপনার Google Cloud Project এ সক্ষম করা প্রতিটি API এর জন্য স্কোপের তালিকা সহ একটি প্যানেল প্রদর্শিত হবে।
  4. Manually add scopes এর অধীনে, নিম্নলিখিত scopes টি পেস্ট করুন:
    • https://www.googleapis.com/auth/meetings.space.created
  5. টেবিলে যোগ করুন ক্লিক করুন।
  6. আপডেট ক্লিক করুন।
  7. আপনার অ্যাপের জন্য প্রয়োজনীয় স্কোপ নির্বাচন করার পরে, সংরক্ষণ করুন এ ক্লিক করুন।

OAuth সম্মতি কনফিগার করার বিষয়ে আরও তথ্যের জন্য, দেখুন শুরু করুন Google Auth platform .

একটি ক্লায়েন্ট আইডি তৈরি করুন

OAuth 2.0 প্রবাহের সময় ক্লায়েন্ট আইডি আপনার অ্যাপ্লিকেশনের জন্য শংসাপত্র হিসেবে কাজ করে। যেহেতু অ্যাপটি স্থানীয়ভাবে চলে, তাই একটি ডেস্কটপ ক্লায়েন্ট আইডি তৈরি করুন।

  1. গুগল ক্লাউড কনসোলে, মেনু > এ যানGoogle Auth platform > ক্লায়েন্ট

    ক্লায়েন্টদের তালিকায় যান

  2. ক্লায়েন্ট তৈরি করুন ক্লিক করুন।
  3. অ্যাপ্লিকেশনের ধরণ > ডেস্কটপ অ্যাপ ক্লিক করুন।
  4. নাম ক্ষেত্রে, শংসাপত্রের জন্য একটি নাম টাইপ করুন। এই নামটি শুধুমাত্র Google ক্লাউড কনসোলে দেখানো হবে।
  5. তৈরি করুন ক্লিক করুন।

    নতুন তৈরি শংসাপত্রটি "OAuth 2.0 ক্লায়েন্ট আইডি" এর অধীনে প্রদর্শিত হবে।

গুগল অথ লাইব্রেরি ইনস্টল করুন

গুগল অথ লাইব্রেরি ইনস্টল করুন:

pip install google-auth google-auth-oauthlib

অনুমোদন কার্যকর করুন

Meet REST API-এর জন্য OAuth 2.0 অ্যাক্সেস টোকেনের আকারে ব্যবহারকারীর শংসাপত্র প্রয়োজন। এই বিভাগে, আপনি ব্যবহারকারীর জন্য একটি অ্যাক্সেস টোকেন এবং একটি রিফ্রেশ টোকেনের অনুরোধ করতে OAuth 2.0 ফ্লো বাস্তবায়ন করেন।

  1. আপনার ওয়ার্কিং ডিরেক্টরিতে, main.py ফাইলটি তৈরি করুন এবং নিম্নলিখিত বিষয়বস্তু যোগ করুন:

    import os
    import json
    
    from google.auth.transport import requests
    from google.oauth2.credentials import Credentials
    from google_auth_oauthlib.flow import InstalledAppFlow
    
    def authorize() -> Credentials:
        """Ensure valid credentials for calling the Meet REST API."""
        CLIENT_SECRET_FILE = "./client_secret.json"
        credentials = None
    
        if os.path.exists('token.json'):
            credentials = Credentials.from_authorized_user_file('token.json')
    
        if credentials is None:
            flow = InstalledAppFlow.from_client_secrets_file(
                CLIENT_SECRET_FILE,
                scopes=[
                    'https://www.googleapis.com/auth/meetings.space.created',
                ])
            flow.run_local_server(port=0)
            credentials = flow.credentials
    
        if credentials and credentials.expired:
            credentials.refresh(requests.Request())
    
        if credentials is not None:
            with open("token.json", "w") as f:
                f.write(credentials.to_json())
    
        return credentials
    
    USER_CREDENTIALS = authorize()
    
  2. কোডটি চালানোর জন্য, ক্লায়েন্ট আইডি এবং পূর্বে তৈরি করা গোপনীয়তা উভয়ই প্রয়োজন। ডাউনলোড করা ক্লায়েন্ট গোপন ফাইলটি প্রজেক্ট ওয়ার্কিং ডিরেক্টরিতে কপি করুন এবং এটির নাম পরিবর্তন করুন client_secret.json

  3. যদি আপনি অনুমোদন কীভাবে কাজ করে তা পরীক্ষা করতে চান, তাহলে নিম্নলিখিত কমান্ডটি চালান। অ্যাপটি অনুমোদনের জন্য অনুরোধ করে এবং অনুরোধ অনুমোদিত হওয়ার পরে প্রকল্পের কার্যকরী ডিরেক্টরিতে একটি token.json ফাইল তৈরি করে।

    python3 main.py

Meet REST API যোগ করুন

এখন অনুমোদন কোড সম্পূর্ণ হয়ে গেছে, এখন Meet REST API সক্রিয় এবং কল করার সময়।

API গুলি সক্ষম করুন

যদিও এই বিভাগটি Meet REST API-এর উপর দৃষ্টি নিবদ্ধ করে, এই টিউটোরিয়ালটি Google Cloud Pub/Sub এবং Google Workspace Events APIও ব্যবহার করে।

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, গুগল মিট REST API, গুগল ওয়ার্কস্পেস ইভেন্টস API এবং গুগল ক্লাউড পাব/সাব সক্ষম করুন।

    API গুলি সক্ষম করুন

  2. নিশ্চিত করুন যে আপনি সঠিক ক্লাউড প্রজেক্টে API গুলি সক্রিয় করছেন, তারপর Next এ ক্লিক করুন।

  3. নিশ্চিত করুন যে আপনি সঠিক API গুলি সক্রিয় করছেন, তারপর সক্ষম করুন এ ক্লিক করুন।

জিক্লাউড সিএলআই

  1. প্রয়োজনে, বর্তমান ক্লাউড প্রজেক্টটিকে gcloud config set project কমান্ড দিয়ে তৈরি করা প্রজেক্টে সেট করুন:

    gcloud config set project PROJECT_ID

    আপনার তৈরি করা ক্লাউড প্রোজেক্টের প্রোজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

  2. gcloud services enable কমান্ড ব্যবহার করে Google Meet REST API, Google Workspace Events API এবং Google Cloud Pub/Sub সক্ষম করুন:

    gcloud services enable meet.googleapis.com workspaceevents.googleapis.com pubsub.googleapis.com

Meet REST API ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন

Meet REST API ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. কমান্ডটি চালান:

    pip install google-apps-meet
  2. ক্লায়েন্ট আমদানি করতে main.py ফাইলটি সম্পাদনা করুন:

    from google.apps import meet_v2 as meet
    

একটি স্থান তৈরি করুন

এখন যেহেতু Meet REST API উপলব্ধ, সাবস্ক্রাইব করা যেতে পারে এমন একটি মিটিং স্পেস তৈরি করার জন্য একটি ফাংশন সংজ্ঞায়িত করুন।

main.py সম্পাদনা করুন এবং যোগ করুন:

def create_space() -> meet.Space:
    """Create a meeting space."""
    client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
    request = meet.CreateSpaceRequest()
    return client.create_space(request=request)

ইভেন্টগুলিতে সাবস্ক্রাইব করুন

মিটিং স্পেস সম্পর্কে ইভেন্টগুলি পেতে, আপনাকে Google Workspace Events API ব্যবহার করে একটি সাবস্ক্রিপশন তৈরি করতে হবে। আপনাকে অবশ্যই একটি Google Cloud Pub/Sub বিষয় তৈরি এবং সাবস্ক্রাইব করতে হবে যা বিজ্ঞপ্তির শেষ বিন্দু হিসেবে কাজ করে যেখানে আপনার অ্যাপ ইভেন্টগুলি গ্রহণ করে।

গুগল ক্লাউড পাব/সাব কনফিগার করুন

একটি পাব/সাব বিষয় তৈরি এবং সাবস্ক্রাইব করতে:

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > পাব/সাব এ যান।

    পাব/সাব-এ যান

    আপনার অ্যাপের জন্য ক্লাউড প্রজেক্টটি নির্বাচন করা আছে কিনা তা নিশ্চিত করুন।

  2. ক্লিক করুন বিষয় তৈরি করুন এবং নিম্নলিখিতগুলি করুন:
    1. বিষয়ের নাম হিসেবে workspace-events লিখুন।
    2. একটি ডিফল্ট সাবস্ক্রিপশন যোগ করুন নির্বাচিত ছেড়ে দিন।
    3. তৈরি করুন এ ক্লিক করুন। আপনার সম্পূর্ণ বিষয়ের নামটি projects/{project}/topics/{topic} হিসাবে ফর্ম্যাট করা হয়েছে। পরবর্তী ধাপগুলিতে ব্যবহারের জন্য এই নামটি একটি নোট করুন।
  3. আপনার বিষয়ে পাব/সাব বার্তা প্রকাশের অ্যাক্সেস দিন:
    1. পাশের প্যানেলে, অনুমতি ট্যাবটি খুলুন।
    2. প্রিন্সিপাল যোগ করুন ক্লিক করুন।
    3. নতুন প্রিন্সিপালগুলিতে , meet-api-event-push@system.gserviceaccount.com লিখুন।
    4. অ্যাসাইন রোলগুলিতে , Pub/Sub Publisher নির্বাচন করুন।
    5. সংরক্ষণ করুন ক্লিক করুন।

    আপনার বিষয়ের অনুমতি আপডেট করতে কয়েক মিনিট সময় লাগতে পারে।

জিক্লাউড সিএলআই

  1. আপনার ক্লাউড প্রজেক্টে, নিম্নলিখিতগুলি চালিয়ে একটি বিষয় তৈরি করুন:
    gcloud pubsub topics create workspace-events

    আউটপুটটি সম্পূর্ণ বিষয়ের নাম প্রদর্শন করে, যা projects/{project}/topics/{topic} হিসাবে ফর্ম্যাট করা হয়েছে। পরবর্তী ধাপগুলিতে ব্যবহারের জন্য এই নামটি একটি নোট করুন।

  2. আপনার বিষয়ে বার্তা প্রকাশের অ্যাক্সেস দিন:
     gcloud pubsub topics add-iam-policy-binding workspace-events --member='serviceAccount:meet-api-event-push@system.gserviceaccount.com' --role='roles/pubsub.publisher'

    আপনার বিষয়ের অনুমতি আপডেট করতে কয়েক মিনিট সময় লাগতে পারে।

  3. এই বিষয়ের জন্য একটি পাব/সাব সাবস্ক্রিপশন তৈরি করুন:
    gcloud pubsub subscriptions create workspace-events-sub --topic=TOPIC_NAME

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • TOPIC_NAME : আপনার আগের ধাপে তৈরি করা বিষয়ের নাম।

টপিকের নামটি নোট করে রাখুন এবং নিশ্চিত করুন যে {project} এর মানটি আপনার অ্যাপের ক্লাউড প্রোজেক্ট আইডি। পরে আপনি টপিকের নামটি ব্যবহার করে Google Workspace সাবস্ক্রিপশন তৈরি করবেন।

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > IAM & Admin > পরিষেবা অ্যাকাউন্ট এ যান।

    পরিষেবা অ্যাকাউন্টগুলিতে যান।

  2. পরিষেবা অ্যাকাউন্ট তৈরি করুন ক্লিক করুন।
  3. পরিষেবা অ্যাকাউন্টের বিবরণ পূরণ করুন, তারপর তৈরি করুন এবং চালিয়ে যান ক্লিক করুন।
  4. "এই পরিষেবা অ্যাকাউন্টকে প্রকল্পে অ্যাক্সেস প্রদান করুন" বিভাগে, নিম্নলিখিত ভূমিকাগুলি যোগ করুন:
    • roles/pubsub.subscriber
  5. চালিয়ে যান ক্লিক করুন।
  6. ঐচ্ছিক: এই পরিষেবা অ্যাকাউন্টের মাধ্যমে পরিচালনা এবং কার্য সম্পাদন করতে পারে এমন ব্যবহারকারী বা গোষ্ঠীগুলি লিখুন। আরও বিস্তারিত জানার জন্য, পরিষেবা অ্যাকাউন্ট ছদ্মবেশ পরিচালনা দেখুন।
  7. সম্পন্ন ক্লিক করুন। পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানাটি লিখে রাখুন।

জিক্লাউড সিএলআই

  1. পরিষেবা অ্যাকাউন্ট তৈরি করুন:
    gcloud iam service-accounts create meet-event-listener \
      --display-name="meet-event-listener"
  2. পরিষেবা অ্যাকাউন্টে প্রয়োজনীয় ভূমিকা প্রদান করুন:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:meet-event-listener@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"

    আপনার Google ক্লাউড প্রোজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

পরিষেবা অ্যাকাউন্ট ব্যবহার করুন

পরিষেবা অ্যাকাউন্ট তৈরি করার পরে, নিজেকে পরিষেবা অ্যাকাউন্টের ছদ্মবেশ ধারণ করার অনুমতি দিন।

গুগল ক্লাউড কনসোল

  1. নতুন তৈরি পরিষেবা অ্যাকাউন্টের জন্য অ্যাকশন কলামে, > Manage permissions এ ক্লিক করুন।
  2. কী যোগ করুন > অ্যাক্সেস প্রদান করুন ক্লিক করুন।
  3. Add principals এর অধীনে আপনার ইমেল ঠিকানা লিখুন।
  4. ভূমিকা হিসেবে পরিষেবা অ্যাকাউন্ট > পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর নির্বাচন করুন।
  5. সংরক্ষণ করুন ক্লিক করুন।
  6. আপনার টার্মিনালে ফিরে যান এবং পরিষেবা অ্যাকাউন্টে অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র সেট করতে gcloud দিয়ে সাইন ইন করুন। অনুমোদনের জন্য অনুরোধ করা হলে, পূর্ববর্তী ধাপগুলিতে ব্যবহৃত একই অ্যাকাউন্ট ব্যবহার করে সাইন ইন করুন।
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

জিক্লাউড সিএলআই

  1. অনুমতি যোগ করার জন্য, পরিষেবা অ্যাকাউন্ট এবং ব্যবহারকারীর ইমেল ঠিকানা ব্যবহার করে gcloud iam service-accounts add-iam-policy-binding চালান।
    gcloud iam service-accounts add-iam-policy-binding \
      SERVICE_ACCOUNT_EMAIL \
      --member="user:YOUR_EMAIL" \
      --role="roles/iam.serviceAccountTokenCreator"
  2. পরিষেবা অ্যাকাউন্টে অ্যাপ্লিকেশনের ডিফল্ট শংসাপত্র সেট করতে সাইন ইন করুন। অনুমোদনের জন্য অনুরোধ করা হলে, পূর্ববর্তী ধাপগুলিতে ব্যবহৃত একই অ্যাকাউন্ট ব্যবহার করে সাইন ইন করুন।
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

পাব/সাব ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন

  1. Pub/Sub এর জন্য ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে pip ব্যবহার করুন:

    pip install google-cloud-pubsub
  2. তারপর ক্লায়েন্ট আমদানি করতে main.py সম্পাদনা করুন:

    from google.cloud import pubsub_v1
    

Google Workspace সাবস্ক্রিপশন তৈরি করুন

Meet ইভেন্টগুলিতে সাবস্ক্রাইব করার পদ্ধতি নির্ধারণ করতে main.py তে নিম্নলিখিত কোডটি যোগ করুন। এই কোডটি একটি মিটিং স্পেসের জন্য সমস্ত ইভেন্টে সাবস্ক্রাইব করে। সাবস্ক্রাইব করা হলে, ইভেন্টগুলি Pub/Sub টপিকে পোস্ট করা হয়।

def subscribe_to_space(space_name: str = None, topic_name: str = None):
    """Subscribe to events for a meeting space."""
    session = requests.AuthorizedSession(USER_CREDENTIALS)
    body = {
        'targetResource': f"//meet.googleapis.com/{space_name}",
        "eventTypes": [
            "google.workspace.meet.conference.v2.started",
            "google.workspace.meet.conference.v2.ended",
            "google.workspace.meet.participant.v2.joined",
            "google.workspace.meet.participant.v2.left",
            "google.workspace.meet.recording.v2.fileGenerated",
            "google.workspace.meet.transcript.v2.fileGenerated",
        ],
        "payloadOptions": {
            "includeResource": False,
        },
        "notificationEndpoint": {
            "pubsubTopic": topic_name
        },
        "ttl": "86400s",
    }
    response = session.post("https://workspaceevents.googleapis.com/v1/subscriptions", json=body)
    return response

এরপর, ইভেন্টগুলি টানতে এবং প্রক্রিয়া করার জন্য সংশ্লিষ্ট কোডটি যোগ করুন।

ঘটনাগুলি শুনুন এবং পরিচালনা করুন

main.py সম্পাদনা করা চালিয়ে যান এবং নিম্নলিখিত নমুনা কোডটি যোগ করুন। এই কোডটি রিসিভিং সাইডটি প্রয়োগ করে এবং ইভেন্টগুলি উপলব্ধ হওয়ার সাথে সাথে টেনে আনতে Google Cloud Pub/Sub API ব্যবহার করে। বিভিন্ন হ্যান্ডলার পদ্ধতি সংশ্লিষ্ট ইভেন্টগুলি সম্পর্কে তথ্য মুদ্রণ করে।

def format_participant(participant: meet.Participant) -> str:
    """Formats a participant for display on the console."""
    if participant.anonymous_user:
        return f"{participant.anonymous_user.display_name} (Anonymous)"

    if participant.signedin_user:
        return f"{participant.signedin_user.display_name} (ID: {participant.signedin_user.user})"

    if participant.phone_user:
        return f"{participant.phone_user.display_name} (Phone)"

    return "Unknown participant"


def fetch_participant_from_session(session_name: str) -> meet.Participant:
    """Fetches the participant for a session."""
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    # Use the parent path of the session to fetch the participant details
    parsed_session_path = client.parse_participant_session_path(session_name)
    participant_resource_name = client.participant_path(
        parsed_session_path["conference_record"],
        parsed_session_path["participant"])
    return client.get_participant(name=participant_resource_name)


def on_conference_started(message: pubsub_v1.subscriber.message.Message):
    """Display information about a conference when started."""
    payload = json.loads(message.data)
    resource_name = payload.get("conferenceRecord").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    conference = client.get_conference_record(name=resource_name)
    print(f"Conference (ID {conference.name}) started at {conference.start_time.rfc3339()}")


def on_conference_ended(message: pubsub_v1.subscriber.message.Message):
    """Display information about a conference when ended."""
    payload = json.loads(message.data)
    resource_name = payload.get("conferenceRecord").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    conference = client.get_conference_record(name=resource_name)
    print(f"Conference (ID {conference.name}) ended at {conference.end_time.rfc3339()}")


def on_participant_joined(message: pubsub_v1.subscriber.message.Message):
    """Display information about a participant when they join a meeting."""
    payload = json.loads(message.data)
    resource_name = payload.get("participantSession").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    session = client.get_participant_session(name=resource_name)
    participant = fetch_participant_from_session(resource_name)
    display_name = format_participant(participant)
    print(f"{display_name} joined at {session.start_time.rfc3339()}")


def on_participant_left(message: pubsub_v1.subscriber.message.Message):
    """Display information about a participant when they leave a meeting."""
    payload = json.loads(message.data)
    resource_name = payload.get("participantSession").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    session = client.get_participant_session(name=resource_name)
    participant = fetch_participant_from_session(resource_name)
    display_name = format_participant(participant)
    print(f"{display_name} left at {session.end_time.rfc3339()}")


def on_recording_ready(message: pubsub_v1.subscriber.message.Message):
    """Display information about a recorded meeting when artifact is ready."""
    payload = json.loads(message.data)
    resource_name = payload.get("recording").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    recording = client.get_recording(name=resource_name)
    print(f"Recording available at {recording.drive_destination.export_uri}")


def on_transcript_ready(message: pubsub_v1.subscriber.message.Message):
    """Display information about a meeting transcript when artifact is ready."""
    payload = json.loads(message.data)
    resource_name = payload.get("transcript").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    transcript = client.get_transcript(name=resource_name)
    print(f"Transcript available at {transcript.docs_destination.export_uri}")


def on_message(message: pubsub_v1.subscriber.message.Message) -> None:
    """Handles an incoming event from the Google Cloud Pub/Sub API."""
    event_type = message.attributes.get("ce-type")
    handler = {
        "google.workspace.meet.conference.v2.started": on_conference_started,
        "google.workspace.meet.conference.v2.ended": on_conference_ended,
        "google.workspace.meet.participant.v2.joined": on_participant_joined,
        "google.workspace.meet.participant.v2.left": on_participant_left,
        "google.workspace.meet.recording.v2.fileGenerated": on_recording_ready,
        "google.workspace.meet.transcript.v2.fileGenerated": on_transcript_ready,
    }.get(event_type)

    try:
        if handler is not None:
            handler(message)
        message.ack()
    except Exception as error:
        print("Unable to process event")
        print(error)


def listen_for_events(subscription_name: str = None):
    """Subscribe to events on the subscription."""
    subscriber = pubsub_v1.SubscriberClient()
    with subscriber:
        future = subscriber.subscribe(subscription_name, callback=on_message)
        print("Listening for events")
        try:
            future.result()
        except KeyboardInterrupt:
            future.cancel()
    print("Done")

কোডটি চূড়ান্ত করুন

স্পেস তৈরি, ইভেন্ট সাবস্ক্রাইব এবং লিসেনিং এর পদ্ধতিগুলি কল করার জন্য নিম্নলিখিত কোডটি main.py তে যোগ করুন। TOPIC_NAME এবং SUBSCRIPTION_NAME ধ্রুবকগুলিকে আপনার নিজস্ব বিষয় এবং সাবস্ক্রিপশন নাম দিয়ে আপডেট করুন যা আপনি পূর্বে তৈরি করেছেন।

  1. main.py তে কোডটি যোগ করুন:

    space = create_space()
    print(f"Join the meeting at {space.meeting_uri}")
    
    TOPIC_NAME = "projects/PROJECT_ID/topics/TOPIC_ID"
    SUBSCRIPTION_NAME = "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"
    
    subscription = subscribe_to_space(topic_name=TOPIC_NAME, space_name=space.name)
    if (subscription.status_code) == 200:
        listen_for_events(subscription_name=SUBSCRIPTION_NAME)
    else:
        print(f"Subscription to Meet events failed, response data: {subscription.content}")
    

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PROJECT_ID : আপনার অ্যাপের জন্য অনন্য ক্লাউড প্রজেক্ট আইডি, যেমন my-sample-project-191923

    • TOPIC_ID : আপনার ক্লাউড প্রোজেক্টে তৈরি করা পাব/সাব টপিকের নাম।

    • SUBSCRIPTION_ID : আপনার সাবস্ক্রিপশনের নাম, যেমন workspace-events-sub

  2. প্রোগ্রামটি চালান:

    python3 main.py

যদি আপনি আগে প্রোগ্রামটি না চালান, তাহলে এটি প্রথমবার অনুমোদনের জন্য অনুরোধ করবে। Meet REST API কল করার জন্য অ্যাপ্লিকেশনটিতে অ্যাক্সেস দিন। প্রোগ্রামটি সফলভাবে চালানোর পরে, আপনি এর মতো আউটপুট দেখতে পাবেন:

Join the meeting at https://meet.google.com/abc-mnop-xyz

সম্মেলনে যোগদান করুন

অ্যাপ্লিকেশনের জন্য ইভেন্ট তৈরি করতে, অ্যাপ্লিকেশন দ্বারা প্রদর্শিত URL ব্যবহার করে কনফারেন্সে যোগদান করুন। যোগদানের পরে, ইভেন্টগুলি ট্রিগার করার জন্য আপনি এই পদক্ষেপগুলি চেষ্টা করতে পারেন:

  • চলে যান এবং মিটিংয়ে আবার যোগ দিন।
  • অন্যদের আমন্ত্রণ জানান অথবা আপনার ফোন দিয়ে ডায়াল করুন।
  • রেকর্ডিং এবং ট্রান্সক্রিপ্ট সক্ষম করুন।

এই প্রতিটি কার্যকলাপ একটি ইভেন্ট তৈরি করে যা অ্যাপ্লিকেশনটি গ্রহণ করে এবং Google ক্লাউড কনসোলে লগ করে।

আপনার কাজ শেষ হয়ে গেলে প্রোগ্রামটি বন্ধ করতে ctrl-c ব্যবহার করুন।

ঐচ্ছিক: চেষ্টা করার জন্য অতিরিক্ত পদক্ষেপ

অ্যাপটি ইভেন্ট সম্পর্কে প্রাথমিক বিবরণ লগ করে। Meet REST API অন্বেষণ চালিয়ে যেতে, এই অতিরিক্ত ক্রিয়াগুলি সম্পাদন করার জন্য অ্যাপ্লিকেশনটি পরিবর্তন করার চেষ্টা করুন।

  • সাইন-ইন করা অংশগ্রহণকারীদের সম্পর্কে অতিরিক্ত তথ্য পুনরুদ্ধার করতে People API ব্যবহার করুন।

    def subscribe_to_user(user_name: str = None, topic_name: str = None) -> requests_lib.Response:
        """Subscribe to events for a user."""
        session = requests.AuthorizedSession(USER_CREDENTIALS)
        body = {
            "targetResource": f"//cloudidentity.googleapis.com/users/{user_name}",
            "eventTypes": [
                "google.workspace.meet.conference.v2.started",
                "google.workspace.meet.conference.v2.ended",
                "google.workspace.meet.participant.v2.joined",
                "google.workspace.meet.participant.v2.left",
                "google.workspace.meet.recording.v2.fileGenerated",
                "google.workspace.meet.transcript.v2.fileGenerated",
            ],
            "payloadOptions": {
                "includeResource": False,
            },
            "notificationEndpoint": {"pubsubTopic": topic_name},
            "ttl": "86400s",
        }
        response = session.post(
            "https://workspaceevents.googleapis.com/v1/subscriptions", json=body
        )
        return response
    
    service = build("people", "v1", credentials=USER_CREDENTIALS)
    response = (
        service.people()
        .get(resourceName="people/me", personFields="names,emailAddresses")
        .execute()
    )
    resource_name = response.get("resourceName")
    if resource_name.startswith("people/"):
        resource_name = resource_name[len("people/") :]
    
    subscription = subscribe_to_user(topic_name=TOPIC_NAME, user_name=resource_name)
    

    উপরের শংসাপত্রের নমুনাগুলিতে অনুমোদন পদ্ধতিতে "https://www.googleapis.com/auth/userinfo.profile" যোগ করতে ভুলবেন না।

  • রেকর্ডিং এবং ট্রান্সক্রিপ্ট ডাউনলোড করতে গুগল ড্রাইভ এপিআই ব্যবহার করুন।

  • গুগল ড্রাইভ থেকে ট্রান্সক্রিপ্ট ডাউনলোড করার পরিবর্তে, Meet REST API-তে স্ট্রাকচার্ড ট্রান্সক্রিপ্ট পদ্ধতি ব্যবহার করে সেগুলি পুনরুদ্ধার করুন।

  • স্থান তৈরি করার পরিবর্তে স্থান পান

    def get_space(meeting_code: str) -> meet.Space:
        """Get a meeting space."""
        client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
        return client.get_space(name="spaces/" + meeting_code)
    

    উপরের শংসাপত্রের নমুনাগুলিতে অনুমোদন পদ্ধতিতে "https://www.googleapis.com/auth/meetings.space.readonly" যোগ করতে ভুলবেন না।

ঐচ্ছিক: পরিষ্কার করুন

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলির জন্য আপনার Google ক্লাউড কনসোল অ্যাকাউন্টে চার্জ এড়াতে, আমরা আপনাকে তৈরি করা যেকোনো রিসোর্স এবং প্রকল্প পরিষ্কার করার পরামর্শ দিচ্ছি।

সাবস্ক্রিপশন মুছে ফেলতে:

কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > পাব/সাব > সাবস্ক্রিপশনে যান।

    সাবস্ক্রিপশনে যান

  2. সাবস্ক্রিপশনটি নির্বাচন করুন এবং More actions এ ক্লিক করুন।

  3. Delete এ ক্লিক করুন। Delete subscription উইন্ডোটি প্রদর্শিত হবে।

  4. মুছে ফেলুন ক্লিক করুন।

জিক্লাউড সিএলআই

  1. সাবস্ক্রিপশন মুছে ফেলুন:

    gcloud pubsub subscriptions delete SUBSCRIPTION_NAME

বিষয় মুছে ফেলার জন্য:

কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > পাব/সাব > বিষয়গুলিতে যান

    বিষয়গুলিতে যান

  2. বিষয় নির্বাচন করুন এবং More actions এ ক্লিক করুন।

  3. মুছে ফেলুন ক্লিক করুন। বিষয় মুছে ফেলার উইন্ডোটি প্রদর্শিত হবে।

  4. delete লিখুন এবং তারপর Delete এ ক্লিক করুন।

জিক্লাউড সিএলআই

  1. বিষয় মুছে ফেলুন:

    gcloud pubsub topics delete TOPIC_NAME

প্রকল্পটি মুছে ফেলার জন্য:

কনসোল

  1. গুগল ক্লাউড কনসোলে, রিসোর্স পরিচালনা পৃষ্ঠায় যান। মেনু > IAM & Admin > রিসোর্স পরিচালনা করুন এ ক্লিক করুন।

    রিসোর্স ম্যানেজারে যান

  2. প্রকল্পের তালিকায়, আপনি যে প্রকল্পটি মুছতে চান তা নির্বাচন করুন এবং তারপরে মুছুন মুছে ফেলুন করুন।
  3. ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলতে Shut down এ ক্লিক করুন।

জিক্লাউড সিএলআই

  1. একটি প্রকল্প মুছে ফেলার জন্য, gcloud প্রকল্পগুলি মুছে ফেলার কমান্ডটি ব্যবহার করুন:

    gcloud projects delete PROJECT_ID
,

এই টিউটোরিয়ালটি দেখায় যে কীভাবে Google Workspace Events API এবং Google Cloud Pub/Sub-এর সাথে Google Meet REST API ব্যবহার করে Meet মিটিং স্পেসে ইভেন্টগুলি পর্যবেক্ষণ এবং প্রতিক্রিয়া জানাতে হয়। নমুনা অ্যাপ্লিকেশনটি কখন কনফারেন্স শুরু হয় এবং শেষ হয়, কখন অংশগ্রহণকারীরা যোগ দেয় বা চলে যায় এবং কখন কোনও জেনারেটেড মিটিং আর্টিফ্যাক্ট উপলব্ধ থাকে তা রেকর্ড করে।

নির্দিষ্ট কোনও মিটিং স্পেসে সাবস্ক্রাইব করার পরিবর্তে, আপনি কোনও Meet ব্যবহারকারীর সাবস্ক্রাইব করতে পারেন যাতে ব্যবহারকারীর মালিকানাধীন বা সংগঠিত যেকোনো মিটিং স্পেসের ইভেন্টগুলি গ্রহণ করা যায়। বিস্তারিত জানার জন্য, Google Workspace Events API ডকুমেন্টেশনে "Google Meet ইভেন্টগুলিতে সাবস্ক্রাইব করুন" দেখুন।

পূর্বশর্ত

আপনার প্রতিষ্ঠানের জন্য যদি এই পূর্বশর্তগুলির কোনওটি চালু করার প্রয়োজন হয়, তাহলে আপনার Google Workspace অ্যাডমিনিস্ট্রেটরকে সেগুলি চালু করতে বলুন:

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

এই বিভাগটি দেখায় কিভাবে আপনার স্থানীয় পরিবেশ এবং এই টিউটোরিয়ালের জন্য Google ক্লাউড প্রকল্প তৈরি এবং কনফিগার করবেন।

একটি কার্যকরী ডিরেক্টরি এবং পাইথন ভার্চুয়াল পরিবেশ তৈরি করুন

একটি নতুন ভার্চুয়াল পরিবেশ তৈরি এবং সক্রিয় করতে, আপনার টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান।

লিনাক্স/ম্যাকওএস

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
source env/bin/activate

উইন্ডোজ (কমান্ড প্রম্পট)

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.bat

উইন্ডোজ (পাওয়ারশেল)

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.ps1

একটি গুগল ক্লাউড প্রকল্প তৈরি করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > IAM & Admin > Create a Project এ যান।

    একটি প্রকল্প তৈরি করুন বিভাগে যান।

  2. প্রকল্পের নাম ক্ষেত্রে, আপনার প্রকল্পের জন্য একটি বর্ণনামূলক নাম লিখুন।

    ঐচ্ছিক: প্রজেক্ট আইডি সম্পাদনা করতে, সম্পাদনা ক্লিক করুন। প্রজেক্ট তৈরির পরে প্রজেক্ট আইডি পরিবর্তন করা যাবে না, তাই এমন একটি আইডি বেছে নিন যা প্রজেক্টের জীবনকাল ধরে আপনার চাহিদা পূরণ করে।

  3. আপনার প্রকল্পের সম্ভাব্য অবস্থানগুলি প্রদর্শন করতে "স্থান" ক্ষেত্রে "ব্রাউজ" এ ক্লিক করুন। তারপর, " নির্বাচন করুন" এ ক্লিক করুন।
  4. তৈরি করুন এ ক্লিক করুন। গুগল ক্লাউড কনসোল ড্যাশবোর্ড পৃষ্ঠায় নেভিগেট করে এবং কয়েক মিনিটের মধ্যেই আপনার প্রকল্প তৈরি হয়ে যায়।

জিক্লাউড সিএলআই

নিম্নলিখিত ডেভেলপমেন্ট পরিবেশগুলির মধ্যে একটিতে, Google Cloud CLI ( gcloud ) অ্যাক্সেস করুন:

  • ক্লাউড শেল : gcloud CLI ইতিমধ্যেই সেট আপ করা আছে এমন একটি অনলাইন টার্মিনাল ব্যবহার করতে, ক্লাউড শেল সক্রিয় করুন।
    ক্লাউড শেল সক্রিয় করুন
  • লোকাল শেল : লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট ব্যবহার করতে, gcloud CLI ইনস্টল এবং ইনিশিয়ালাইজ করুন
    ক্লাউড প্রজেক্ট তৈরি করতে, gcloud projects create কমান্ডটি ব্যবহার করুন:
    gcloud projects create PROJECT_ID
    আপনি যে প্রকল্পটি তৈরি করতে চান তার আইডি সেট করে PROJECT_ID প্রতিস্থাপন করুন।

গুগল ক্লাউড প্রোজেক্টের জন্য বিলিং সক্ষম করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, বিলিং এ যান। মেনু > বিলিং > মাই প্রোজেক্টস এ ক্লিক করুন।

    আমার প্রকল্পের জন্য বিলিং বিভাগে যান।

  2. "একটি প্রতিষ্ঠান নির্বাচন করুন" বিভাগে , আপনার Google ক্লাউড প্রকল্পের সাথে সম্পর্কিত প্রতিষ্ঠানটি বেছে নিন।
  3. প্রজেক্ট সারিতে, অ্যাকশন মেনু ( ) খুলুন, বিলিং পরিবর্তন করুন এ ক্লিক করুন এবং ক্লাউড বিলিং অ্যাকাউন্টটি নির্বাচন করুন।
  4. অ্যাকাউন্ট সেট করুন ক্লিক করুন।

জিক্লাউড সিএলআই

  1. উপলব্ধ বিলিং অ্যাকাউন্টগুলির তালিকা তৈরি করতে, চালান:
    gcloud billing accounts list
  2. একটি Google ক্লাউড প্রকল্পের সাথে একটি বিলিং অ্যাকাউন্ট লিঙ্ক করুন:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PROJECT_ID হল সেই ক্লাউড প্রকল্পের প্রকল্প আইডি যার জন্য আপনি বিলিং সক্ষম করতে চান।
    • BILLING_ACCOUNT_ID হল Google ক্লাউড প্রকল্পের সাথে লিঙ্ক করার জন্য বিলিং অ্যাকাউন্ট আইডি

প্রমাণীকরণ এবং অনুমোদন সেট আপ করুন

প্রমাণীকরণ এবং অনুমোদন অ্যাপটিকে Meet REST API রিসোর্স অ্যাক্সেস করতে দেয়। Meet REST API কল করার জন্য ব্যবহারকারীর অনুমোদন প্রয়োজন। এই বিভাগটি আপনাকে কীভাবে ব্যবহারকারীর শংসাপত্র কনফিগার করতে হয় এবং অনুমোদনের জন্য অনুরোধ করতে হয় তা দেখায়।

OAuth সম্মতি স্ক্রিন কনফিগার করুন এবং স্কোপ বেছে নিন

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

  1. গুগল ক্লাউড কনসোলে, মেনু > এ যানGoogle Auth platform > ব্র্যান্ডিং

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

  2. যদি আপনি ইতিমধ্যেই কনফিগার করে থাকেন Google Auth platform, আপনি ব্র্যান্ডিং , অডিয়েন্স এবং ডেটা অ্যাক্সেসে নিম্নলিখিত OAuth কনসেন্ট স্ক্রিন সেটিংস কনফিগার করতে পারেন। যদি আপনি এমন একটি বার্তা দেখতে পান যা বলে Google Auth platform এখনও কনফিগার করা হয়নি , শুরু করুন ক্লিক করুন:
    1. অ্যাপ তথ্যের অধীনে, অ্যাপের নামে , Meet REST API Tutorial লিখুন।
    2. ব্যবহারকারীর সহায়তা ইমেল বিভাগে, এমন একটি সহায়তা ইমেল ঠিকানা বেছে নিন যেখানে ব্যবহারকারীদের সম্মতি সম্পর্কে প্রশ্ন থাকলে তারা আপনার সাথে যোগাযোগ করতে পারবেন।
    3. পরবর্তী ক্লিক করুন।
    4. অডিয়েন্স এর অধীনে, অভ্যন্তরীণ নির্বাচন করুন।
    5. পরবর্তী ক্লিক করুন।
    6. যোগাযোগের তথ্য এর অধীনে, একটি ইমেল ঠিকানা লিখুন যেখানে আপনার প্রকল্পের যেকোনো পরিবর্তন সম্পর্কে আপনাকে অবহিত করা যেতে পারে।
    7. পরবর্তী ক্লিক করুন।
    8. Finish এর অধীনে, Google API পরিষেবা ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং যদি আপনি সম্মত হন, তাহলে আমি Google API পরিষেবাগুলিতে সম্মত: ব্যবহারকারীর ডেটা নীতি নির্বাচন করুন।
    9. চালিয়ে যান ক্লিক করুন।
    10. তৈরি করুন ক্লিক করুন।
    11. যদি আপনি ব্যবহারকারীর ধরণের জন্য External নির্বাচন করে থাকেন, তাহলে পরীক্ষামূলক ব্যবহারকারী যোগ করুন:
      1. দর্শক ক্লিক করুন।
      2. ব্যবহারকারীদের পরীক্ষা করুন এর অধীনে, ব্যবহারকারীদের যোগ করুন এ ক্লিক করুন।
      3. আপনার ইমেল ঠিকানা এবং অন্য কোনও অনুমোদিত পরীক্ষা ব্যবহারকারী লিখুন, তারপর সংরক্ষণ করুন ক্লিক করুন।
  3. Data Access > Add or Remove Scopes এ ক্লিক করুন। আপনার Google Cloud Project এ সক্ষম করা প্রতিটি API এর জন্য স্কোপের তালিকা সহ একটি প্যানেল প্রদর্শিত হবে।
  4. Manually add scopes এর অধীনে, নিম্নলিখিত scopes টি পেস্ট করুন:
    • https://www.googleapis.com/auth/meetings.space.created
  5. টেবিলে যোগ করুন ক্লিক করুন।
  6. আপডেট ক্লিক করুন।
  7. আপনার অ্যাপের জন্য প্রয়োজনীয় স্কোপ নির্বাচন করার পরে, সংরক্ষণ করুন এ ক্লিক করুন।

OAuth সম্মতি কনফিগার করার বিষয়ে আরও তথ্যের জন্য, দেখুন শুরু করুন Google Auth platform .

একটি ক্লায়েন্ট আইডি তৈরি করুন

OAuth 2.0 প্রবাহের সময় ক্লায়েন্ট আইডি আপনার অ্যাপ্লিকেশনের জন্য শংসাপত্র হিসেবে কাজ করে। যেহেতু অ্যাপটি স্থানীয়ভাবে চলে, তাই একটি ডেস্কটপ ক্লায়েন্ট আইডি তৈরি করুন।

  1. গুগল ক্লাউড কনসোলে, মেনু > এ যানGoogle Auth platform > ক্লায়েন্ট

    ক্লায়েন্টদের তালিকায় যান

  2. ক্লায়েন্ট তৈরি করুন ক্লিক করুন।
  3. অ্যাপ্লিকেশনের ধরণ > ডেস্কটপ অ্যাপ ক্লিক করুন।
  4. নাম ক্ষেত্রে, শংসাপত্রের জন্য একটি নাম টাইপ করুন। এই নামটি শুধুমাত্র Google ক্লাউড কনসোলে দেখানো হবে।
  5. তৈরি করুন ক্লিক করুন।

    নতুন তৈরি শংসাপত্রটি "OAuth 2.0 ক্লায়েন্ট আইডি" এর অধীনে প্রদর্শিত হবে।

গুগল অথ লাইব্রেরি ইনস্টল করুন

গুগল অথ লাইব্রেরি ইনস্টল করুন:

pip install google-auth google-auth-oauthlib

অনুমোদন কার্যকর করুন

Meet REST API-এর জন্য OAuth 2.0 অ্যাক্সেস টোকেনের আকারে ব্যবহারকারীর শংসাপত্র প্রয়োজন। এই বিভাগে, আপনি ব্যবহারকারীর জন্য একটি অ্যাক্সেস টোকেন এবং একটি রিফ্রেশ টোকেনের অনুরোধ করতে OAuth 2.0 ফ্লো বাস্তবায়ন করেন।

  1. আপনার ওয়ার্কিং ডিরেক্টরিতে, main.py ফাইলটি তৈরি করুন এবং নিম্নলিখিত বিষয়বস্তু যোগ করুন:

    import os
    import json
    
    from google.auth.transport import requests
    from google.oauth2.credentials import Credentials
    from google_auth_oauthlib.flow import InstalledAppFlow
    
    def authorize() -> Credentials:
        """Ensure valid credentials for calling the Meet REST API."""
        CLIENT_SECRET_FILE = "./client_secret.json"
        credentials = None
    
        if os.path.exists('token.json'):
            credentials = Credentials.from_authorized_user_file('token.json')
    
        if credentials is None:
            flow = InstalledAppFlow.from_client_secrets_file(
                CLIENT_SECRET_FILE,
                scopes=[
                    'https://www.googleapis.com/auth/meetings.space.created',
                ])
            flow.run_local_server(port=0)
            credentials = flow.credentials
    
        if credentials and credentials.expired:
            credentials.refresh(requests.Request())
    
        if credentials is not None:
            with open("token.json", "w") as f:
                f.write(credentials.to_json())
    
        return credentials
    
    USER_CREDENTIALS = authorize()
    
  2. কোডটি চালানোর জন্য, ক্লায়েন্ট আইডি এবং পূর্বে তৈরি করা গোপনীয়তা উভয়ই প্রয়োজন। ডাউনলোড করা ক্লায়েন্ট গোপন ফাইলটি প্রজেক্ট ওয়ার্কিং ডিরেক্টরিতে কপি করুন এবং এটির নাম পরিবর্তন করুন client_secret.json

  3. যদি আপনি অনুমোদন কীভাবে কাজ করে তা পরীক্ষা করতে চান, তাহলে নিম্নলিখিত কমান্ডটি চালান। অ্যাপটি অনুমোদনের জন্য অনুরোধ করে এবং অনুরোধ অনুমোদিত হওয়ার পরে প্রকল্পের কার্যকরী ডিরেক্টরিতে একটি token.json ফাইল তৈরি করে।

    python3 main.py

Meet REST API যোগ করুন

এখন অনুমোদন কোড সম্পূর্ণ হয়ে গেছে, এখন Meet REST API সক্রিয় এবং কল করার সময়।

API গুলি সক্ষম করুন

যদিও এই বিভাগটি Meet REST API-এর উপর দৃষ্টি নিবদ্ধ করে, এই টিউটোরিয়ালটি Google Cloud Pub/Sub এবং Google Workspace Events APIও ব্যবহার করে।

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, গুগল মিট REST API, গুগল ওয়ার্কস্পেস ইভেন্টস API এবং গুগল ক্লাউড পাব/সাব সক্ষম করুন।

    API গুলি সক্ষম করুন

  2. নিশ্চিত করুন যে আপনি সঠিক ক্লাউড প্রজেক্টে API গুলি সক্রিয় করছেন, তারপর Next এ ক্লিক করুন।

  3. নিশ্চিত করুন যে আপনি সঠিক API গুলি সক্রিয় করছেন, তারপর সক্ষম করুন এ ক্লিক করুন।

জিক্লাউড সিএলআই

  1. প্রয়োজনে, বর্তমান ক্লাউড প্রজেক্টটিকে gcloud config set project কমান্ড দিয়ে তৈরি করা প্রজেক্টে সেট করুন:

    gcloud config set project PROJECT_ID

    আপনার তৈরি করা ক্লাউড প্রোজেক্টের প্রোজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

  2. gcloud services enable কমান্ড ব্যবহার করে Google Meet REST API, Google Workspace Events API এবং Google Cloud Pub/Sub সক্ষম করুন:

    gcloud services enable meet.googleapis.com workspaceevents.googleapis.com pubsub.googleapis.com

Meet REST API ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন

Meet REST API ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. কমান্ডটি চালান:

    pip install google-apps-meet
  2. ক্লায়েন্ট আমদানি করতে main.py ফাইলটি সম্পাদনা করুন:

    from google.apps import meet_v2 as meet
    

একটি স্থান তৈরি করুন

এখন যেহেতু Meet REST API উপলব্ধ, সাবস্ক্রাইব করা যেতে পারে এমন একটি মিটিং স্পেস তৈরি করার জন্য একটি ফাংশন সংজ্ঞায়িত করুন।

main.py সম্পাদনা করুন এবং যোগ করুন:

def create_space() -> meet.Space:
    """Create a meeting space."""
    client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
    request = meet.CreateSpaceRequest()
    return client.create_space(request=request)

ইভেন্টগুলিতে সাবস্ক্রাইব করুন

মিটিং স্পেস সম্পর্কে ইভেন্টগুলি পেতে, আপনাকে Google Workspace Events API ব্যবহার করে একটি সাবস্ক্রিপশন তৈরি করতে হবে। আপনাকে অবশ্যই একটি Google Cloud Pub/Sub বিষয় তৈরি এবং সাবস্ক্রাইব করতে হবে যা বিজ্ঞপ্তির শেষ বিন্দু হিসেবে কাজ করে যেখানে আপনার অ্যাপ ইভেন্টগুলি গ্রহণ করে।

গুগল ক্লাউড পাব/সাব কনফিগার করুন

একটি পাব/সাব বিষয় তৈরি এবং সাবস্ক্রাইব করতে:

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > পাব/সাব এ যান।

    পাব/সাব-এ যান

    আপনার অ্যাপের জন্য ক্লাউড প্রজেক্টটি নির্বাচন করা আছে কিনা তা নিশ্চিত করুন।

  2. ক্লিক করুন বিষয় তৈরি করুন এবং নিম্নলিখিতগুলি করুন:
    1. বিষয়ের নাম হিসেবে workspace-events লিখুন।
    2. একটি ডিফল্ট সাবস্ক্রিপশন যোগ করুন নির্বাচিত ছেড়ে দিন।
    3. তৈরি করুন এ ক্লিক করুন। আপনার সম্পূর্ণ বিষয়ের নামটি projects/{project}/topics/{topic} হিসাবে ফর্ম্যাট করা হয়েছে। পরবর্তী ধাপগুলিতে ব্যবহারের জন্য এই নামটি একটি নোট করুন।
  3. আপনার বিষয়ে পাব/সাব বার্তা প্রকাশের অ্যাক্সেস দিন:
    1. পাশের প্যানেলে, অনুমতি ট্যাবটি খুলুন।
    2. প্রিন্সিপাল যোগ করুন ক্লিক করুন।
    3. নতুন প্রিন্সিপালগুলিতে , meet-api-event-push@system.gserviceaccount.com লিখুন।
    4. অ্যাসাইন রোলগুলিতে , Pub/Sub Publisher নির্বাচন করুন।
    5. সংরক্ষণ করুন ক্লিক করুন।

    আপনার বিষয়ের অনুমতি আপডেট করতে কয়েক মিনিট সময় লাগতে পারে।

জিক্লাউড সিএলআই

  1. আপনার ক্লাউড প্রজেক্টে, নিম্নলিখিতগুলি চালিয়ে একটি বিষয় তৈরি করুন:
    gcloud pubsub topics create workspace-events

    আউটপুটটি সম্পূর্ণ বিষয়ের নাম প্রদর্শন করে, যা projects/{project}/topics/{topic} হিসাবে ফর্ম্যাট করা হয়েছে। পরবর্তী ধাপগুলিতে ব্যবহারের জন্য এই নামটি একটি নোট করুন।

  2. আপনার বিষয়ে বার্তা প্রকাশের অ্যাক্সেস দিন:
     gcloud pubsub topics add-iam-policy-binding workspace-events --member='serviceAccount:meet-api-event-push@system.gserviceaccount.com' --role='roles/pubsub.publisher'

    আপনার বিষয়ের অনুমতি আপডেট করতে কয়েক মিনিট সময় লাগতে পারে।

  3. এই বিষয়ের জন্য একটি পাব/সাব সাবস্ক্রিপশন তৈরি করুন:
    gcloud pubsub subscriptions create workspace-events-sub --topic=TOPIC_NAME

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • TOPIC_NAME : আপনার আগের ধাপে তৈরি করা বিষয়ের নাম।

টপিকের নামটি নোট করে রাখুন এবং নিশ্চিত করুন যে {project} এর মানটি আপনার অ্যাপের ক্লাউড প্রোজেক্ট আইডি। পরে আপনি টপিকের নামটি ব্যবহার করে Google Workspace সাবস্ক্রিপশন তৈরি করবেন।

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > IAM & Admin > পরিষেবা অ্যাকাউন্ট এ যান।

    পরিষেবা অ্যাকাউন্টগুলিতে যান।

  2. পরিষেবা অ্যাকাউন্ট তৈরি করুন ক্লিক করুন।
  3. পরিষেবা অ্যাকাউন্টের বিবরণ পূরণ করুন, তারপর তৈরি করুন এবং চালিয়ে যান ক্লিক করুন।
  4. "এই পরিষেবা অ্যাকাউন্টকে প্রকল্পে অ্যাক্সেস প্রদান করুন" বিভাগে, নিম্নলিখিত ভূমিকাগুলি যোগ করুন:
    • roles/pubsub.subscriber
  5. চালিয়ে যান ক্লিক করুন।
  6. ঐচ্ছিক: এই পরিষেবা অ্যাকাউন্টের মাধ্যমে পরিচালনা এবং কার্য সম্পাদন করতে পারে এমন ব্যবহারকারী বা গোষ্ঠীগুলি লিখুন। আরও বিস্তারিত জানার জন্য, পরিষেবা অ্যাকাউন্ট ছদ্মবেশ পরিচালনা দেখুন।
  7. সম্পন্ন ক্লিক করুন। পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানাটি লিখে রাখুন।

জিক্লাউড সিএলআই

  1. পরিষেবা অ্যাকাউন্ট তৈরি করুন:
    gcloud iam service-accounts create meet-event-listener \
      --display-name="meet-event-listener"
  2. পরিষেবা অ্যাকাউন্টে প্রয়োজনীয় ভূমিকা প্রদান করুন:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:meet-event-listener@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"

    আপনার Google ক্লাউড প্রোজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

পরিষেবা অ্যাকাউন্ট ব্যবহার করুন

পরিষেবা অ্যাকাউন্ট তৈরি করার পরে, নিজেকে পরিষেবা অ্যাকাউন্টের ছদ্মবেশ ধারণ করার অনুমতি দিন।

গুগল ক্লাউড কনসোল

  1. নতুন তৈরি পরিষেবা অ্যাকাউন্টের জন্য অ্যাকশন কলামে, > Manage permissions এ ক্লিক করুন।
  2. কী যোগ করুন > অ্যাক্সেস প্রদান করুন ক্লিক করুন।
  3. Add principals এর অধীনে আপনার ইমেল ঠিকানা লিখুন।
  4. ভূমিকা হিসেবে পরিষেবা অ্যাকাউন্ট > পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর নির্বাচন করুন।
  5. সংরক্ষণ করুন ক্লিক করুন।
  6. আপনার টার্মিনালে ফিরে যান এবং পরিষেবা অ্যাকাউন্টে অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র সেট করতে gcloud দিয়ে সাইন ইন করুন। অনুমোদনের জন্য অনুরোধ করা হলে, পূর্ববর্তী ধাপগুলিতে ব্যবহৃত একই অ্যাকাউন্ট ব্যবহার করে সাইন ইন করুন।
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

জিক্লাউড সিএলআই

  1. অনুমতি যোগ করার জন্য, পরিষেবা অ্যাকাউন্ট এবং ব্যবহারকারীর ইমেল ঠিকানা ব্যবহার করে gcloud iam service-accounts add-iam-policy-binding চালান।
    gcloud iam service-accounts add-iam-policy-binding \
      SERVICE_ACCOUNT_EMAIL \
      --member="user:YOUR_EMAIL" \
      --role="roles/iam.serviceAccountTokenCreator"
  2. পরিষেবা অ্যাকাউন্টে অ্যাপ্লিকেশনের ডিফল্ট শংসাপত্র সেট করতে সাইন ইন করুন। অনুমোদনের জন্য অনুরোধ করা হলে, পূর্ববর্তী ধাপগুলিতে ব্যবহৃত একই অ্যাকাউন্ট ব্যবহার করে সাইন ইন করুন।
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

পাব/সাব ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন

  1. Pub/Sub এর জন্য ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে pip ব্যবহার করুন:

    pip install google-cloud-pubsub
  2. তারপর ক্লায়েন্ট আমদানি করতে main.py সম্পাদনা করুন:

    from google.cloud import pubsub_v1
    

Google Workspace সাবস্ক্রিপশন তৈরি করুন

Meet ইভেন্টগুলিতে সাবস্ক্রাইব করার পদ্ধতি নির্ধারণ করতে main.py তে নিম্নলিখিত কোডটি যোগ করুন। এই কোডটি একটি মিটিং স্পেসের জন্য সমস্ত ইভেন্টে সাবস্ক্রাইব করে। সাবস্ক্রাইব করা হলে, ইভেন্টগুলি Pub/Sub টপিকে পোস্ট করা হয়।

def subscribe_to_space(space_name: str = None, topic_name: str = None):
    """Subscribe to events for a meeting space."""
    session = requests.AuthorizedSession(USER_CREDENTIALS)
    body = {
        'targetResource': f"//meet.googleapis.com/{space_name}",
        "eventTypes": [
            "google.workspace.meet.conference.v2.started",
            "google.workspace.meet.conference.v2.ended",
            "google.workspace.meet.participant.v2.joined",
            "google.workspace.meet.participant.v2.left",
            "google.workspace.meet.recording.v2.fileGenerated",
            "google.workspace.meet.transcript.v2.fileGenerated",
        ],
        "payloadOptions": {
            "includeResource": False,
        },
        "notificationEndpoint": {
            "pubsubTopic": topic_name
        },
        "ttl": "86400s",
    }
    response = session.post("https://workspaceevents.googleapis.com/v1/subscriptions", json=body)
    return response

এরপর, ইভেন্টগুলি টানতে এবং প্রক্রিয়া করার জন্য সংশ্লিষ্ট কোডটি যোগ করুন।

ঘটনাগুলি শুনুন এবং পরিচালনা করুন

main.py সম্পাদনা করা চালিয়ে যান এবং নিম্নলিখিত নমুনা কোডটি যোগ করুন। এই কোডটি রিসিভিং সাইডটি প্রয়োগ করে এবং ইভেন্টগুলি উপলব্ধ হওয়ার সাথে সাথে টেনে আনতে Google Cloud Pub/Sub API ব্যবহার করে। বিভিন্ন হ্যান্ডলার পদ্ধতি সংশ্লিষ্ট ইভেন্টগুলি সম্পর্কে তথ্য মুদ্রণ করে।

def format_participant(participant: meet.Participant) -> str:
    """Formats a participant for display on the console."""
    if participant.anonymous_user:
        return f"{participant.anonymous_user.display_name} (Anonymous)"

    if participant.signedin_user:
        return f"{participant.signedin_user.display_name} (ID: {participant.signedin_user.user})"

    if participant.phone_user:
        return f"{participant.phone_user.display_name} (Phone)"

    return "Unknown participant"


def fetch_participant_from_session(session_name: str) -> meet.Participant:
    """Fetches the participant for a session."""
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    # Use the parent path of the session to fetch the participant details
    parsed_session_path = client.parse_participant_session_path(session_name)
    participant_resource_name = client.participant_path(
        parsed_session_path["conference_record"],
        parsed_session_path["participant"])
    return client.get_participant(name=participant_resource_name)


def on_conference_started(message: pubsub_v1.subscriber.message.Message):
    """Display information about a conference when started."""
    payload = json.loads(message.data)
    resource_name = payload.get("conferenceRecord").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    conference = client.get_conference_record(name=resource_name)
    print(f"Conference (ID {conference.name}) started at {conference.start_time.rfc3339()}")


def on_conference_ended(message: pubsub_v1.subscriber.message.Message):
    """Display information about a conference when ended."""
    payload = json.loads(message.data)
    resource_name = payload.get("conferenceRecord").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    conference = client.get_conference_record(name=resource_name)
    print(f"Conference (ID {conference.name}) ended at {conference.end_time.rfc3339()}")


def on_participant_joined(message: pubsub_v1.subscriber.message.Message):
    """Display information about a participant when they join a meeting."""
    payload = json.loads(message.data)
    resource_name = payload.get("participantSession").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    session = client.get_participant_session(name=resource_name)
    participant = fetch_participant_from_session(resource_name)
    display_name = format_participant(participant)
    print(f"{display_name} joined at {session.start_time.rfc3339()}")


def on_participant_left(message: pubsub_v1.subscriber.message.Message):
    """Display information about a participant when they leave a meeting."""
    payload = json.loads(message.data)
    resource_name = payload.get("participantSession").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    session = client.get_participant_session(name=resource_name)
    participant = fetch_participant_from_session(resource_name)
    display_name = format_participant(participant)
    print(f"{display_name} left at {session.end_time.rfc3339()}")


def on_recording_ready(message: pubsub_v1.subscriber.message.Message):
    """Display information about a recorded meeting when artifact is ready."""
    payload = json.loads(message.data)
    resource_name = payload.get("recording").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    recording = client.get_recording(name=resource_name)
    print(f"Recording available at {recording.drive_destination.export_uri}")


def on_transcript_ready(message: pubsub_v1.subscriber.message.Message):
    """Display information about a meeting transcript when artifact is ready."""
    payload = json.loads(message.data)
    resource_name = payload.get("transcript").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    transcript = client.get_transcript(name=resource_name)
    print(f"Transcript available at {transcript.docs_destination.export_uri}")


def on_message(message: pubsub_v1.subscriber.message.Message) -> None:
    """Handles an incoming event from the Google Cloud Pub/Sub API."""
    event_type = message.attributes.get("ce-type")
    handler = {
        "google.workspace.meet.conference.v2.started": on_conference_started,
        "google.workspace.meet.conference.v2.ended": on_conference_ended,
        "google.workspace.meet.participant.v2.joined": on_participant_joined,
        "google.workspace.meet.participant.v2.left": on_participant_left,
        "google.workspace.meet.recording.v2.fileGenerated": on_recording_ready,
        "google.workspace.meet.transcript.v2.fileGenerated": on_transcript_ready,
    }.get(event_type)

    try:
        if handler is not None:
            handler(message)
        message.ack()
    except Exception as error:
        print("Unable to process event")
        print(error)


def listen_for_events(subscription_name: str = None):
    """Subscribe to events on the subscription."""
    subscriber = pubsub_v1.SubscriberClient()
    with subscriber:
        future = subscriber.subscribe(subscription_name, callback=on_message)
        print("Listening for events")
        try:
            future.result()
        except KeyboardInterrupt:
            future.cancel()
    print("Done")

কোডটি চূড়ান্ত করুন

স্পেস তৈরি, ইভেন্ট সাবস্ক্রাইব এবং লিসেনিং এর পদ্ধতিগুলি কল করার জন্য নিম্নলিখিত কোডটি main.py তে যোগ করুন। TOPIC_NAME এবং SUBSCRIPTION_NAME ধ্রুবকগুলিকে আপনার নিজস্ব বিষয় এবং সাবস্ক্রিপশন নাম দিয়ে আপডেট করুন যা আপনি পূর্বে তৈরি করেছেন।

  1. main.py তে কোডটি যোগ করুন:

    space = create_space()
    print(f"Join the meeting at {space.meeting_uri}")
    
    TOPIC_NAME = "projects/PROJECT_ID/topics/TOPIC_ID"
    SUBSCRIPTION_NAME = "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"
    
    subscription = subscribe_to_space(topic_name=TOPIC_NAME, space_name=space.name)
    if (subscription.status_code) == 200:
        listen_for_events(subscription_name=SUBSCRIPTION_NAME)
    else:
        print(f"Subscription to Meet events failed, response data: {subscription.content}")
    

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PROJECT_ID : আপনার অ্যাপের জন্য অনন্য ক্লাউড প্রজেক্ট আইডি, যেমন my-sample-project-191923

    • TOPIC_ID : আপনার ক্লাউড প্রোজেক্টে তৈরি করা পাব/সাব টপিকের নাম।

    • SUBSCRIPTION_ID : আপনার সাবস্ক্রিপশনের নাম, যেমন workspace-events-sub

  2. প্রোগ্রামটি চালান:

    python3 main.py

যদি আপনি আগে প্রোগ্রামটি না চালান, তাহলে এটি প্রথমবার অনুমোদনের জন্য অনুরোধ করবে। Meet REST API কল করার জন্য অ্যাপ্লিকেশনটিতে অ্যাক্সেস দিন। প্রোগ্রামটি সফলভাবে চালানোর পরে, আপনি এর মতো আউটপুট দেখতে পাবেন:

Join the meeting at https://meet.google.com/abc-mnop-xyz

সম্মেলনে যোগদান করুন

অ্যাপ্লিকেশনের জন্য ইভেন্ট তৈরি করতে, অ্যাপ্লিকেশন দ্বারা প্রদর্শিত URL ব্যবহার করে কনফারেন্সে যোগদান করুন। যোগদানের পরে, ইভেন্টগুলি ট্রিগার করার জন্য আপনি এই পদক্ষেপগুলি চেষ্টা করতে পারেন:

  • চলে যান এবং মিটিংয়ে আবার যোগ দিন।
  • অন্যদের আমন্ত্রণ জানান অথবা আপনার ফোন দিয়ে ডায়াল করুন।
  • রেকর্ডিং এবং ট্রান্সক্রিপ্ট সক্ষম করুন।

এই প্রতিটি কার্যকলাপ একটি ইভেন্ট তৈরি করে যা অ্যাপ্লিকেশনটি গ্রহণ করে এবং Google ক্লাউড কনসোলে লগ করে।

আপনার কাজ শেষ হয়ে গেলে প্রোগ্রামটি বন্ধ করতে ctrl-c ব্যবহার করুন।

ঐচ্ছিক: চেষ্টা করার জন্য অতিরিক্ত পদক্ষেপ

অ্যাপটি ইভেন্ট সম্পর্কে প্রাথমিক বিবরণ লগ করে। Meet REST API অন্বেষণ চালিয়ে যেতে, এই অতিরিক্ত ক্রিয়াগুলি সম্পাদন করার জন্য অ্যাপ্লিকেশনটি পরিবর্তন করার চেষ্টা করুন।

  • সাইন-ইন করা অংশগ্রহণকারীদের সম্পর্কে অতিরিক্ত তথ্য পুনরুদ্ধার করতে People API ব্যবহার করুন।

    def subscribe_to_user(user_name: str = None, topic_name: str = None) -> requests_lib.Response:
        """Subscribe to events for a user."""
        session = requests.AuthorizedSession(USER_CREDENTIALS)
        body = {
            "targetResource": f"//cloudidentity.googleapis.com/users/{user_name}",
            "eventTypes": [
                "google.workspace.meet.conference.v2.started",
                "google.workspace.meet.conference.v2.ended",
                "google.workspace.meet.participant.v2.joined",
                "google.workspace.meet.participant.v2.left",
                "google.workspace.meet.recording.v2.fileGenerated",
                "google.workspace.meet.transcript.v2.fileGenerated",
            ],
            "payloadOptions": {
                "includeResource": False,
            },
            "notificationEndpoint": {"pubsubTopic": topic_name},
            "ttl": "86400s",
        }
        response = session.post(
            "https://workspaceevents.googleapis.com/v1/subscriptions", json=body
        )
        return response
    
    service = build("people", "v1", credentials=USER_CREDENTIALS)
    response = (
        service.people()
        .get(resourceName="people/me", personFields="names,emailAddresses")
        .execute()
    )
    resource_name = response.get("resourceName")
    if resource_name.startswith("people/"):
        resource_name = resource_name[len("people/") :]
    
    subscription = subscribe_to_user(topic_name=TOPIC_NAME, user_name=resource_name)
    

    উপরের শংসাপত্রের নমুনাগুলিতে অনুমোদন পদ্ধতিতে "https://www.googleapis.com/auth/userinfo.profile" যোগ করতে ভুলবেন না।

  • রেকর্ডিং এবং ট্রান্সক্রিপ্ট ডাউনলোড করতে গুগল ড্রাইভ এপিআই ব্যবহার করুন।

  • গুগল ড্রাইভ থেকে ট্রান্সক্রিপ্ট ডাউনলোড করার পরিবর্তে, Meet REST API-তে স্ট্রাকচার্ড ট্রান্সক্রিপ্ট পদ্ধতি ব্যবহার করে সেগুলি পুনরুদ্ধার করুন।

  • স্থান তৈরি করার পরিবর্তে স্থান পান

    def get_space(meeting_code: str) -> meet.Space:
        """Get a meeting space."""
        client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
        return client.get_space(name="spaces/" + meeting_code)
    

    উপরের শংসাপত্রের নমুনাগুলিতে অনুমোদন পদ্ধতিতে "https://www.googleapis.com/auth/meetings.space.readonly" যোগ করতে ভুলবেন না।

ঐচ্ছিক: পরিষ্কার করুন

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলির জন্য আপনার Google ক্লাউড কনসোল অ্যাকাউন্টে চার্জ এড়াতে, আমরা আপনাকে তৈরি করা যেকোনো রিসোর্স এবং প্রকল্প পরিষ্কার করার পরামর্শ দিচ্ছি।

সাবস্ক্রিপশন মুছে ফেলতে:

কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > পাব/সাব > সাবস্ক্রিপশনে যান।

    সাবস্ক্রিপশনে যান

  2. সাবস্ক্রিপশনটি নির্বাচন করুন এবং More actions এ ক্লিক করুন।

  3. Delete এ ক্লিক করুন। Delete subscription উইন্ডোটি প্রদর্শিত হবে।

  4. মুছে ফেলুন ক্লিক করুন।

জিক্লাউড সিএলআই

  1. সাবস্ক্রিপশন মুছে ফেলুন:

    gcloud pubsub subscriptions delete SUBSCRIPTION_NAME

বিষয় মুছে ফেলার জন্য:

কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > পাব/সাব > বিষয়গুলিতে যান

    বিষয়গুলিতে যান

  2. বিষয় নির্বাচন করুন এবং More actions এ ক্লিক করুন।

  3. মুছে ফেলুন ক্লিক করুন। বিষয় মুছে ফেলার উইন্ডোটি প্রদর্শিত হবে।

  4. delete লিখুন এবং তারপর Delete এ ক্লিক করুন।

জিক্লাউড সিএলআই

  1. বিষয় মুছে ফেলুন:

    gcloud pubsub topics delete TOPIC_NAME

প্রকল্পটি মুছে ফেলার জন্য:

কনসোল

  1. গুগল ক্লাউড কনসোলে, রিসোর্স পরিচালনা পৃষ্ঠায় যান। মেনু > IAM & Admin > রিসোর্স পরিচালনা করুন এ ক্লিক করুন।

    রিসোর্স ম্যানেজারে যান

  2. প্রকল্পের তালিকায়, আপনি যে প্রকল্পটি মুছতে চান তা নির্বাচন করুন এবং তারপরে মুছুন মুছে ফেলুন করুন।
  3. ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলতে Shut down এ ক্লিক করুন।

জিক্লাউড সিএলআই

  1. একটি প্রকল্প মুছে ফেলার জন্য, gcloud প্রকল্পগুলি মুছে ফেলার কমান্ডটি ব্যবহার করুন:

    gcloud projects delete PROJECT_ID
,

এই টিউটোরিয়ালটি দেখায় যে কীভাবে Google Workspace Events API এবং Google Cloud Pub/Sub-এর সাথে Google Meet REST API ব্যবহার করে Meet মিটিং স্পেসে ইভেন্টগুলি পর্যবেক্ষণ এবং প্রতিক্রিয়া জানাতে হয়। নমুনা অ্যাপ্লিকেশনটি কখন কনফারেন্স শুরু হয় এবং শেষ হয়, কখন অংশগ্রহণকারীরা যোগ দেয় বা চলে যায় এবং কখন কোনও জেনারেটেড মিটিং আর্টিফ্যাক্ট উপলব্ধ থাকে তা রেকর্ড করে।

নির্দিষ্ট কোনও মিটিং স্পেসে সাবস্ক্রাইব করার পরিবর্তে, আপনি কোনও Meet ব্যবহারকারীর সাবস্ক্রাইব করতে পারেন যাতে ব্যবহারকারীর মালিকানাধীন বা সংগঠিত যেকোনো মিটিং স্পেসের ইভেন্টগুলি গ্রহণ করা যায়। বিস্তারিত জানার জন্য, Google Workspace Events API ডকুমেন্টেশনে "Google Meet ইভেন্টগুলিতে সাবস্ক্রাইব করুন" দেখুন।

পূর্বশর্ত

আপনার প্রতিষ্ঠানের জন্য যদি এই পূর্বশর্তগুলির কোনওটি চালু করার প্রয়োজন হয়, তাহলে আপনার Google Workspace অ্যাডমিনিস্ট্রেটরকে সেগুলি চালু করতে বলুন:

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

এই বিভাগটি দেখায় কিভাবে আপনার স্থানীয় পরিবেশ এবং এই টিউটোরিয়ালের জন্য Google ক্লাউড প্রকল্প তৈরি এবং কনফিগার করবেন।

একটি কার্যকরী ডিরেক্টরি এবং পাইথন ভার্চুয়াল পরিবেশ তৈরি করুন

একটি নতুন ভার্চুয়াল পরিবেশ তৈরি এবং সক্রিয় করতে, আপনার টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান।

লিনাক্স/ম্যাকওএস

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
source env/bin/activate

উইন্ডোজ (কমান্ড প্রম্পট)

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.bat

উইন্ডোজ (পাওয়ারশেল)

mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.ps1

একটি গুগল ক্লাউড প্রকল্প তৈরি করুন

গুগল ক্লাউড কনসোল

  1. গুগল ক্লাউড কনসোলে, মেনু > IAM & Admin > Create a Project এ যান।

    একটি প্রকল্প তৈরি করুন বিভাগে যান।

  2. প্রকল্পের নাম ক্ষেত্রে, আপনার প্রকল্পের জন্য একটি বর্ণনামূলক নাম লিখুন।

    ঐচ্ছিক: প্রজেক্ট আইডি সম্পাদনা করতে, সম্পাদনা ক্লিক করুন। প্রজেক্ট তৈরির পরে প্রজেক্ট আইডি পরিবর্তন করা যাবে না, তাই এমন একটি আইডি বেছে নিন যা প্রজেক্টের জীবনকাল ধরে আপনার চাহিদা পূরণ করে।

  3. আপনার প্রকল্পের সম্ভাব্য অবস্থানগুলি প্রদর্শন করতে "স্থান" ক্ষেত্রে "ব্রাউজ" এ ক্লিক করুন। তারপর, " নির্বাচন করুন" এ ক্লিক করুন।
  4. তৈরি করুন এ ক্লিক করুন। গুগল ক্লাউড কনসোল ড্যাশবোর্ড পৃষ্ঠায় নেভিগেট করে এবং কয়েক মিনিটের মধ্যেই আপনার প্রকল্প তৈরি হয়ে যায়।

জিক্লাউড সিএলআই

নিম্নলিখিত ডেভেলপমেন্ট পরিবেশগুলির মধ্যে একটিতে, Google Cloud CLI ( gcloud ) অ্যাক্সেস করুন:

  • ক্লাউড শেল : gcloud CLI ইতিমধ্যেই সেট আপ করা আছে এমন একটি অনলাইন টার্মিনাল ব্যবহার করতে, ক্লাউড শেল সক্রিয় করুন।
    ক্লাউড শেল সক্রিয় করুন
  • Local Shell : To use a local development environment, install and initialize the gcloud CLI.
    To create a Cloud project, use the gcloud projects create command:
    gcloud projects create PROJECT_ID
    Replace PROJECT_ID by setting the ID for the project you want to create.

Enable billing for the Google Cloud project

গুগল ক্লাউড কনসোল

  1. In the Google Cloud console, go to Billing . Click Menu > Billing > My Projects .

    Go to Billing for My Projects

  2. In Select an organization , choose the organization associated with your Google Cloud project.
  3. In the project row, open the Actions menu ( ), click Change billing , and choose the Cloud Billing account.
  4. Click Set account .

জিক্লাউড সিএলআই

  1. To list available billing accounts, run:
    gcloud billing accounts list
  2. Link a billing account with a Google Cloud project:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PROJECT_ID is the Project ID for the Cloud project for which you want to enable billing.
    • BILLING_ACCOUNT_ID is the billing account ID to link with the Google Cloud project.

Set up authentication and authorization

Authentication and authorization lets the app access Meet REST API resources. User authorization is required to call the Meet REST API. This section hows you how to configure user credentials and request authorization.

OAuth সম্মতি স্ক্রিন কনফিগার করুন এবং স্কোপ বেছে নিন

The following steps suggest placeholder information to configure the OAuth consent screen for your app. Before publishing the app externally, update this information.

  1. গুগল ক্লাউড কনসোলে, মেনু > এ যানGoogle Auth platform > ব্র্যান্ডিং

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

  2. যদি আপনি ইতিমধ্যেই কনফিগার করে থাকেন Google Auth platform, আপনি ব্র্যান্ডিং , অডিয়েন্স এবং ডেটা অ্যাক্সেসে নিম্নলিখিত OAuth কনসেন্ট স্ক্রিন সেটিংস কনফিগার করতে পারেন। যদি আপনি এমন একটি বার্তা দেখতে পান যা বলে Google Auth platform এখনও কনফিগার করা হয়নি , শুরু করুন ক্লিক করুন:
    1. Under App Information , in App name , enter Meet REST API Tutorial .
    2. ব্যবহারকারীর সহায়তা ইমেল বিভাগে, এমন একটি সহায়তা ইমেল ঠিকানা বেছে নিন যেখানে ব্যবহারকারীদের সম্মতি সম্পর্কে প্রশ্ন থাকলে তারা আপনার সাথে যোগাযোগ করতে পারবেন।
    3. পরবর্তী ক্লিক করুন।
    4. অডিয়েন্স এর অধীনে, অভ্যন্তরীণ নির্বাচন করুন।
    5. পরবর্তী ক্লিক করুন।
    6. যোগাযোগের তথ্য এর অধীনে, একটি ইমেল ঠিকানা লিখুন যেখানে আপনার প্রকল্পের যেকোনো পরিবর্তন সম্পর্কে আপনাকে অবহিত করা যেতে পারে।
    7. পরবর্তী ক্লিক করুন।
    8. Finish এর অধীনে, Google API পরিষেবা ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন এবং যদি আপনি সম্মত হন, তাহলে আমি Google API পরিষেবাগুলিতে সম্মত: ব্যবহারকারীর ডেটা নীতি নির্বাচন করুন।
    9. চালিয়ে যান ক্লিক করুন।
    10. তৈরি করুন ক্লিক করুন।
    11. If you selected External for user type, add test users:
      1. Click Audience .
      2. Under Test users , click Add users .
      3. Enter your email address and any other authorized test users, then click Save .
  3. Click Data Access > Add or Remove Scopes . A panel appears with a list of scopes for each API that you've enabled in your Google Cloud project.
  4. Under Manually add scopes , paste the following scopes:
    • https://www.googleapis.com/auth/meetings.space.created
  5. Click Add to Table .
  6. আপডেট ক্লিক করুন।
  7. After selecting the scopes required by your app, click Save .

For more information about configuring OAuth consent, see Get started with the Google Auth platform .

Create a client ID

The client ID acts as credentials for your application during the OAuth 2.0 flows. Since the app runs locally, create a desktop client ID.

  1. গুগল ক্লাউড কনসোলে, মেনু > এ যানGoogle Auth platform > ক্লায়েন্ট

    ক্লায়েন্টদের তালিকায় যান

  2. ক্লায়েন্ট তৈরি করুন ক্লিক করুন।
  3. অ্যাপ্লিকেশনের ধরণ > ডেস্কটপ অ্যাপ ক্লিক করুন।
  4. নাম ক্ষেত্রে, শংসাপত্রের জন্য একটি নাম টাইপ করুন। এই নামটি শুধুমাত্র Google ক্লাউড কনসোলে দেখানো হবে।
  5. তৈরি করুন ক্লিক করুন।

    নতুন তৈরি শংসাপত্রটি "OAuth 2.0 ক্লায়েন্ট আইডি" এর অধীনে প্রদর্শিত হবে।

Install the Google auth libraries

Install the Google auth libraries:

pip install google-auth google-auth-oauthlib

Execute authorization

The Meet REST API requires user credentials in the form of an OAuth 2.0 access token. In this section, you implement the OAuth 2.0 flow to request an access token and a refresh token for the user.

  1. In your working directory, create the file main.py and add the following contents:

    import os
    import json
    
    from google.auth.transport import requests
    from google.oauth2.credentials import Credentials
    from google_auth_oauthlib.flow import InstalledAppFlow
    
    def authorize() -> Credentials:
        """Ensure valid credentials for calling the Meet REST API."""
        CLIENT_SECRET_FILE = "./client_secret.json"
        credentials = None
    
        if os.path.exists('token.json'):
            credentials = Credentials.from_authorized_user_file('token.json')
    
        if credentials is None:
            flow = InstalledAppFlow.from_client_secrets_file(
                CLIENT_SECRET_FILE,
                scopes=[
                    'https://www.googleapis.com/auth/meetings.space.created',
                ])
            flow.run_local_server(port=0)
            credentials = flow.credentials
    
        if credentials and credentials.expired:
            credentials.refresh(requests.Request())
    
        if credentials is not None:
            with open("token.json", "w") as f:
                f.write(credentials.to_json())
    
        return credentials
    
    USER_CREDENTIALS = authorize()
    
  2. To run the code, both the client ID and the secret created earlier are required. Copy the downloaded client secret file to the project working directory and rename it as client_secret.json .

  3. If you'd like to test how authorization works, run the following command. The app prompts for authorization and creates a token.json file in the project working directory after the request is approved.

    python3 main.py

Add the Meet REST API

Now that the authorization code is complete, it's time to enable and call the Meet REST API.

API গুলি সক্ষম করুন

While this section is focused on the Meet REST API, this tutorial also uses Google Cloud Pub/Sub and Google Workspace Events API.

গুগল ক্লাউড কনসোল

  1. In the Google Cloud console, enable the Google Meet REST API, the Google Workspace Events API, and Google Cloud Pub/Sub.

    API গুলি সক্ষম করুন

  2. Confirm that you're enabling the APIs in the correct Cloud project, then click Next .

  3. Confirm that you're enabling the correct APIs, then click Enable .

জিক্লাউড সিএলআই

  1. If necessary, set the current Cloud project to the one you created with the gcloud config set project command:

    gcloud config set project PROJECT_ID

    আপনার তৈরি করা ক্লাউড প্রোজেক্টের প্রোজেক্ট আইডি দিয়ে PROJECT_ID প্রতিস্থাপন করুন।

  2. Enable the Google Meet REST API, the Google Workspace Events API, and Google Cloud Pub/Sub with the gcloud services enable command:

    gcloud services enable meet.googleapis.com workspaceevents.googleapis.com pubsub.googleapis.com

Install the Meet REST API client library

Follow these steps to install the Meet REST API client library:

  1. Run the command:

    pip install google-apps-meet
  2. Edit the main.py file to import the client:

    from google.apps import meet_v2 as meet
    

একটি স্থান তৈরি করুন

Now that the Meet REST API is available, define a function to create a meeting space that can be subscribed to.

Edit main.py and add:

def create_space() -> meet.Space:
    """Create a meeting space."""
    client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
    request = meet.CreateSpaceRequest()
    return client.create_space(request=request)

ইভেন্টগুলিতে সাবস্ক্রাইব করুন

To receive events about a meeting space, you create a subscription using the Google Workspace Events API. You must also create and subscribe to a Google Cloud Pub/Sub topic which serves as the notification endpoint where your app receives the events.

Configure Google Cloud Pub/Sub

To create and subscribe to a Pub/Sub topic:

গুগল ক্লাউড কনসোল

  1. In the Google Cloud console, go to Menu > Pub/Sub .

    Go to Pub/Sub

    Make sure that the Cloud project for your app is selected.

  2. Click Create topic and do the following:
    1. Enter workspace-events as the topic name.
    2. Leave Add a default subscription selected.
    3. Click Create . Your full topic name is formatted as projects/{project}/topics/{topic} . Make a note of this name for use in later steps.
  3. Grant access to publish Pub/Sub messages to your topic:
    1. On the side panel, open the Permissions tab.
    2. Click Add Principal .
    3. In New principals , enter meet-api-event-push@system.gserviceaccount.com .
    4. In Assign roles , select Pub/Sub Publisher .
    5. সংরক্ষণ করুন ক্লিক করুন।

    It can take a few minutes to update the permissions for your topic.

জিক্লাউড সিএলআই

  1. In your Cloud project, create a topic by running the following:
    gcloud pubsub topics create workspace-events

    The output displays the full topic name, formatted as projects/{project}/topics/{topic} . Make a note of this name for use in later steps.

  2. Grant access to publish messages to your topic:
     gcloud pubsub topics add-iam-policy-binding workspace-events --member='serviceAccount:meet-api-event-push@system.gserviceaccount.com' --role='roles/pubsub.publisher'

    It can take a few minutes to update the permissions for your topic.

  3. Create a Pub/Sub subscription for the topic:
    gcloud pubsub subscriptions create workspace-events-sub --topic=TOPIC_NAME

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • TOPIC_NAME : The name of your topic that you created in the previous step.

Make note of the topic name and make sure the value for {project} is the Cloud project ID for your app. You'll use the topic name to create the Google Workspace subscription later.

Create a service account

গুগল ক্লাউড কনসোল

  1. In the Google Cloud console, go to Menu > IAM & Admin > Service Accounts .

    Go to Service Accounts

  2. Click Create service account .
  3. Fill in the service account details, then click Create and continue .
  4. In the Grant this service account access to project section, add the following roles:
    • roles/pubsub.subscriber
  5. চালিয়ে যান ক্লিক করুন।
  6. Optional: Enter users or groups that can manage and perform actions with this service account. For more details, refer to Managing service account impersonation .
  7. Click Done . Make a note of the email address for the service account.

জিক্লাউড সিএলআই

  1. Create the service account:
    gcloud iam service-accounts create meet-event-listener \
      --display-name="meet-event-listener"
  2. Grant the necessary roles to the service account:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:meet-event-listener@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"

    Replace PROJECT_ID with your Google Cloud project ID.

Use the service account

After creating the service account, grant yourself access to impersonate the service account.

গুগল ক্লাউড কনসোল

  1. In the Actions column for the newly created service account, click > Manage permissions .
  2. Click Add key > Grant access .
  3. Enter your email address under Add principals .
  4. Select Service accounts > Service Account Token Creator as the role.
  5. সংরক্ষণ করুন ক্লিক করুন।
  6. Return to your terminal and sign in with gcloud to set the application default credentials to the service account. When prompted for authorization, sign in using the same account used in the previous steps.
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

জিক্লাউড সিএলআই

  1. To add the permission, run gcloud iam service-accounts add-iam-policy-binding using the email address of the service account and the user.
    gcloud iam service-accounts add-iam-policy-binding \
      SERVICE_ACCOUNT_EMAIL \
      --member="user:YOUR_EMAIL" \
      --role="roles/iam.serviceAccountTokenCreator"
  2. Sign in to set the application default credentials to the service account. When prompted for authorization, sign in using the same account used in the previous steps.
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

Install the Pub/Sub client library

  1. Use pip to install the client library for Pub/Sub:

    pip install google-cloud-pubsub
  2. Then edit main.py to import the client:

    from google.cloud import pubsub_v1
    

Create the Google Workspace subscription

Add the following code to main.py to define a method for subscribing to Meet events. This code subscribes to all events for a meeting space. When subscribed, events are posted to the Pub/Sub topic.

def subscribe_to_space(space_name: str = None, topic_name: str = None):
    """Subscribe to events for a meeting space."""
    session = requests.AuthorizedSession(USER_CREDENTIALS)
    body = {
        'targetResource': f"//meet.googleapis.com/{space_name}",
        "eventTypes": [
            "google.workspace.meet.conference.v2.started",
            "google.workspace.meet.conference.v2.ended",
            "google.workspace.meet.participant.v2.joined",
            "google.workspace.meet.participant.v2.left",
            "google.workspace.meet.recording.v2.fileGenerated",
            "google.workspace.meet.transcript.v2.fileGenerated",
        ],
        "payloadOptions": {
            "includeResource": False,
        },
        "notificationEndpoint": {
            "pubsubTopic": topic_name
        },
        "ttl": "86400s",
    }
    response = session.post("https://workspaceevents.googleapis.com/v1/subscriptions", json=body)
    return response

Next, add the corresponding code to pull and process the events.

Listen for and handle events

Continue to edit main.py and add the following sample code. This code implements the receiving side and uses the Google Cloud Pub/Sub API to pull events as they're made available. The various handler methods print information about the corresponding events.

def format_participant(participant: meet.Participant) -> str:
    """Formats a participant for display on the console."""
    if participant.anonymous_user:
        return f"{participant.anonymous_user.display_name} (Anonymous)"

    if participant.signedin_user:
        return f"{participant.signedin_user.display_name} (ID: {participant.signedin_user.user})"

    if participant.phone_user:
        return f"{participant.phone_user.display_name} (Phone)"

    return "Unknown participant"


def fetch_participant_from_session(session_name: str) -> meet.Participant:
    """Fetches the participant for a session."""
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    # Use the parent path of the session to fetch the participant details
    parsed_session_path = client.parse_participant_session_path(session_name)
    participant_resource_name = client.participant_path(
        parsed_session_path["conference_record"],
        parsed_session_path["participant"])
    return client.get_participant(name=participant_resource_name)


def on_conference_started(message: pubsub_v1.subscriber.message.Message):
    """Display information about a conference when started."""
    payload = json.loads(message.data)
    resource_name = payload.get("conferenceRecord").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    conference = client.get_conference_record(name=resource_name)
    print(f"Conference (ID {conference.name}) started at {conference.start_time.rfc3339()}")


def on_conference_ended(message: pubsub_v1.subscriber.message.Message):
    """Display information about a conference when ended."""
    payload = json.loads(message.data)
    resource_name = payload.get("conferenceRecord").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    conference = client.get_conference_record(name=resource_name)
    print(f"Conference (ID {conference.name}) ended at {conference.end_time.rfc3339()}")


def on_participant_joined(message: pubsub_v1.subscriber.message.Message):
    """Display information about a participant when they join a meeting."""
    payload = json.loads(message.data)
    resource_name = payload.get("participantSession").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    session = client.get_participant_session(name=resource_name)
    participant = fetch_participant_from_session(resource_name)
    display_name = format_participant(participant)
    print(f"{display_name} joined at {session.start_time.rfc3339()}")


def on_participant_left(message: pubsub_v1.subscriber.message.Message):
    """Display information about a participant when they leave a meeting."""
    payload = json.loads(message.data)
    resource_name = payload.get("participantSession").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    session = client.get_participant_session(name=resource_name)
    participant = fetch_participant_from_session(resource_name)
    display_name = format_participant(participant)
    print(f"{display_name} left at {session.end_time.rfc3339()}")


def on_recording_ready(message: pubsub_v1.subscriber.message.Message):
    """Display information about a recorded meeting when artifact is ready."""
    payload = json.loads(message.data)
    resource_name = payload.get("recording").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    recording = client.get_recording(name=resource_name)
    print(f"Recording available at {recording.drive_destination.export_uri}")


def on_transcript_ready(message: pubsub_v1.subscriber.message.Message):
    """Display information about a meeting transcript when artifact is ready."""
    payload = json.loads(message.data)
    resource_name = payload.get("transcript").get("name")
    client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
    transcript = client.get_transcript(name=resource_name)
    print(f"Transcript available at {transcript.docs_destination.export_uri}")


def on_message(message: pubsub_v1.subscriber.message.Message) -> None:
    """Handles an incoming event from the Google Cloud Pub/Sub API."""
    event_type = message.attributes.get("ce-type")
    handler = {
        "google.workspace.meet.conference.v2.started": on_conference_started,
        "google.workspace.meet.conference.v2.ended": on_conference_ended,
        "google.workspace.meet.participant.v2.joined": on_participant_joined,
        "google.workspace.meet.participant.v2.left": on_participant_left,
        "google.workspace.meet.recording.v2.fileGenerated": on_recording_ready,
        "google.workspace.meet.transcript.v2.fileGenerated": on_transcript_ready,
    }.get(event_type)

    try:
        if handler is not None:
            handler(message)
        message.ack()
    except Exception as error:
        print("Unable to process event")
        print(error)


def listen_for_events(subscription_name: str = None):
    """Subscribe to events on the subscription."""
    subscriber = pubsub_v1.SubscriberClient()
    with subscriber:
        future = subscriber.subscribe(subscription_name, callback=on_message)
        print("Listening for events")
        try:
            future.result()
        except KeyboardInterrupt:
            future.cancel()
    print("Done")

Finalize the code

Add the following code to main.py to call the methods to create the space, subscribe to events, and listen. Update the TOPIC_NAME and SUBSCRIPTION_NAME constants with your own topic and subscription names that you previously created.

  1. Add the code to main.py :

    space = create_space()
    print(f"Join the meeting at {space.meeting_uri}")
    
    TOPIC_NAME = "projects/PROJECT_ID/topics/TOPIC_ID"
    SUBSCRIPTION_NAME = "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"
    
    subscription = subscribe_to_space(topic_name=TOPIC_NAME, space_name=space.name)
    if (subscription.status_code) == 200:
        listen_for_events(subscription_name=SUBSCRIPTION_NAME)
    else:
        print(f"Subscription to Meet events failed, response data: {subscription.content}")
    

    নিম্নলিখিতগুলি প্রতিস্থাপন করুন:

    • PROJECT_ID : The unique Cloud project ID for your app, such as my-sample-project-191923 .

    • TOPIC_ID : The name of the Pub/Sub topic that you created in your Cloud project.

    • SUBSCRIPTION_ID : The name of your subscription, such as workspace-events-sub .

  2. Run the program:

    python3 main.py

If you haven't previously run the program, it prompts for authorization the first time. Grant access to the application to call the Meet REST API. After the program successfully runs, you should see output similar to:

Join the meeting at https://meet.google.com/abc-mnop-xyz

Join the conference

To generate events for the application, join the conference using the URL displayed by the application. After you join, you can try these actions to trigger events:

  • Leave and rejoin the meeting.
  • Invite others or dial in with your phone.
  • Enable recordings and transcripts.

Each of these activities generates an event that the application receives and logs to the Google Cloud console.

Use ctrl-c to interrupt the program when you're done.

Optional: Additional steps to try

The app logs basic details about the events. To continue exploring the Meet REST API, try modifying the application to perform these additional actions.

  • Use the People API to retrieve additional information about signed-in participants.

    def subscribe_to_user(user_name: str = None, topic_name: str = None) -> requests_lib.Response:
        """Subscribe to events for a user."""
        session = requests.AuthorizedSession(USER_CREDENTIALS)
        body = {
            "targetResource": f"//cloudidentity.googleapis.com/users/{user_name}",
            "eventTypes": [
                "google.workspace.meet.conference.v2.started",
                "google.workspace.meet.conference.v2.ended",
                "google.workspace.meet.participant.v2.joined",
                "google.workspace.meet.participant.v2.left",
                "google.workspace.meet.recording.v2.fileGenerated",
                "google.workspace.meet.transcript.v2.fileGenerated",
            ],
            "payloadOptions": {
                "includeResource": False,
            },
            "notificationEndpoint": {"pubsubTopic": topic_name},
            "ttl": "86400s",
        }
        response = session.post(
            "https://workspaceevents.googleapis.com/v1/subscriptions", json=body
        )
        return response
    
    service = build("people", "v1", credentials=USER_CREDENTIALS)
    response = (
        service.people()
        .get(resourceName="people/me", personFields="names,emailAddresses")
        .execute()
    )
    resource_name = response.get("resourceName")
    if resource_name.startswith("people/"):
        resource_name = resource_name[len("people/") :]
    
    subscription = subscribe_to_user(topic_name=TOPIC_NAME, user_name=resource_name)
    

    Make sure to add "https://www.googleapis.com/auth/userinfo.profile" in the authorize method in the credential samples above.

  • Use the Google Drive API to download recordings and transcripts.

  • Instead of downloading transcripts from Google Drive, retrieve them using the structured transcript methods in the Meet REST API.

  • get space instead of creating the space

    def get_space(meeting_code: str) -> meet.Space:
        """Get a meeting space."""
        client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
        return client.get_space(name="spaces/" + meeting_code)
    

    Make sure to add "https://www.googleapis.com/auth/meetings.space.readonly" in the authorize method in the credential samples above.

Optional: Clean up

To avoid incurring charges to your Google Cloud console account for the resources used in this tutorial, we recommend that you clean up any resources and projects created.

To delete the subscription:

কনসোল

  1. In the Google Cloud console, go to Menu > Pub/Sub > Subscriptions

    Go to Subscriptions

  2. Select the subscription and click More actions .

  3. Click Delete . The Delete subscription window appears.

  4. মুছে ফেলুন ক্লিক করুন।

জিক্লাউড সিএলআই

  1. Delete the subscription:

    gcloud pubsub subscriptions delete SUBSCRIPTION_NAME

To delete the topic:

কনসোল

  1. In the Google Cloud console, go to Menu > Pub/Sub > Topics

    Go to Topics

  2. Select the topic and click More actions .

  3. Click Delete . The Delete topic window appears.

  4. Enter delete and then click Delete .

জিক্লাউড সিএলআই

  1. Delete the topic:

    gcloud pubsub topics delete TOPIC_NAME

To delete the project:

কনসোল

  1. In the Google Cloud console, go to the Manage resources page. Click Menu > IAM & Admin > Manage Resources .

    Go to Resource Manager

  2. In the project list, select the project you want to delete and then click Delete .
  3. In the dialog, type the project ID and then click Shut down to delete the project.

জিক্লাউড সিএলআই

  1. To delete a project, use the gcloud projects delete command:

    gcloud projects delete PROJECT_ID