الإشعارات الفورية (Dialogflow)

الاستكشاف في Dialogflow

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

  1. أدخِل اسم الوكيل وأنشِئ وكيل Dialogflow جديد للنموذج.
  2. بعد انتهاء عملية الاستيراد، انقر على الانتقال إلى الوكيل.
  3. من قائمة التنقّل الرئيسية، انتقِل إلى توصيل الطلبات.
  4. فعِّل المحرّر المضمّن، ثم انقر على نشر. يحتوي المحرِّر على العيّنة الرمز.
  5. من قائمة التنقل الرئيسية، انتقِل إلى عمليات الدمج، ثم انقر على Google "مساعد Google"
  6. في النافذة المشروطة التي تظهر، فعِّل تغييرات المعاينة التلقائية وانقر على اختبار. لفتح محاكي الإجراءات.
  7. في المحاكي، أدخِل Talk to my test app لاختبار العيّنة.
متابعة

يمكن أن يؤدي الإجراء الخاص بك إلى إرسال إشعارات إلى المستخدمين متى كان ذلك مناسبًا، مثل إرسال تذكير عندما يقترب تاريخ استحقاق المهمة.

في هذا الدليل، نستخدم نموذج نصائح حول "المهام مع مساعد Google". كمرجع لتوضيح كيفية إعداد الإشعارات الفورية للإجراء الخاص بك. عندما يستدعي المستخدمون هذا الإجراء، يسألهم عمّا إذا كانوا يريدون سماع نصيحة. عن تطوير العمل الخاص بهم. يمكن للمستخدمين اختيار فئة محددة أو عشوائية للنصيحة، أو يمكنهم تختار سماع أحدث نصيحة.

مساحات العرض المتوافقة

تتوفّر الإشعارات الفورية على أجهزة Android وiOS (يجب أن تتوفّر الميزة على أجهزة iOS). تثبيت تطبيق "مساعد Google" لتلقّي الإشعارات الفورية). لا يتم تضمينها هذه الميزة متاحة حاليًا على مكبّرات الصوت أو الشاشات الذكية أو المنصّات الأخرى التي تعمل بالصوت.

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

يجب ضبط إجراء واحد على الأقل من المهام في مشروع "الإجراءات" لديك على أنّه هدف التشغيل الذي سيتم استدعاؤه عندما ينقر المستخدم على إشعار تم استلامه من المساعد.

لا يمكن ضبط إجراءاتك لتشغيل رسالة الترحيب التلقائية من الإشعارات الفورية.

إعداد وحدة التحكّم

لإتاحة الإشعارات الفورية في الإجراء، يُرجى اتّباع الخطوات التالية:

  1. انتقِل إلى وحدة تحكّم الإجراءات وانتقِل إليها. إلى إنشاء > الإجراءات:

  2. انقر على الإجراء الذي يطابق الغرض الإضافي الذي تريد تشغيله تفعيل الإشعارات الفورية له.

    بالنسبة إلى عينة نصائح "المهام مع مساعد Google"، يمكنك اختيار "tell_update_tip".

  3. انتقِل للأسفل حتى تصل إلى قسم تفاعل المستخدمين وفعِّله. هل تريد إرسال إشعارات فورية؟

  4. أدخِل عنوان المحتوى.

    بالنسبة إلى نموذج نصائح "المهام مع مساعد Google"، يمكن أن يكون العنوان "تمت إضافة نصيحة جديدة".

  5. انقر على حفظ.

عمليات الاستيراد

للأغراض الواردة في الأقسام التالية، في رمز توصيل الطلب، عليك الإعلان عن عمليات الاستيراد التالية:

Dialogflow
const {
  dialogflow,
  UpdatePermission,
  Suggestions,
} = require('actions-on-google');
حزمة تطوير البرامج (SDK) لـ "الإجراءات"
const {
  actionssdk,
  UpdatePermission,
  Suggestions,
} = require('actions-on-google');

المستخدمون الذين وافقوا على الاشتراك

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

عرض شرائح الاقتراحات التي يمكن تفعيلها

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

يرسل مقتطف الرمز التالي إلى المستخدم الرسالة "تنبيهي بشأن النصائح الجديدة". اقتراح شريحة بجانب رد نصي.

