تتبُّع أحداث الاجتماعات باستخدام Python وGoogle Meet REST API

يوضّح هذا البرنامج التعليمي كيفية استخدام Google Meet REST API مع Google Workspace Events API وGoogle Cloud Pub/Sub لمراقبة الأحداث والتفاعل معها في مساحة اجتماع Meet. يسجّل التطبيق النموذجي وقت بدء المؤتمرات وانتهائها، ووقت انضمام المشاركين أو مغادرتهم، ووقت توفّر أي عناصر تم إنشاؤها في الاجتماع.

بدلاً من الاشتراك في مساحة اجتماع معيّنة، يمكنك الاشتراك في حساب مستخدم Meet لتلقّي إشعارات بالأحداث في أي مساحة اجتماع يملكها المستخدم أو ينظّمها. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة الاشتراك في أحداث Google Meet في مستندات Google Workspace Events API.

المتطلبات الأساسية

إذا كنت بحاجة إلى تفعيل أي من المتطلبات الأساسية التالية لمؤسستك، اطلب من مشرف حسابات Google Workspace تفعيلها:

إعداد البيئة

يوضّح هذا القسم كيفية إنشاء بيئتك المحلية وإعدادها، بالإضافة إلى مشروع على السحابة الإلكترونية من Google لهذا البرنامج التعليمي.

إنشاء دليل عمل وبيئة Python افتراضية

لإنشاء بيئة افتراضية جديدة وتفعيلها، شغِّل الأوامر التالية في الوحدة الطرفية.

‫Linux/macOS

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

‫Windows (موجّه الأوامر)

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

نظام التشغيل Windows (PowerShell)

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

إنشاء مشروع على Google Cloud

وحدة تحكّم Google API

  1. في Google API Console، انتقِل إلى "القائمة" > إدارة الهوية وإمكانية الوصول (IAM) والمشرف > إنشاء مشروع.

    الانتقال إلى صفحة "إنشاء مشروع"

  2. في حقل اسم المشروع، أدخِل اسمًا وصفيًا لمشروعك.

    اختياري: لتعديل رقم تعريف المشروع، انقر على تعديل. لا يمكن تغيير رقم تعريف المشروع بعد إنشائه، لذا اختَر رقم تعريف يلبي احتياجاتك طوال مدة المشروع.

  3. في حقل الموقع الجغرافي، انقر على تصفّح لعرض المواقع الجغرافية المحتملة لمشروعك. بعد ذلك، انقر على اختيار.
  4. انقر على إنشاء. تنتقل "وحدة تحكّم واجهة برمجة تطبيقات Google" إلى صفحة "لوحة البيانات" ويتم إنشاء مشروعك في غضون بضع دقائق.

gcloud CLI

في إحدى بيئات التطوير التالية، يمكنك الوصول إلى واجهة سطر الأوامر (CLI) في Google Cloud (gcloud):

  • Cloud Shell: لتفعيل وحدة طرفية على الإنترنت مع إعداد مسبق لواجهة سطر الأوامر gcloud، فعِّل Cloud Shell.
    تفعيل Cloud Shell
  • Local Shell: لاستخدام بيئة تطوير محلية، عليك تثبيت وإعداد gcloud CLI.
    لإنشاء مشروع على السحابة الإلكترونية، استخدِم الأمر gcloud projects create:
    gcloud projects create PROJECT_ID
    استبدِل PROJECT_ID بضبط رقم تعريف المشروع الذي تريد إنشاءه.

تفعيل الفوترة لمشروع على السحابة الإلكترونية من Google

وحدة تحكّم Google API

  1. في Google API Console، انتقِل إلى الفوترة. انقر على القائمة > الفوترة > مشاريعي.

    الانتقال إلى "الفوترة لمشاريعي"

  2. في اختيار مؤسسة، اختَر المؤسسة المرتبطة بمشروعك على Google Cloud.
  3. في صف المشروع، افتح قائمة الإجراءات ()، وانقر على تغيير حساب الفوترة، ثم اختَر حساب Cloud Billing.
  4. انقر على ضبط الحساب.

gcloud CLI

  1. لعرض قائمة بحسابات الفوترة المتاحة، نفِّذ الأمر التالي:
    gcloud billing accounts list
  2. ربط حساب فوترة بمشروع على Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    غيِّر القيم في السلسلة على الشكل التالي:

    • PROJECT_ID هو رقم تعريف المشروع الخاص بالمشروع على السحابة الإلكترونية الذي تريد تفعيل الفوترة فيه.
    • BILLING_ACCOUNT_ID هو معرّف حساب الفوترة الذي سيتم ربطه بمشروع على السحابة الإلكترونية من Google.

إعداد المصادقة والتفويض

