استخدام "إحصاءات Google 4"

يوضح هذا البرنامج التعليمي كيفية تتبع استخدام الإضافة باستخدام Google Analytics. يمكنك العثور على نموذج "إحصاءات Google 4" قيد التشغيل على GitHub، حيث تتضمّن google-analytics.js جميع الرموز البرمجية ذات الصلة بخدمة "إحصاءات Google".

المتطلبات

يفترض هذا البرنامج التعليمي أنك على دراية بكتابة إضافات Chrome. إذا كنت بحاجة إلى معلومات حول كيفية كتابة إضافة، يُرجى قراءة الدليل التعليمي للبدء.

عليك أيضًا إعداد حساب على "إحصاءات Google 4" لتتبُّع الإضافة. تجدر الإشارة إلى أنه عند إعداد الحساب، يمكنك استخدام أي قيمة في حقل عنوان URL لموقع الويب، حيث لن يكون للإضافة عنوان URL خاص بها.

استخدام Measurement Protocol في "إحصاءات Google"

بما أنّ إصدار Manifest V3، لا يُسمح لإضافات Chrome بتنفيذ الرموز البرمجية المستضافة عن بُعد. وهذا يعني أن عليك استخدام Measurement Protocol في "إحصاءات Google" لتتبُّع أحداث الإضافات. يتيح لك Measurement Protocol إرسال الأحداث مباشرةً إلى خوادم "إحصاءات Google" عن طريق طلبات HTTP. وتتمثّل فائدة هذا المنهج في أنّه يتيح لك إرسال أحداث الإحصاءات من أي مكان في إضافتك، بما في ذلك مشغّل الخدمات.

إعداد بيانات اعتماد واجهة برمجة التطبيقات

الخطوة الأولى هي الحصول على api_secret وmeasurement_id. اتّبِع وثائق Measurement Protocol لمعرفة كيفية الحصول على هذه البروتوكولات لحسابك على "إحصاءات Google".

إنشاء client_id

الخطوة الثانية هي إنشاء معرّف فريد لجهاز/مستخدم محدّد، وهو client_id. يجب أن يبقى رقم التعريف كما هو ما دامت الإضافة مثبّتة على متصفّح المستخدم. ويمكن أن تكون سلسلة عشوائية، ولكن يجب أن تكون فريدة للعميل. يمكنك إنشاء حساب من خلال الاتصال بالرقم self.crypto.randomUUID(). يمكنك تخزين "client_id" في chrome.storage.local للتأكّد من بقائها كما هي ما دام الإضافة مثبّتة.

لاستخدام chrome.storage.local، يجب الحصول على إذن storage في ملف البيان:

manifest.json:

{
  
  "permissions": ["storage"],
  
}

بعد ذلك، يمكنك استخدام chrome.storage.local لتخزين client_id:

async function getOrCreateClientId() {
  const result = await chrome.storage.local.get('clientId');
  let clientId = result.clientId;
  if (!clientId) {
    // Generate a unique client ID, the actual value is not relevant
    clientId = self.crypto.randomUUID();
    await chrome.storage.local.set({clientId});
  }
  return clientId;
}

إرسال حدث إحصاءات

باستخدام بيانات اعتماد واجهة برمجة التطبيقات وclient_id، يمكنك إرسال حدث إلى "إحصاءات Google" من خلال طلب fetch:

const GA_ENDPOINT = 'https://www.google-analytics.com/mp/collect';
const MEASUREMENT_ID = `G-...`;
const API_SECRET = `...`;