Dialogflow Node.js
conv.ask('I can send you push notifications. Would you like that?');
conv.ask(new Suggestions('Send notifications'));
حزمة تطوير البرامج (SDK) للإجراءات Node.js
conv.ask(' I can send you push notifications. Would you like that?');
conv.ask(new Suggestions('Send notifications'));
لغة Java لـ Dialogflow
responseBuilder
    .add("I can send you push notifications. Would you like that?")
    .addSuggestions(new String[] {
        "Send notifications"
    });
حزمة تطوير البرامج (SDK) لـ "الإجراءات" في Java
responseBuilder
    .add("I can send you push notifications. Would you like that?")
    .addSuggestions(new String[] {
        "Send notifications"
    });
ملف JSON لـ Dialogflow

تجدر الإشارة إلى أن ملف JSON أدناه يصف استجابة ردّ تلقائي على الويب.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Hi! Welcome to Push Notifications!"
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "I can send you push notifications. Would you like that?"
            }
          }
        ],
        "suggestions": [
          {
            "title": "Send notifications"
          }
        ]
      }
    }
  }
}
ملف JSON لحزمة تطوير البرامج (SDK) الخاصة بالإجراءات

تجدر الإشارة إلى أن ملف JSON أدناه يصف استجابة ردّ تلقائي على الويب.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Hi! Welcome to Push Notifications!"
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": " I can send you push notifications. Would you like that?"
              }
            }
          ],
          "suggestions": [
            {
              "title": "Send notifications"
            }
          ]
        }
      }
    }
  ]
}

بعد النقر على الشريحة، عليك طلب الإذن UPDATE. يوضح الرمز التالي كيفية إجراء هذا باستخدام askForUpdatePermission في مكتبة برامج Node.js.

Dialogflow Node.js
  1. افتح الوكيل في وحدة تحكّم Dialogflow واختَر الغرض الذي تريد ضبطه للحصول على التحديثات.
  2. انتقِل للأسفل وصولاً إلى الردّ وافتح علامة التبويب مساعد Google.
  3. انقر على إضافة محتوى الرسالة واختَر شرائح الاقتراحات.
  4. اضبط نص الشريحة على عنصر يدعو المستخدم للموافقة. في جلسة المعمل، تم ضبط الشريحة على تنبيهي بتوفّر نصائح جديدة عند استخدام نموذج من نصائح "المهام مع مساعد Google".
  5. أضِف غرضًا آخر من Dialogflow، يُسمى setup_push، على سبيل المثال. اضبط إجراءً مقابلاً، مثل setup.push. ويجب أن يتطابق تعبير المستخدم في هذا الغرض مع نص شريحة الموافقة. في المثال إرسال تنبيه إليّ بشأن النصائح الجديدة
يوضّح المقتطف التالي كيفية طلب الإذن باستخدام الإجراءات على مكتبة برامج Google لـ Node.js:
app.intent('Subscribe to Notifications', (conv) => {
  conv.ask(new UpdatePermission({
    intent: 'Notification',
  }));
});
حزمة تطوير البرامج (SDK) للإجراءات Node.js

ينبغي لك تهيئة حل NLU لتشغيل دالة تطلب إذن في حال تطابق تعبير المستخدم مع قيمة الإشعارات الفورية طلب الموافقة في ما يلي مثال أساسي يستند إلى مطابقة السلاسل:

conv.ask(new UpdatePermission({
  intent: 'Notification',
}));
لغة Java لـ Dialogflow
  1. افتح الوكيل في وحدة تحكّم Dialogflow واختَر الغرض الذي تريد ضبطه للحصول على التحديثات.
  2. انتقِل للأسفل وصولاً إلى الردّ وافتح علامة التبويب مساعد Google.
  3. انقر على إضافة محتوى الرسالة واختَر شرائح الاقتراحات.
  4. اضبط نص الشريحة على عنصر يدعو المستخدم للموافقة. في جلسة المعمل، تم ضبط الشريحة على تنبيهي بتوفّر نصائح جديدة عند استخدام نموذج من نصائح "المهام مع مساعد Google".
  5. أضِف غرضًا آخر من Dialogflow، يُسمى setup_push، على سبيل المثال. اضبط إجراءً مقابلاً، مثل setup.push. ويجب أن يتطابق تعبير المستخدم في هذا الغرض مع نص شريحة الموافقة. في المثال إرسال تنبيه إليّ بشأن النصائح الجديدة