تتيح المصادقة والتفويض للتطبيق الوصول إلى موارد واجهة برمجة تطبيقات REST في Meet. يجب الحصول على إذن المستخدم لاستدعاء واجهة Meet REST API. يوضّح لك هذا القسم كيفية ضبط بيانات اعتماد المستخدم وطلب التفويض.

ضبط شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth واختيار النطاقات

تقترح الخطوات التالية معلومات نائبة لإعداد شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth لتطبيقك. قبل نشر التطبيق خارجيًا، عدِّل هذه المعلومات.

  1. في Google API Console، انتقِل إلى "القائمة" > منصة Google Auth > العلامة التجارية.

    الانتقال إلى "هوية العلامة التجارية"

  2. إذا سبق لك إعداد منصة Google Auth، يمكنك ضبط إعدادات "شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth" التالية في العلامة التجارية والجمهور والوصول إلى البيانات. إذا ظهرت لك الرسالة لم يتم إعداد منصة Google Auth بعد، انقر على البدء:
    1. ضمن معلومات التطبيق، في اسم التطبيق، أدخِل Meet REST API Tutorial.
    2. في حقل البريد الإلكتروني لدعم المستخدمين، اختَر عنوان بريد إلكتروني للدعم يمكن للمستخدمين التواصل معك من خلاله إذا كانت لديهم أسئلة حول موافقتهم.
    3. انقر على التالي.
    4. ضمن الجمهور، اختَر داخلي.
    5. انقر على التالي.
    6. ضمن معلومات الاتصال، أدخِل عنوان بريد إلكتروني يمكنك تلقّي إشعارات فيه بشأن أي تغييرات تطرأ على مشروعك.
    7. انقر على التالي.
    8. ضمن إنهاء، راجِع سياسة بيانات المستخدمين في خدمات Google API، وإذا كنت توافق عليها، ضَع علامة في المربّع أوافق على "سياسة بيانات المستخدمين في خدمات Google API".
    9. انقر على متابعة.
    10. انقر على إنشاء.
    11. إذا اخترت خارجي لنوع المستخدم، أضِف مستخدمين اختباريين:
      1. انقر على الجمهور.
      2. ضمن المستخدمون التجريبيون، انقر على إضافة مستخدمين.
      3. أدخِل عنوان بريدك الإلكتروني وأي مستخدمين اختباريين آخرين معتمَدين، ثم انقر على حفظ.
  3. انقر على الوصول إلى البيانات > إضافة نطاقات أو إزالتها. يظهر لوحة تتضمّن قائمة بالنطاقات لكل واجهة برمجة تطبيقات فعّلتها في مشروعك على Google Cloud.
  4. ضمن إضافة النطاقات يدويًا، الصِق النطاقات التالية:
    • https://www.googleapis.com/auth/meetings.space.created
  5. انقر على إضافة إلى الجدول.
  6. انقر على تعديل.
  7. بعد اختيار النطاقات المطلوبة لتطبيقك، انقر على حفظ.

لمزيد من المعلومات حول إعداد موافقة OAuth، يُرجى الاطّلاع على بدء استخدام منصة Google Auth.

إنشاء معرّف عميل

يعمل معرّف العميل كبيانات اعتماد لتطبيقك أثناء عمليات OAuth 2.0. بما أنّ التطبيق يعمل على الجهاز فقط، عليك إنشاء معرّف عميل على الكمبيوتر.

  1. في Google API Console، انتقِل إلى "القائمة" > منصة Google Auth > العملاء.

    الانتقال إلى "العملاء"

  2. انقر على إنشاء عميل.
  3. انقر على نوع التطبيق > تطبيق على الكمبيوتر.
  4. في حقل الاسم، اكتب اسمًا لبيانات الاعتماد. لا يظهر هذا الاسم إلا في Google API Console.
  5. انقر على إنشاء.

    تظهر بيانات الاعتماد التي تم إنشاؤها حديثًا ضمن "معرّفات عملاء OAuth 2.0".

تثبيت مكتبات مصادقة Google

ثبِّت مكتبات مصادقة Google:

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

إضافة واجهة برمجة تطبيقات REST في Meet

بعد إكمال رمز التفويض، حان الوقت لتفعيل واجهة برمجة تطبيقات REST الخاصة بـ Meet واستدعائها.

تفعيل واجهات برمجة التطبيقات

على الرغم من أنّ هذا القسم يركّز على واجهة Meet REST API، إلا أنّ هذا البرنامج التعليمي يستخدم أيضًا Google Cloud Pub/Sub وGoogle Workspace Events API.

وحدة تحكّم Google API

  1. في Google API Console، فعِّل Google Meet REST API وGoogle Workspace Events API وGoogle Cloud Pub/Sub.

    تفعيل واجهات برمجة التطبيقات

  2. تأكَّد من أنّك بصدد تفعيل واجهات برمجة التطبيقات في مشروع على السحابة الإلكترونية الصحيح، ثم انقر على التالي.

  3. تأكَّد من تفعيل واجهات برمجة التطبيقات الصحيحة، ثم انقر على تفعيل.

