התראות (Dialogflow)

אפשרויות נוספות ב-Dialogflow

לוחצים על Continue (המשך) כדי לייבא את דוגמת ההתראות שלנו ב-Dialogflow. לאחר מכן, פועלים לפי כדי לפרוס ולבדוק את הדוגמה:

  1. מזינים שם של נציג ויוצרים סוכן חדש ב-Dialogflow לדוגמה.
  2. כשהייבוא של הנציג מסתיים, לוחצים על מעבר לנציג.
  3. בתפריט הניווט הראשי עוברים אל Fulfillment (מילוי).
  4. מפעילים את העורך המוטבע ולוחצים על פריסה. כלי העריכה מכיל את הדוגמה
  5. בתפריט הניווט הראשי, עוברים אל Integrations, ואז לוחצים על Google Assistant.
  6. בחלון החלון שנפתח, מפעילים את האפשרות שינויים בתצוגה מקדימה אוטומטית ולוחצים על בדיקה. כדי לפתוח את סימולטור הפעולות.
  7. בסימולטור, מזינים Talk to my test app כדי לבדוק את הטעימה.
המשך

הפעולה יכולה לשלוח התראות למשתמשים כשהם רלוונטיים, כמו שליחה תזכורת כשתאריך היעד של המשימה מתקרב.

במדריך הזה נשתמש בדוגמה לטיפים לשימוש ב-Actions on Google כחומר עזר שיסביר לכם איך להגדיר התראות על הפעולה שלכם. כשהמשתמשים מפעילים את הפעולה, נשאלת השאלה אם הם רוצים לשמוע טיפ לפתח פעולה משלהם. המשתמשים יכולים לבחור עבור הטיפ קטגוריה ספציפית או שנבחרה באופן אקראי, או שהם יכולים לבחור לשמוע את הטיפ העדכני ביותר.

פלטפורמות נתמכות

התראות זמינות במכשירי Android ו-iOS (יש צורך במכשירי iOS) צריך להתקין את אפליקציית Assistant כדי לקבל התראות). אלו לא נתמך כרגע ברמקולים עם הפעלה קולית, במסכים חכמים או בפלטפורמות אחרות.

דרישות מוקדמות

יש להגדיר לפחות פעולה אחת מהפעולות בפרויקט Actions (פעולות) כ כוונת הפעלה, שתופעל כאשר המשתמש יקיש על התראה שהתקבלה Assistant.

לא ניתן להגדיר את הפעולות כך שיפעילו את ברירת המחדל של Intent קבלת הפנים מהתראה.

הגדרת מסוף

כדי להוסיף תמיכה בהתראות לפעולה:

  1. עוברים אל Actions Console ומנווטים אל Build > פעולות.

  2. לוחצים על הפעולה שתואמת לכוונת ההפעלה הנוספת שרוצים הפעלת ההתראות עבור.

    כדי לקבל את דוגמת הטיפים בנושא פעולות ב-Google, צריך לבחור באפשרות "tell_previous_tip".

  3. גוללים למטה לקטע התעניינות המשתמשים ומפעילים את רוצה לשלוח התראות?

  4. מזינים את שם התוכן.

    בדוגמה של הטיפים ב-Actions on 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'));
Actions SDK Node.js
conv.ask(' I can send you push notifications. Would you like that?');
conv.ask(new Suggestions('Send notifications'));
Dialogflow Java
responseBuilder
    .add("I can send you push notifications. Would you like that?")
    .addSuggestions(new String[] {
        "Send notifications"
    });
Actions SDK ב-Java
responseBuilder
    .add("I can send you push notifications. Would you like that?")
    .addSuggestions(new String[] {
        "Send notifications"
    });
JSON של Dialogflow

הערה: קובץ ה-JSON שבהמשך מתאר תגובת webhook.