fetch(
  `${GA_ENDPOINT}?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,
  {
    method: 'POST',
    body: JSON.stringify({
      client_id: await getOrCreateClientId(),
      events: [
        {
          name: 'button_clicked',
          params: {
            id: 'my-button',
          },
        },
      ],
    }),
  }
);

يؤدي ذلك إلى إرسال حدث button_clicked الذي سيظهر في تقرير أحداث "إحصاءات Google". إذا كنت تريد الاطّلاع على أحداثك في تقرير "الوقت الفعلي" على "إحصاءات Google"، عليك توفير مَعلمتَين إضافيتَين: session_id وengagement_time_msec.

استخدام المَعلمتَين المقترَحتَين session_id وengagement_time_msec

كلّ من session_id وengagement_time_msec هما مَعلمتان مقترَحتان عند استخدام Measurement Protocol في "إحصاءات Google" لأنّهما مطلوبان لعرض نشاط المستخدم في التقارير العادية، مثل "الوقت الفعلي".

تصف session_id فترة زمنية يتفاعل خلالها المستخدم باستمرار مع الإضافة. تنتهي الجلسة تلقائيًا بعد مرور 30 دقيقة على توقّف نشاط المستخدِم. وليس هناك حدّ لطول مدة الجلسة.

على عكس المواقع الإلكترونية العادية، ما مِن فكرة واضحة عن جلسة المستخدم في إضافات Chrome. وبالتالي، عليك تحديد معنى جلسة المستخدِم في إضافتك. على سبيل المثال، قد يكون كل تفاعل جديد للمستخدم جلسة جديدة. في هذه الحالة، يمكنك ببساطة إنشاء رقم تعريف جلسة جديد مع كل حدث (أي باستخدام طابع زمني).

يوضّح المثال التالي أسلوبًا يؤدي إلى انتهاء مهلة جلسة جديدة بعد 30 دقيقة من عدم الإبلاغ عن أي أحداث (يمكن تخصيص هذا الوقت ليلائم سلوك مستخدم إضافتك بشكل أفضل). يستخدم المثال chrome.storage.session لتخزين الجلسة النشطة أثناء تشغيل المتصفِّح. نخزِّن مع الجلسة آخر مرّة تم فيها تنشيط حدث. بهذه الطريقة، يمكننا معرفة ما إذا كانت صلاحية الجلسة النشطة قد انتهت:

const SESSION_EXPIRATION_IN_MIN = 30;

async function getOrCreateSessionId() {
  // Store session in memory storage
  let {sessionData} = await chrome.storage.session.get('sessionData');
  // Check if session exists and is still valid
  const currentTimeInMs = Date.now();
  if (sessionData && sessionData.timestamp) {
    // Calculate how long ago the session was last updated
    const durationInMin = (currentTimeInMs - sessionData.timestamp) / 60000;
    // Check if last update lays past the session expiration threshold
    if (durationInMin > SESSION_EXPIRATION_IN_MIN) {
      // Delete old session id to start a new session
      sessionData = null;
    } else {
      // Update timestamp to keep session alive
      sessionData.timestamp = currentTimeInMs;
      await chrome.storage.session.set({sessionData});
    }
  }
  if (!sessionData) {
    // Create and store a new session
    sessionData = {
      session_id: currentTimeInMs.toString(),
      timestamp: currentTimeInMs.toString(),
    };
    await chrome.storage.session.set({sessionData});
  }
  return sessionData.session_id;
}

يضيف المثال التالي session_id وengagement_time_msec إلى طلب حدث النقر على الزر السابق. بالنسبة إلى engagement_time_msec، يمكنك تقديم قيمة تلقائية هي 100 ms.

const GA_ENDPOINT = "https://www.google-analytics.com/mp/collect";
const MEASUREMENT_ID = `G-...`;
const API_SECRET = `...`;
const DEFAULT_ENGAGEMENT_TIME_IN_MSEC = 100;

fetch(
`${GA_ENDPOINT}?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,
  {
    method: "POST",
    body: JSON.stringify({
      client_id: await getOrCreateClientId(),
      events: [
        {
          name: "button_clicked",
          params: {
            session_id: await this.getOrCreateSessionId(),
            engagement_time_msec: DEFAULT_ENGAGEMENT_TIME_IN_MSEC,
            id: "my-button",
          },
        },
      ],
    }),
  }
);