gcloud CLI

  1. إذا لزم الأمر، اضبط مشروع على السحابة الإلكترونية الحالي على المشروع الذي أنشأته باستخدام الأمر gcloud config set project:

    gcloud config set project PROJECT_ID

    استبدِل PROJECT_ID برقم تعريف المشروع لمشروع على السحابة الإلكترونية الذي أنشأته.

  2. فعِّل Google Meet REST API وGoogle Workspace Events API وGoogle Cloud Pub/Sub باستخدام الأمر gcloud services enable:

    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
    

إنشاء مساحة

بعد أن أصبحت واجهة برمجة تطبيقات REST في Meet متاحة، حدِّد دالة لإنشاء مساحة اجتماع يمكن الاشتراك فيها.

تعديل 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 والاشتراك فيه، وهو يعمل كنقطة نهاية للإشعارات يتلقّى فيها تطبيقك الأحداث.

ضبط إعدادات Google Cloud Pub/Sub

لإنشاء موضوع على Pub/Sub والاشتراك فيه، اتّبِع الخطوات التالية:

وحدة تحكّم Google API

  1. في Google API Console، انتقِل إلى "القائمة" > Pub/Sub.

    الانتقال إلى Pub/Sub

    تأكَّد من اختيار مشروع على السحابة الإلكترونية لتطبيقك.

  2. انقر على إنشاء موضوع ونفِّذ ما يلي:
    1. أدخِل workspace-events كاسم الموضوع.
    2. اترك الخيار إضافة اشتراك تلقائي محدّدًا.
    3. انقر على إنشاء. يتم تنسيق اسم الموضوع الكامل على النحو التالي: projects/{project}/topics/{topic}. دوِّن هذا الاسم لاستخدامه في خطوات لاحقة.
  3. امنح الإذن بنشر رسائل Pub/Sub في موضوعك:
    1. في اللوحة الجانبية، افتح علامة التبويب الأذونات.
    2. انقر على إضافة مدير.
    3. في الأعضاء الجدد، أدخِل meet-api-event-push@system.gserviceaccount.com.
    4. في إسناد الأدوار، اختَر Pub/Sub Publisher.
    5. انقر على حفظ.

    قد يستغرق تعديل أذونات موضوعك بضع دقائق.

gcloud CLI

  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. أنشئ اشتراكًا في Pub/Sub للموضوع:
    gcloud pubsub subscriptions create workspace-events-sub --topic=TOPIC_NAME

    غيِّر القيم في السلسلة على الشكل التالي:

    • TOPIC_NAME: اسم الموضوع الذي أنشأته في الخطوة السابقة

دوِّن اسم الموضوع وتأكَّد من أنّ قيمة {project} هي رقم تعريف مشروع على السحابة الإلكترونية لتطبيقك. ستستخدم اسم الموضوع لإنشاء اشتراك Google Workspace لاحقًا.

إنشاء حساب خدمة

وحدة تحكّم Google API

  1. في Google API Console، انتقِل إلى القائمة > المشرف وإدارة الهوية وإمكانية الوصول > حسابات الخدمة.

    الانتقال إلى "حسابات الخدمة"

  2. انقر على إنشاء حساب خدمة.
  3. املأ تفاصيل حساب الخدمة، ثم انقر على إنشاء ومتابعة.
  4. في قسم منح حساب الخدمة هذا إذنًا بالوصول إلى المشروع، أضِف الأدوار التالية:
    • roles/pubsub.subscriber
  5. انقر على متابعة.
  6. اختياري: أدخِل المستخدمين أو المجموعات التي يمكنها إدارة حساب الخدمة هذا وتنفيذ إجراءات فيه. لمزيد من التفاصيل، يُرجى الاطّلاع على إدارة انتحال هوية حساب الخدمة.
  7. انقر على تم. دوِّن عنوان البريد الإلكتروني لحساب الخدمة.

gcloud CLI

  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"

    استبدِل PROJECT_ID برقم تعريف مشروعك على Google Cloud.

استخدام حساب الخدمة

بعد إنشاء حساب الخدمة، امنح نفسك إذنًا بانتحال هوية حساب الخدمة.