{
  "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 שבהמשך מתאר תגובת webhook.

{
  "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 Assistant.
  3. לוחצים על הוספת תוכן ההודעה ובוחרים באפשרות צ'יפים של הצעות.
  4. מגדירים את טקסט הצ'יפ למשהו שמזמין את המשתמש להביע הסכמה. ב דוגמה לטיפים ל-Actions on Google שאנחנו מגדירים את הצ'יפ כהתראות על טיפים חדשים.
  5. מוסיפים עוד Intent של Dialogflow, שנקרא לדוגמה setup_push, וגם מגדירים פעולה תואמת, למשל setup.push. ביטוי המשתמש של ה-Intent הזה חייב להתאים לטקסט של צ'יפ בקשת ההסכמה, בדוגמה שלנו, קבלו התראה על טיפים חדשים.
קטע הקוד הבא מראה איך לבקש הרשאה באמצעות האפשרות 'פעולות' בספריית הלקוח של Google ל-Node.js:
app.intent('Subscribe to Notifications', (conv) => {
  conv.ask(new UpdatePermission({
    intent: 'Notification',
  }));
});
Actions SDK Node.js

עליך להגדיר את פתרון ה-NLU שלך כך שתפעיל פונקציה שמבקשת את הרשאה, אם ביטוי המשתמש תואם לערך של ההתראות להבעת הסכמה. הנה דוגמה בסיסית מאוד שמבוססת על התאמה למחרוזות:

conv.ask(new UpdatePermission({
  intent: 'Notification',
}));
Dialogflow Java
  1. פותחים את הנציג במסוף Dialogflow ובוחרים את הכוונה שמגדירים לעדכונים.
  2. גוללים למטה אל תגובה ופותחים את הכרטיסייה Google Assistant.
  3. לוחצים על הוספת תוכן ההודעה ובוחרים באפשרות צ'יפים של הצעות.
  4. מגדירים את טקסט הצ'יפ למשהו שמזמין את המשתמש להביע הסכמה. ב דוגמה לטיפים ל-Actions on Google שאנחנו מגדירים את הצ'יפ כהתראות על טיפים חדשים.
  5. מוסיפים עוד Intent של Dialogflow, שנקרא לדוגמה setup_push, וגם מגדירים פעולה תואמת, למשל setup.push. ביטוי המשתמש של ה-Intent הזה חייב להתאים לטקסט של צ'יפ בקשת ההסכמה, בדוגמה שלנו, קבלו התראה על טיפים חדשים.
קטע הקוד הבא מראה איך לבקש הרשאה באמצעות האפשרות 'פעולות' בספריית הלקוח של 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();
}
Actions SDK ב-Java

עליך להגדיר את פתרון ה-NLU שלך כך שתפעיל פונקציה שמבקשת את הרשאה, אם ביטוי המשתמש תואם לערך של ההתראות להבעת הסכמה. הנה דוגמה בסיסית מאוד שמבוססת על התאמה למחרוזות:

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

הערה: קובץ ה-JSON שבהמשך מתאר תגובת webhook באמצעות 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 שבהמשך מתאר תגובת webhook באמצעות Actions 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"
            }
          }
        }
      ]
    }
  ]
}

השלמת המינוי

כדי לסיים את תהליך המינוי מה-webhook של Node.js, צריך לשמור את ה- מזהה ההתראות של המשתמש והכוונה שהוא בחר. שניהם מועברים כ- ארגומנטים אם המשתמש מעניק את ההרשאה.

אם הפעולה נוצרה באמצעות Dialogflow, אתם צריכים:

  • צריך להוסיף Intent שמטפל בactions_intent_PERMISSION.
  • צריך לציין את שם הפעולה של ה-Intent למשהו שה-webhook יכול לסנן למועד מאוחר יותר.

הקוד הבא מראה איך לטפל ב-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.`);
  }
});
Actions 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.`);
  }
});
Dialogflow Java
@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();
}
Actions 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 בהמשך מתאר בקשה ל-webhook.

{
  "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 בהמשך מתאר בקשה ל-webhook.

{
  "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"
        }
      ]
    }
  ]
}

שליחת התראות

אפשר לשלוח התראות למשתמשים באמצעות Actions API. כדי להשתמש ב-API הזה צריך להפעיל את ה-API בפרויקט ב-Google Cloud, להגדיר אותו ולהוריד מפתח לחשבון שירות בפורמט JSON. ראו שלב מס' 8 בהוראות שבדוגמת הקוד שכאן.

לאחר מכן אפשר להשתמש בספריית הלקוח של OAuth2 של Google כדי להחליף את המפתח של חשבון השירות לאסימון גישה, ולהשתמש באסימון כדי לאמת את הבקשות ל-Actions API.

טעינת מפתח לחשבון שירות

  1. עוברים לכתובת ה-URL הזו, מחליפים את "example-project-1" בסוף מזהה הפרויקט. במסוף Actions: https://console.developers.google.com/apis/api/actions.googleapis.com/overview?project=example-project-1
  2. אם מופיע לחצן הפעלה, לוחצים עליו. אם לא, תוכלו לדלג לשלב 3.
  3. עוברים לכתובת ה-URL הזו, מחליפים את "example-project-1" בסוף מזהה הפרויקט. במסוף Actions: https://console.developers.google.com/apis/credentials?project=example-project-1
  4. לוחצים על Create credentials > מפתח לחשבון השירות.
  5. לוחצים על התיבה בחירה בקטע חשבון שירות ואז לוחצים על שירות חדש חשבון.
  6. נותנים לחשבון השירות שם כמו 'התראות'. והתפקיד של בעלי הפרויקט.
  7. בוחרים את סוג מפתח ה-JSON ולוחצים על יצירה. מפתח JSON לחשבון שירות הוא שהורדתם למחשב המקומי.

החלפת המפתח באסימון גישה ושליחת התראה

כדי לשלוח התראה דרך Actions API, צריך את המפתח של חשבון השירות של אסימון גישה. מומלץ להשתמש בלקוח Google API בספרייה הזו. בסדרת קטעי הקוד הבאים, אנחנו משתמשים ספריית הלקוח 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}`);
    });
  }
});
Actions 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}`);
    });
  }
});
Dialogflow 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;
  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);
}
Actions 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);
}