سيتم عرض الحدث على النحو التالي في تقرير "الوقت الفعلي" في "إحصاءات Google".

الأحداث في الوقت الفعلي في "إحصاءات Google"

تتبُّع مشاهدات الصفحات في النافذة المنبثقة واللوحة الجانبية وصفحات الإضافات

يدعم Measurement Protocol في "إحصاءات Google" حدث page_view الخاص لتتبع مشاهدات الصفحات. استخدِم هذا الخيار لتتبُّع المستخدمين الذين يزورون صفحاتك المنبثقة أو اللوحة الجانبية أو صفحة الإضافة في علامة تبويب جديدة. يتطلّب حدث page_view أيضًا المَعلمتَين page_title وpage_location. يعمل المثال التالي على تنشيط حدث مشاهدة صفحة على الويب في حدث المستند load لنافذة منبثقة للإضافة.

popup.js:

window.addEventListener("load", async () => {
  fetch(`${GA_ENDPOINT}?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,
  {
    method: "POST",
    body: JSON.stringify({
      client_id: await getOrCreateClientId(),
      events: [
        {
          name: "page_view",
          params: {
            session_id: await getOrCreateSessionId(),
            engagement_time_msec: DEFAULT_ENGAGEMENT_TIME_IN_MSEC,
            page_title: document.title,
            page_location: document.location.href
          },
        },
      ],
    }),
  });
});

يجب استيراد النص البرمجي popup.js في ملف html للنافذة المنبثقة، ويجب تشغيله قبل تنفيذ أي نص برمجي آخر:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Analytics Demo Popup</title>
    <script src="./popup.js" type="module"></script>
  </head>
  <body>
    <h1>Analytics Demo</h1>
  </body>
</html>

سيتم عرض طريقة العرض المنبثقة مثل أي مشاهدة صفحة أخرى في تقرير "الوقت الفعلي" على "إحصاءات Google":

حدث مشاهدة الصفحة على الويب كما يظهر في لوحة بيانات الوقت الفعلي في &quot;إحصاءات Google&quot;.

تتبع أحداث التحليلات في موظفي الخدمة

يتيح استخدام Measurement Protocol في "إحصاءات Google" إمكانية تتبُّع أحداث الإحصاءات في موظفي خدمات الإضافات. على سبيل المثال، من خلال الاستماع إلى unhandledrejection event في مشغّل الخدمات، يمكنك تسجيل أيّ استثناءات غير صائبة في مشغّل الخدمات على "إحصاءات Google"، ما يمكن أن يساعد بشكل كبير في تصحيح الأخطاء التي قد يبلّغ عنها المستخدمون.

service-worker.js:

addEventListener("unhandledrejection", async (event) => {
  `${GA_ENDPOINT}?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,
  {
    method: "POST",
    body: JSON.stringify({
      client_id: getOrCreateClientId(),
      events: [
        {
          // Note: 'error' is a reserved event name and cannot be used
          // see https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#reserved_names
          name: "extension_error",
          params: {
            session_id: await this.getOrCreateSessionId(),
            engagement_time_msec: DEFAULT_ENGAGEMENT_TIME_IN_MSEC,
            message: error.message,
            stack: error.stack,
          },
        },
      ],
    }),
  }
});

يمكنك الآن الاطّلاع على حدث الخطأ في تقارير "إحصاءات Google":

حدث خطأ كما يظهر في لوحة بيانات الأحداث على &quot;إحصاءات Google&quot;.

تصحيح الأخطاء

توفِّر "إحصاءات Google" ميزتَين مفيدتَين لتصحيح أخطاء أحداث الإحصاءات في إضافتك:

  1. نقطة نهاية خاصة لتصحيح الأخطاء https://www.google-analytics.com**/debug**/mp/collect ستُبلغ عن أي أخطاء في تعريفات الأحداث.
  2. تقرير الوقت الفعلي من "إحصاءات Google" الذي سيعرض الأحداث فور ورودها