وحدة تحكّم Google API

  1. في عمود الإجراءات لحساب الخدمة الذي تم إنشاؤه حديثًا، انقر على > إدارة الأذونات.
  2. انقر على إضافة مفتاح > منح إذن الوصول.
  3. أدخِل عنوان بريدك الإلكتروني ضمن إضافة جهات أساسية.
  4. اختَر حسابات الخدمة > أداة إنشاء رموز حسابات الخدمة المميزة كدور.
  5. انقر على حفظ.
  6. ارجع إلى الجهاز الطرفي وسجِّل الدخول باستخدام gcloud لضبط بيانات الاعتماد التلقائية للتطبيق على حساب الخدمة. عندما يُطلب منك تقديم إذن، سجِّل الدخول باستخدام الحساب نفسه الذي استخدمته في الخطوات السابقة.
    gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL

gcloud CLI

  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

تثبيت مكتبة برامج Pub/Sub

  1. استخدِم pip لتثبيت مكتبة البرامج الخاصة بخدمة Pub/Sub:

    pip install google-cloud-pubsub
  2. بعد ذلك، عدِّل main.py لاستيراد العميل:

    from google.cloud import pubsub_v1
    

إنشاء اشتراك Google Workspace

أضِف الرمز التالي إلى main.py لتحديد طريقة للاشتراك في أحداث Meet. يشترك هذا الرمز في جميع الأحداث الخاصة بمساحة اجتماع. عند الاشتراك، يتم نشر الأحداث في موضوع 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 لسحب الأحداث عند توفّرها. تطبع طرق المعالجة المختلفة معلومات حول الأحداث المقابلة.

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: معرّف مشروع Cloud الفريد لتطبيقك، مثل my-sample-project-191923.

    • استبدِل TOPIC_ID باسم موضوع Pub/Sub الذي أنشأته في مشروعك على السحابة الإلكترونية.

    • SUBSCRIPTION_ID: اسم اشتراكك، مثل workspace-events-sub

  2. شغِّل البرنامج:

    python3 main.py

إذا لم يسبق لك تشغيل البرنامج، سيطلب منك تقديم إذن بالتخويل في المرة الأولى. امنح التطبيق إذن الوصول إلى واجهة برمجة تطبيقات Meet REST. بعد تشغيل البرنامج بنجاح، من المفترض أن تظهر لك نتيجة مشابهة لما يلي:

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

الانضمام إلى المؤتمر

لإنشاء أحداث للتطبيق، انضم إلى المؤتمر باستخدام عنوان URL الذي يعرضه التطبيق. بعد الانضمام، يمكنك تجربة الإجراءات التالية لتفعيل الأحداث:

  • مغادرة الاجتماع وإعادة الانضمام إليه
  • دعوة الآخرين أو الاتصال باستخدام هاتفك
  • فعِّل التسجيلات وتحويل الصوت إلى نص.

يؤدي كل نشاط من هذه الأنشطة إلى إنشاء حدث يتلقّاه التطبيق ويسجّله في Google API Console.

استخدِم 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" في طريقة التفويض في نماذج بيانات الاعتماد أعلاه.

  • استخدِم Google Drive API لتنزيل التسجيلات والنصوص.

  • بدلاً من تنزيل النصوص من Google Drive، يمكنك استردادها باستخدام طُرق النص المنظَّم في 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 API Console مقابل الموارد المستخدَمة في هذا البرنامج التعليمي، ننصحك بتنظيف أي موارد ومشاريع تم إنشاؤها.

لإلغاء الاشتراك، اتّبِع الخطوات التالية:

وحدة التحكّم

  1. في Google API Console، انتقِل إلى القائمة > Pub/Sub > الاشتراكات

    الانتقال إلى الاشتراكات

  2. اختَر الاشتراك وانقر على مزيد من الإجراءات.

  3. انقر على حذف. تظهر نافذة حذف الاشتراك.

  4. انقر على حذف.

gcloud CLI

  1. احذف الاشتراك باتّباع الخطوات التالية:

    gcloud pubsub subscriptions delete SUBSCRIPTION_NAME

لحذف الموضوع، اتّبِع الخطوات التالية:

وحدة التحكّم

  1. في Google API Console، انتقِل إلى القائمة > Pub/Sub > المواضيع

    الانتقال إلى "المواضيع"

  2. اختَر الموضوع وانقر على مزيد من الإجراءات.

  3. انقر على حذف. تظهر نافذة حذف الموضوع.

  4. أدخِل delete ثم انقر على حذف.

gcloud CLI

  1. احذف الموضوع باتّباع الخطوات التالية:

    gcloud pubsub topics delete TOPIC_NAME

لحذف المشروع، اتّبِع الخطوات التالية:

وحدة التحكّم

  1. في Google API Console، انتقِل إلى صفحة إدارة الموارد. انقر على القائمة > إدارة الهوية وإمكانية الوصول والمشرف > إدارة الموارد.

    الانتقال إلى "إدارة الموارد"

  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف .
  3. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.

gcloud CLI

  1. لحذف مشروع، استخدِم الأمر gcloud projects delete:

    gcloud projects delete PROJECT_ID