يوضّح المقتطف التالي كيفية طلب الإذن باستخدام الإجراءات على مكتبة برامج Google Java/Kotlin:
@ForIntent("Subscribe to Notifications")
public ActionResponse subscribeToNotifications(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.add(new UpdatePermission().setIntent("Notification"));
  return responseBuilder.build();
}
حزمة تطوير البرامج (SDK) لـ "الإجراءات" في Java

ينبغي لك تهيئة حل NLU لتشغيل دالة تطلب إذن في حال تطابق تعبير المستخدم مع قيمة الإشعارات الفورية طلب الموافقة في ما يلي مثال أساسي يستند إلى مطابقة السلاسل:

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.add(new UpdatePermission().setIntent("Notification"));
return responseBuilder.build();
ملف JSON لـ Dialogflow

تجدر الإشارة إلى أنّ ملف JSON أدناه يصف استجابة ردّ تلقائي على الويب باستخدام Dialogflow.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.PERMISSION",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
          "permissions": [
            "UPDATE"
          ],
          "updatePermissionValueSpec": {
            "intent": "tell_latest_tip"
          }
        }
      }
    }
  }
}
ملف JSON لحزمة تطوير البرامج (SDK) الخاصة بالإجراءات

تجدر الإشارة إلى أنّ ملف JSON أدناه يصف استجابة ردّ تلقائي على الويب باستخدام حزمة تطوير البرامج (SDK) للإجراءات.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.PERMISSION",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
            "permissions": [
              "UPDATE"
            ],
            "updatePermissionValueSpec": {
              "intent": "tell_latest_tip"
            }
          }
        }
      ]
    }
  ]
}

إكمال الاشتراك

لإنهاء الاشتراك من الردّ التلقائي على الويب على Node.js، يجب حفظ المعرِّف الخاص بإشعارات المستخدم والهدف الذي اختاره. يتم تمرير كلاهما كـ في حال منح المستخدم الإذن.

في حال إنشاء الإجراء الخاص بك باستخدام Dialogflow، ستحتاج إلى:

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

يوضّح الرمز التالي كيفية التعامل مع intent في Dialogflow باسم finish_push_setup باسم إجراء finish.push.setup:

Dialogflow Node.js
app.intent('Confirm Notifications Subscription', (conv) => {
  if (conv.arguments.get('PERMISSION')) {
    const updatesUserId = conv.arguments.get('UPDATES_USER_ID');
    // Store user ID in database for later use
    conv.close(`Ok, I'll start alerting you.`);
  } else {
    conv.close(`Ok, I won't alert you.`);
  }
});
حزمة تطوير البرامج (SDK) للإجراءات Node.js
app.intent('actions.intent.PERMISSION', (conv) => {
  if (conv.arguments.get('PERMISSION')) {
    const updatesUserId = conv.arguments.get('UPDATES_USER_ID');
    // Store user ID in database for later use
    conv.close(`Ok, I'll start alerting you.`);
  } else {
    conv.close(`Ok, I won't alert you.`);
  }
});
لغة Java لـ Dialogflow
@ForIntent("Confirm Notifications Subscription")
public ActionResponse confirmNotificationsSubscription(ActionRequest request) {
  // Verify the user has subscribed for push notifications
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  if (request.isPermissionGranted()) {
    Argument userId = request.getArgument(ConstantsKt.ARG_UPDATES_USER_ID);
    if (userId != null) {
      // Store the user's ID in the database
    }
    responseBuilder.add("Ok, I'll start alerting you.");
  } else {
    responseBuilder.add("Ok, I won't alert you.");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}
حزمة تطوير البرامج (SDK) لـ "الإجراءات" في Java
@ForIntent("actions.intent.PERMISSION")
public ActionResponse confirmNotificationsSubscription(ActionRequest request) {
  // Verify the user has subscribed for push notifications
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  if (request.isPermissionGranted()) {
    Argument userId = request.getArgument(ConstantsKt.ARG_UPDATES_USER_ID);
    if (userId != null) {
      // Store the user's ID in the database
    }
    responseBuilder.add("Ok, I'll start alerting you.");
  } else {
    responseBuilder.add("Ok, I won't alert you.");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}
ملف JSON لـ Dialogflow

تجدر الإشارة إلى أن ملف JSON أدناه يصف طلبًا للردّ التلقائي على الويب.

{
  "responseId": "ee9e7ed5-fa1a-48c6-aac7-f9fbe94f1f58-712767ed",
  "queryResult": {
    "queryText": "actions_intent_PERMISSION",
    "action": "confirm.subscription",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "outputContexts": [
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/actions_capability_screen_output"
      },
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/actions_capability_account_linking"
      },
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/actions_capability_media_response_audio"
      },
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/actions_capability_audio_output"
      },
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/actions_capability_web_browser"
      },
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/google_assistant_input_type_keyboard"
      },
      {
        "name": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k/contexts/actions_intent_permission",
        "parameters": {
          "PERMISSION": true,
          "text": "yes",
          "UPDATES_USER_ID": "ABwppHHssyPbvEBF1mgN7Ddwb7mkhiVohW9PZ--I_svqy7zFElA4DHkf9pn04UBd5gwZo26_RfXCQ8otcztyIfe6MCQ"
        }
      }
    ],
    "intent": {
      "name": "projects/PROJECT_ID/agent/intents/c7f7b30b-5b88-4bb5-b0b8-1cd0862d1dd2",
      "displayName": "Confirm Notifications Subscription"
    },
    "intentDetectionConfidence": 1,
    "languageCode": "en"
  },
  "originalDetectIntentRequest": {
    "source": "google",
    "version": "2",
    "payload": {
      "user": {
        "permissions": [
          "UPDATE"
        ],
        "locale": "en-US",
        "userVerificationStatus": "VERIFIED"
      },
      "conversation": {
        "conversationId": "ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k",
        "type": "ACTIVE",
        "conversationToken": "[]"
      },
      "inputs": [
        {
          "intent": "actions.intent.PERMISSION",
          "rawInputs": [
            {
              "inputType": "KEYBOARD",
              "query": "yes"
            }
          ],
          "arguments": [
            {
              "name": "PERMISSION",
              "boolValue": true,
              "textValue": "true"
            },
            {
              "name": "text",
              "rawText": "yes",
              "textValue": "yes"
            },
            {
              "name": "UPDATES_USER_ID",
              "textValue": "ABwppHHssyPbvEBF1mgN7Ddwb7mkhiVohW9PZ--I_svqy7zFElA4DHkf9pn04UBd5gwZo26_RfXCQ8otcztyIfe6MCQ"
            }
          ]
        }
      ],
      "surface": {
        "capabilities": [
          {
            "name": "actions.capability.SCREEN_OUTPUT"
          },
          {
            "name": "actions.capability.ACCOUNT_LINKING"
          },
          {
            "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
          },
          {
            "name": "actions.capability.AUDIO_OUTPUT"
          },
          {
            "name": "actions.capability.WEB_BROWSER"
          }
        ]
      },
      "availableSurfaces": [
        {
          "capabilities": [
            {
              "name": "actions.capability.AUDIO_OUTPUT"
            },
            {
              "name": "actions.capability.SCREEN_OUTPUT"
            },
            {
              "name": "actions.capability.WEB_BROWSER"
            }
          ]
        }
      ]
    }
  },
  "session": "projects/PROJECT_ID/agent/sessions/ABwppHGIgmmU3zBcYMF_vWoHaM4JUo3wniYBHdbUF25l63G7EQWjRnlne8Ar7AOcRHWn1lrEKGy8qdP0UXLcWDBq93k"
}
ملف JSON لحزمة تطوير البرامج (SDK) الخاصة بالإجراءات

تجدر الإشارة إلى أن ملف JSON أدناه يصف طلبًا للردّ التلقائي على الويب.

