אפשרויות נוספות ב-Dialogflow
לוחצים על Continue (המשך) כדי לייבא את דוגמת ההתראות שלנו ב-Dialogflow. לאחר מכן, פועלים לפי כדי לפרוס ולבדוק את הדוגמה:
- מזינים שם של נציג ויוצרים סוכן חדש ב-Dialogflow לדוגמה.
- כשהייבוא של הנציג מסתיים, לוחצים על מעבר לנציג.
- בתפריט הניווט הראשי עוברים אל Fulfillment (מילוי).
- מפעילים את העורך המוטבע ולוחצים על פריסה. כלי העריכה מכיל את הדוגמה
- בתפריט הניווט הראשי, עוברים אל Integrations, ואז לוחצים על Google Assistant.
- בחלון החלון שנפתח, מפעילים את האפשרות שינויים בתצוגה מקדימה אוטומטית ולוחצים על בדיקה. כדי לפתוח את סימולטור הפעולות.
- בסימולטור, מזינים
Talk to my test app
כדי לבדוק את הטעימה.
הפעולה יכולה לשלוח התראות למשתמשים כשהם רלוונטיים, כמו שליחה תזכורת כשתאריך היעד של המשימה מתקרב.
במדריך הזה נשתמש בדוגמה לטיפים לשימוש ב-Actions on Google כחומר עזר שיסביר לכם איך להגדיר התראות על הפעולה שלכם. כשהמשתמשים מפעילים את הפעולה, נשאלת השאלה אם הם רוצים לשמוע טיפ לפתח פעולה משלהם. המשתמשים יכולים לבחור עבור הטיפ קטגוריה ספציפית או שנבחרה באופן אקראי, או שהם יכולים לבחור לשמוע את הטיפ העדכני ביותר.
פלטפורמות נתמכות
התראות זמינות במכשירי Android ו-iOS (יש צורך במכשירי iOS) צריך להתקין את אפליקציית Assistant כדי לקבל התראות). אלו לא נתמך כרגע ברמקולים עם הפעלה קולית, במסכים חכמים או בפלטפורמות אחרות.
דרישות מוקדמות
יש להגדיר לפחות פעולה אחת מהפעולות בפרויקט Actions (פעולות) כ כוונת הפעלה, שתופעל כאשר המשתמש יקיש על התראה שהתקבלה Assistant.
לא ניתן להגדיר את הפעולות כך שיפעילו את ברירת המחדל של Intent קבלת הפנים מהתראה.
הגדרת מסוף
כדי להוסיף תמיכה בהתראות לפעולה:
עוברים אל Actions Console ומנווטים אל Build > פעולות.
לוחצים על הפעולה שתואמת לכוונת ההפעלה הנוספת שרוצים הפעלת ההתראות עבור.
כדי לקבל את דוגמת הטיפים בנושא פעולות ב-Google, צריך לבחור באפשרות "tell_previous_tip".
גוללים למטה לקטע התעניינות המשתמשים ומפעילים את רוצה לשלוח התראות?
מזינים את שם התוכן.
בדוגמה של הטיפים ב-Actions on Google, הכותרת יכולה להיות "נוסף טיפ חדש".
לוחצים על שמירה.
יבוא
למטרות הקטעים הבאים, בקוד מילוי ההזמנות שלכם: תצטרכו להצהיר על הייבוא הבא:
const { dialogflow, UpdatePermission, Suggestions, } = require('actions-on-google');
const { actionssdk, UpdatePermission, Suggestions, } = require('actions-on-google');
משתמשים שמביעים הסכמה
כדי לשלוח התראות למשתמשים, צריך לבקש מהם להביע הסכמה. כדי לעשות את זה, אפשר להציג להם צ'יפ של הצעה ולבקש ממנו רשות. כשהם מעניקים הרשאה, מקבלים מזהה משתמש לעדכון שצריך לשלוח התראות למשתמש הזה.
הצגת צ'יפים של הצעות להבעת הסכמה
כדי שהמשתמשים יוכלו לקבל התראות על הפעולה, צריך להציג להם צ'יפ של הצעה כדי להזמין אותם להביע הסכמה לקבלת התראות.
קטע הקוד הבא שולח למשתמש את ההודעה 'הזהיר לי לגבי טיפים חדשים' הצעה לצד תשובת טקסט.
conv.ask('I can send you push notifications. Would you like that?'); conv.ask(new Suggestions('Send notifications'));
conv.ask(' I can send you push notifications. Would you like that?'); conv.ask(new Suggestions('Send notifications'));
responseBuilder .add("I can send you push notifications. Would you like that?") .addSuggestions(new String[] { "Send notifications" });
responseBuilder .add("I can send you push notifications. Would you like that?") .addSuggestions(new String[] { "Send notifications" });
הערה: קובץ ה-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 שבהמשך מתאר תגובת 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 ובוחרים את הכוונה שמגדירים לעדכונים.
- גוללים למטה אל תגובה ופותחים את הכרטיסייה Google Assistant.
- לוחצים על הוספת תוכן ההודעה ובוחרים באפשרות צ'יפים של הצעות.
- מגדירים את טקסט הצ'יפ למשהו שמזמין את המשתמש להביע הסכמה. ב דוגמה לטיפים ל-Actions on Google שאנחנו מגדירים את הצ'יפ כהתראות על טיפים חדשים.
- מוסיפים עוד Intent של Dialogflow, שנקרא לדוגמה setup_push, וגם מגדירים פעולה תואמת, למשל setup.push. ביטוי המשתמש של ה-Intent הזה חייב להתאים לטקסט של צ'יפ בקשת ההסכמה, בדוגמה שלנו, קבלו התראה על טיפים חדשים.
app.intent('Subscribe to Notifications', (conv) => { conv.ask(new UpdatePermission({ intent: 'Notification', })); });
עליך להגדיר את פתרון ה-NLU שלך כך שתפעיל פונקציה שמבקשת את הרשאה, אם ביטוי המשתמש תואם לערך של ההתראות להבעת הסכמה. הנה דוגמה בסיסית מאוד שמבוססת על התאמה למחרוזות:
conv.ask(new UpdatePermission({ intent: 'Notification', }));
- פותחים את הנציג במסוף Dialogflow ובוחרים את הכוונה שמגדירים לעדכונים.
- גוללים למטה אל תגובה ופותחים את הכרטיסייה Google Assistant.
- לוחצים על הוספת תוכן ההודעה ובוחרים באפשרות צ'יפים של הצעות.
- מגדירים את טקסט הצ'יפ למשהו שמזמין את המשתמש להביע הסכמה. ב דוגמה לטיפים ל-Actions on Google שאנחנו מגדירים את הצ'יפ כהתראות על טיפים חדשים.
- מוסיפים עוד Intent של Dialogflow, שנקרא לדוגמה setup_push, וגם מגדירים פעולה תואמת, למשל setup.push. ביטוי המשתמש של ה-Intent הזה חייב להתאים לטקסט של צ'יפ בקשת ההסכמה, בדוגמה שלנו, קבלו התראה על טיפים חדשים.
@ForIntent("Subscribe to Notifications") public ActionResponse subscribeToNotifications(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build(); }
עליך להגדיר את פתרון ה-NLU שלך כך שתפעיל פונקציה שמבקשת את הרשאה, אם ביטוי המשתמש תואם לערך של ההתראות להבעת הסכמה. הנה דוגמה בסיסית מאוד שמבוססת על התאמה למחרוזות:
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build();
הערה: קובץ ה-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 שבהמשך מתאר תגובת 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
:
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.`); } });
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.`); } });
@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(); }
@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 בהמשך מתאר בקשה ל-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 בהמשך מתאר בקשה ל-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.
טעינת מפתח לחשבון שירות
- עוברים לכתובת ה-URL הזו, מחליפים את "example-project-1" בסוף מזהה הפרויקט. במסוף Actions: https://console.developers.google.com/apis/api/actions.googleapis.com/overview?project=example-project-1
- אם מופיע לחצן הפעלה, לוחצים עליו. אם לא, תוכלו לדלג לשלב 3.
- עוברים לכתובת ה-URL הזו, מחליפים את "example-project-1" בסוף מזהה הפרויקט. במסוף Actions: https://console.developers.google.com/apis/credentials?project=example-project-1
- לוחצים על Create credentials > מפתח לחשבון השירות.
- לוחצים על התיבה בחירה בקטע חשבון שירות ואז לוחצים על שירות חדש חשבון.
- נותנים לחשבון השירות שם כמו 'התראות'. והתפקיד של בעלי הפרויקט.
- בוחרים את סוג מפתח ה-JSON ולוחצים על יצירה. מפתח JSON לחשבון שירות הוא שהורדתם למחשב המקומי.
החלפת המפתח באסימון גישה ושליחת התראה
כדי לשלוח התראה דרך Actions API, צריך את המפתח של חשבון השירות של אסימון גישה. מומלץ להשתמש בלקוח Google API בספרייה הזו. בסדרת קטעי הקוד הבאים, אנחנו משתמשים ספריית הלקוח Node.js של Google API.
- מתקינים את ספריית הלקוח של Google API ומבקשים:
npm install googleapis request --save
- משתמשים בקוד הבא כדי לקבל אסימון גישה מהמפתח של חשבון השירות ולשלוח התראה:
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}`); }); } });
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}`); }); } });
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); }
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); }