{
  "user": {
    "permissions": [
      "UPDATE"
    ],
    "locale": "en-US",
    "userVerificationStatus": "VERIFIED"
  },
  "conversation": {
    "conversationId": "ABwppHEP6OAFZHkSGEiZ5HYM9qrlk8YtIH1DQmJ52cxXELSPvM-kSc_tMJ_5O6ITbgVJlY9i2FIsKWjE_HXLke48",
    "type": "NEW"
  },
  "inputs": [
    {
      "intent": "actions.intent.PERMISSION",
      "rawInputs": [
        {
          "inputType": "KEYBOARD",
          "query": "yes"
        }
      ],
      "arguments": [
        {
          "name": "PERMISSION",
          "boolValue": true,
          "textValue": "true"
        },
        {
          "name": "text",
          "rawText": "yes",
          "textValue": "yes"
        },
        {
          "name": "UPDATES_USER_ID",
          "textValue": "ABwppHFvBKC-tMYUsUjJkm3YECgZvd6A3sOc7KuQvO4ZdQX3bGLmyoQ41dh4Zmtlzv_kaOKBt1Sf6eRpNbayynrl"
        }
      ]
    }
  ],
  "surface": {
    "capabilities": [
      {
        "name": "actions.capability.AUDIO_OUTPUT"
      },
      {
        "name": "actions.capability.WEB_BROWSER"
      },
      {
        "name": "actions.capability.SCREEN_OUTPUT"
      },
      {
        "name": "actions.capability.ACCOUNT_LINKING"
      },
      {
        "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
      }
    ]
  },
  "availableSurfaces": [
    {
      "capabilities": [
        {
          "name": "actions.capability.AUDIO_OUTPUT"
        },
        {
          "name": "actions.capability.SCREEN_OUTPUT"
        },
        {
          "name": "actions.capability.WEB_BROWSER"
        }
      ]
    }
  ]
}

إرسال الإشعارات

يمكنك إرسال إشعارات فورية إلى المستخدمين باستخدام واجهة برمجة تطبيقات الإجراءات. لاستخدام واجهة برمجة التطبيقات هذه، تحتاج إلى تفعيل واجهة برمجة التطبيقات في مشروع Google Cloud وإعداد وتنزيل مفتاح حساب خدمة JSON راجِع الخطوة 8 في التعليمات الواردة في نموذج الرمز هنا.

يمكنك بعد ذلك استخدام مكتبة برامج Google OAuth2 لتبديل مفتاح حساب الخدمة. لرمز الدخول، واستخدم الرمز المميز لمصادقة طلباتك إلى واجهة برمجة تطبيقات الإجراءات.

الحصول على مفتاح حساب الخدمة

  1. انتقِل إلى عنوان URL هذا، مع استبدال "example-project-1". في النهاية بمعرّف مشروعك في وحدة تحكّم المهام: https://console.developers.google.com/apis/api/actions.googleapis.com/overview?project=example-project-1
  2. إذا ظهر لك الزر تفعيل، انقر عليه. وبخلاف ذلك، يمكنك المتابعة إلى الخطوة 3.
  3. انتقِل إلى عنوان URL هذا، مع استبدال "example-project-1". في النهاية بمعرّف مشروعك في وحدة تحكّم المهام: https://console.developers.google.com/apis/credentials?project=example-project-1
  4. انقر على إنشاء بيانات اعتماد > مفتاح حساب الخدمة:
  5. انقر على المربع اختيار ضمن حساب الخدمة، ثم انقر على خدمة جديدة. الحساب:
  6. أدخِل اسمًا لحساب الخدمة، مثل "الإشعارات". ودور مالك المشروع:
  7. اختَر نوع مفتاح JSON وانقر على إنشاء. مفتاح حساب خدمة JSON هو على جهازك المحلي.

استبدال المفتاح برمز دخول وإرسال إشعار

لإرسال إشعار من خلال واجهة برمجة تطبيقات الإجراءات، يجب تبادل مفتاح حساب الخدمة لرمز الدخول. ننصح باستخدام برنامج واجهة برمجة تطبيقات Google المكتبة لذلك. في سلسلة مقتطفات الرمز التي تليها، نستخدم مكتبة برامج Node.js لواجهة Google API

  1. ثبِّت مكتبة برامج واجهة Google API واطلب ما يلي: npm install googleapis request --save
  2. استخدِم الرمز التالي للحصول على رمز الدخول من مفتاح حساب الخدمة. وأرسِل إشعارًا فوريًا:
حزمة Dialogflow Node.js
const {google} = require('googleapis');
const request = require('request');

const jwtClient = new google.auth.JWT(
  serviceAccount.client_email, null, serviceAccount.private_key,
  ['https://www.googleapis.com/auth/actions.fulfillment.conversation'],
  null
);

jwtClient.authorize((err, tokens) => {
  if (!err) {
    request.post('https://actions.googleapis.com/v2/conversations:send', {
      auth: {
        bearer: tokens.access_token,
      },
      json: true,
      body: {
        customPushMessage: {
          userNotification: {
            title: 'Push Notification Title',
          },
          target: {
            userId: '<UPDATES_USER_ID>',
            intent: 'Notification Intent',
          },
        },
        isInSandbox: true,
      },
    }, (err, httpResponse, body) => {
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
    });
  }
});
حزمة تطوير البرامج (SDK) للإجراءات Node.js
const {google} = require('googleapis');
const request = require('request');

const jwtClient = new google.auth.JWT(
  serviceAccount.client_email, null, serviceAccount.private_key,
  ['https://www.googleapis.com/auth/actions.fulfillment.conversation'],
  null
);

jwtClient.authorize((err, tokens) => {
  if (!err) {
    request.post('https://actions.googleapis.com/v2/conversations:send', {
      auth: {
        bearer: tokens.access_token,
      },
      json: true,
      body: {
        customPushMessage: {
          userNotification: {
            title: 'Push Notification Title',
          },
          target: {
            userId: '<UPDATES_ORDER_ID>',
            intent: 'Notification Intent',
          },
        },
        isInSandbox: true,
      },
    }, (err, httpResponse, body) => {
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
    });
  }
});
لغة Java لـ Dialogflow
final class Notification {

  private final String title;

  Notification(String title) {
    this.title = title;
  }

  String getTitle() {
    return title;
  }
}

final class Target {

  private final String userId;
  private final String intent;
  private final String locale;

  Target(String userId, String intent, String locale) {
    this.userId = userId;
    this.intent = intent;
    this.locale = locale;
  }

  String getUserId() {
    return userId;
  }

  String getIntent() {
    return intent;
  }

  String getLocale() {
    return locale;
  }
}

final class PushMessage {

  private final Notification userNotification;
  private final Target target;

  PushMessage(Notification userNotification, Target target) {
    this.userNotification = userNotification;
    this.target = target;
  }

  Notification getUserNotification() {
    return userNotification;
  }

  Target getTarget() {
    return target;
  }
}

final class PushNotification {

  private final PushMessage customPushMessage;
  private boolean isInSandbox;

  PushNotification(PushMessage customPushMessage, boolean isInSandbox) {
    this.customPushMessage = customPushMessage;
    this.isInSandbox = isInSandbox;
  }

  PushMessage getCustomPushMessage() {
    return customPushMessage;
  }

  boolean getIsInSandbox() {
    return isInSandbox;
  }
}

private PushNotification createNotification(String title, String userId, String intent, String locale) {
  Notification notification = new Notification(title);
  Target target = new Target(userId, intent, locale);
  PushMessage message = new PushMessage(notification, target);
  boolean isInSandbox = true;
  return new PushNotification(message, isInSandbox);
}

private ServiceAccountCredentials loadCredentials() throws IOException {
  String actionsApiServiceAccountFile =
      this.getClass().getClassLoader().getResource("service-account.json").getFile();
  InputStream actionsApiServiceAccount = new FileInputStream(actionsApiServiceAccountFile);
  ServiceAccountCredentials serviceAccountCredentials =
      ServiceAccountCredentials.fromStream(actionsApiServiceAccount);
  return (ServiceAccountCredentials)
      serviceAccountCredentials.createScoped(
          Collections.singleton(
              "https://www.googleapis.com/auth/actions.fulfillment.conversation"));
}

private String getAccessToken() throws IOException {
  AccessToken token = loadCredentials().refreshAccessToken();
  return token.getTokenValue();
}

public void sendNotification(String title, String userId, String intent, String locale) throws IOException {
  Preconditions.checkNotNull(title, "title cannot be null.");
  Preconditions.checkNotNull(userId, "userId cannot be null.");
  Preconditions.checkNotNull(intent, "intent cannot be null.");
  Preconditions.checkNotNull(locale, "locale cannot be null");
  PushNotification notification = createNotification(title, userId, intent, locale);

  HttpPost request = new HttpPost("https://actions.googleapis.com/v2/conversations:send");

  String token = getAccessToken();

  request.setHeader("Content-type", "application/json");
  request.setHeader("Authorization", "Bearer " + token);

  StringEntity entity = new StringEntity(new Gson().toJson(notification));
  entity.setContentType(ContentType.APPLICATION_JSON.getMimeType());
  request.setEntity(entity);
  HttpClient httpClient = HttpClientBuilder.create().build();
  httpClient.execute(request);
}
حزمة تطوير البرامج (SDK) لـ "الإجراءات" في Java
final class Notification {

  private final String title;

  Notification(String title) {
    this.title = title;
  }

  String getTitle() {
    return title;
  }
}

final class Target {

  private final String userId;
  private final String intent;

  Target(String userId, String intent) {
    this.userId = userId;
    this.intent = intent;
  }

  String getUserId() {
    return userId;
  }

  String getIntent() {
    return intent;
  }
}

final class PushMessage {

  private final Notification userNotification;
  private final Target target;

  PushMessage(Notification userNotification, Target target) {
    this.userNotification = userNotification;
    this.target = target;
  }

  Notification getUserNotification() {
    return userNotification;
  }

  Target getTarget() {
    return target;
  }
}

final class PushNotification {

  private final PushMessage customPushMessage;
  private boolean isInSandbox;

  PushNotification(PushMessage customPushMessage, boolean isInSandbox) {
    this.customPushMessage = customPushMessage;
    this.isInSandbox = isInSandbox;
  }

  PushMessage getCustomPushMessage() {
    return customPushMessage;
  }

  boolean getIsInSandbox() {
    return isInSandbox;
  }
}

private PushNotification createNotification(String title, String userId, String intent) {
  Notification notification = new Notification(title);
  Target target = new Target(userId, intent);
  PushMessage message = new PushMessage(notification, target);
  boolean isInSandbox = true;
  return new PushNotification(message, isInSandbox);
}

private ServiceAccountCredentials loadCredentials() throws IOException {
  String actionsApiServiceAccountFile =
      this.getClass().getClassLoader().getResource("service-account.json").getFile();
  InputStream actionsApiServiceAccount = new FileInputStream(actionsApiServiceAccountFile);
  ServiceAccountCredentials serviceAccountCredentials =
      ServiceAccountCredentials.fromStream(actionsApiServiceAccount);
  return (ServiceAccountCredentials)
      serviceAccountCredentials.createScoped(
          Collections.singleton(
              "https://www.googleapis.com/auth/actions.fulfillment.conversation"));
}

private String getAccessToken() throws IOException {
  AccessToken token = loadCredentials().refreshAccessToken();
  return token.getTokenValue();
}

public void sendNotification(String title, String userId, String intent) throws IOException {
  Preconditions.checkNotNull(title, "title cannot be null.");
  Preconditions.checkNotNull(userId, "userId cannot be null.");
  Preconditions.checkNotNull(intent, "intent cannot be null.");
  PushNotification notification = createNotification(title, userId, intent);

  HttpPost request = new HttpPost("https://actions.googleapis.com/v2/conversations:send");

  String token = getAccessToken();

  request.setHeader("Content-type", "application/json");
  request.setHeader("Authorization", "Bearer " + token);

  StringEntity entity = new StringEntity(new Gson().toJson(notification));
  entity.setContentType(ContentType.APPLICATION_JSON.getMimeType());
  request.setEntity(entity);
  HttpClient httpClient = HttpClientBuilder.create().build();
  httpClient.execute(request);
}