สำรวจใน Dialogflow
คลิกต่อไปเพื่อนำเข้าตัวอย่างการแจ้งเตือนใน Dialogflow จากนั้นทำตาม ด้านล่างเพื่อปรับใช้และทดสอบตัวอย่าง
- ป้อนชื่อ Agent และสร้าง Agent ใหม่ของ Dialogflow สำหรับตัวอย่าง
- หลังจากนำเข้าตัวแทนเสร็จแล้ว ให้คลิกไปที่ตัวแทน
- จากเมนูการนำทางหลัก ให้ไปที่การดำเนินการตามคำสั่งซื้อ
- เปิดใช้เครื่องมือแก้ไขในบรรทัด แล้วคลิกทำให้ใช้งานได้ เครื่องมือแก้ไขมีตัวอย่าง โค้ด
- จากเมนูการนำทางหลัก ให้ไปที่ Integrations แล้วคลิก Google Assistant
- ในหน้าต่างโมดัลที่ปรากฏขึ้น ให้เปิดใช้แสดงตัวอย่างการเปลี่ยนแปลงอัตโนมัติ แล้วคลิกทดสอบ เพื่อเปิดเครื่องมือจำลอง Actions
- ในเครื่องมือจำลอง ให้ป้อน
Talk to my test app
เพื่อทดสอบตัวอย่าง
การดำเนินการของคุณสามารถส่งข้อความ Push ไปยังผู้ใช้เมื่อใดก็ตามที่มีความเกี่ยวข้อง เช่น การส่ง การช่วยเตือนเมื่อใกล้ถึงวันที่ครบกำหนดของงาน
ในคู่มือนี้ เราใช้ตัวอย่างเคล็ดลับเกี่ยวกับ Actions on Google เป็นข้อมูลอ้างอิงเพื่อแสดงวิธีตั้งค่าข้อความ Push สำหรับการดำเนินการของคุณ เมื่อผู้ใช้เรียกใช้การดำเนินการนี้ ระบบจะถามผู้ใช้ว่าต้องการฟังเคล็ดลับไหม เกี่ยวกับการพัฒนาการดำเนินการของตนเอง ผู้ใช้สามารถ เลือกหมวดหมู่ที่เจาะจงหรือสุ่มเลือกสำหรับเคล็ดลับ หรือจะ เลือกฟังเคล็ดลับล่าสุด
แพลตฟอร์มที่รองรับ
ข้อความ Push พร้อมใช้งานบนอุปกรณ์ Android และ iOS (อุปกรณ์ iOS ต้องมี ติดตั้งแอป Assistant ไว้เพื่อรับข้อความ Push) ไม่ได้ ปัจจุบันรองรับลำโพงที่เปิดใช้งานด้วยเสียง จออัจฉริยะ หรือแพลตฟอร์มอื่นๆ
ข้อกำหนดเบื้องต้น
ต้องกำหนดค่า Actions ในโปรเจ็กต์ Actions อย่างน้อย 1 รายการเป็น เรียกใช้ Intent ซึ่งจะเรียกใช้เมื่อผู้ใช้แตะการแจ้งเตือนที่ได้รับจาก Assistant
ไม่สามารถกำหนดค่าการดำเนินการของคุณให้เรียกใช้ Intent ต้อนรับเริ่มต้นจากข้อความ Push ได้
ตั้งค่าคอนโซล
วิธีเพิ่มการรองรับข้อความ Push ลงในการดำเนินการ
ไปที่คอนโซล Actions และนำทาง เป็น Build > การดำเนินการ
คลิกการดำเนินการที่ตรงกับ Intent การทริกเกอร์เพิ่มเติมที่คุณต้องการ เปิดใช้ข้อความ Push สำหรับ
สำหรับตัวอย่างเคล็ดลับของ Actions on Google คุณจะเลือก "tell_latest_Tip"
เลื่อนลงไปที่ส่วนการมีส่วนร่วมของผู้ใช้แล้วเปิด คุณต้องการส่งข้อความ Push
ป้อนชื่อเนื้อหา
สำหรับตัวอย่างเคล็ดลับของ Actions on Google ชื่ออาจเป็น "เพิ่มเคล็ดลับใหม่"
คลิกบันทึก
การนำเข้า
ตามวัตถุประสงค์ของส่วนถัดไป ซึ่งได้แก่ ในรหัสการดำเนินการตามคำสั่งซื้อ คุณจะ จำเป็นต้องประกาศการนำเข้าต่อไปนี้
const { dialogflow, UpdatePermission, Suggestions, } = require('actions-on-google');
const { actionssdk, UpdatePermission, Suggestions, } = require('actions-on-google');
ผู้ใช้ที่เลือกรับ
ก่อนที่จะส่งข้อความ Push ไปยังผู้ใช้ คุณต้องขอให้ผู้ใช้เลือกรับ ซึ่งทำได้โดยแสดงชิปคำแนะนำเพื่อขอสิทธิ์ เมื่อให้สิทธิ์แล้ว คุณจะได้รับรหัสผู้ใช้ที่อัปเดตเพื่อส่ง ข้อความ Push ไปยังผู้ใช้รายนั้น
แสดงชิปคำแนะนำสำหรับการเลือกใช้
ก่อนที่ผู้ใช้จะรับข้อความ Push จากการดำเนินการของคุณได้ คุณต้องแสดง ชิปคำแนะนำเพื่อเชิญให้เลือกใช้ข้อความ Push
ข้อมูลโค้ดต่อไปนี้จะส่ง "แจ้งเตือนฉันเกี่ยวกับเคล็ดลับใหม่" ให้แก่ผู้ใช้ คำแนะนำ ชิปควบคู่ไปกับข้อความตอบกลับ
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 ด้านล่างจะอธิบายการตอบสนองของเว็บฮุค
{ "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 ด้านล่างจะอธิบายการตอบสนองของเว็บฮุค
{ "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
- เปิด Agent ในคอนโซล Dialogflow แล้วเลือก Intent ที่จะกำหนดค่าสำหรับการอัปเดต
- เลื่อนลงไปที่การตอบกลับ แล้วเปิดแท็บ Google Assistant
- คลิกเพิ่มเนื้อหาข้อความ แล้วเลือกชิปคำแนะนำ
- ตั้งค่าข้อความชิปให้เป็นสิ่งที่เชิญผู้ใช้ให้เลือกรับ ใน ตัวอย่างเคล็ดลับเกี่ยวกับ Actions on Google ที่เราตั้งค่าชิปให้แจ้งเตือนฉันเมื่อมีเคล็ดลับใหม่ๆ
- เพิ่ม Intent ของ Dialogflow อื่น เช่น setup_push และ ตั้งค่าการดำเนินการที่เกี่ยวข้อง เช่น setup.push การแสดงความตั้งใจของผู้ใช้นี้ต้องตรงกับข้อความของชิปการเลือกใช้ ในตัวอย่างของเรา แจ้งเตือนฉันเมื่อมีเคล็ดลับใหม่
app.intent('Subscribe to Notifications', (conv) => { conv.ask(new UpdatePermission({ intent: 'Notification', })); });
คุณควรกำหนดค่าโซลูชัน NLU เพื่อทริกเกอร์ฟังก์ชันที่ถาม สิทธิ์ หากนิพจน์ของผู้ใช้ตรงกับค่าของข้อความ Push ให้เลือกใช้ ต่อไปนี้เป็นตัวอย่างพื้นฐานที่สุดตามการจับคู่สตริง:
conv.ask(new UpdatePermission({ intent: 'Notification', }));
- เปิด Agent ในคอนโซล Dialogflow แล้วเลือก Intent ที่จะกำหนดค่าสำหรับการอัปเดต
- เลื่อนลงไปที่การตอบกลับ แล้วเปิดแท็บ Google Assistant
- คลิกเพิ่มเนื้อหาข้อความ แล้วเลือกชิปคำแนะนำ
- ตั้งค่าข้อความชิปให้เป็นสิ่งที่เชิญผู้ใช้ให้เลือกรับ ใน ตัวอย่างเคล็ดลับเกี่ยวกับ Actions on Google ที่เราตั้งค่าชิปให้แจ้งเตือนฉันเมื่อมีเคล็ดลับใหม่ๆ
- เพิ่ม Intent ของ Dialogflow อื่น เช่น setup_push และ ตั้งค่าการดำเนินการที่เกี่ยวข้อง เช่น setup.push การแสดงความตั้งใจของผู้ใช้นี้ต้องตรงกับข้อความของชิปการเลือกใช้ ในตัวอย่างของเรา แจ้งเตือนฉันเมื่อมีเคล็ดลับใหม่
@ForIntent("Subscribe to Notifications") public ActionResponse subscribeToNotifications(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build(); }
คุณควรกำหนดค่าโซลูชัน NLU เพื่อทริกเกอร์ฟังก์ชันที่ถาม สิทธิ์ หากนิพจน์ของผู้ใช้ตรงกับค่าของข้อความ Push ให้เลือกใช้ ต่อไปนี้เป็นตัวอย่างพื้นฐานที่สุดตามการจับคู่สตริง:
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build();
โปรดทราบว่า 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 ด้านล่างจะอธิบายการตอบสนองของเว็บฮุคที่ใช้ 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" } } } ] } ] }
ดำเนินการสมัครใช้บริการให้เสร็จสิ้น
ในการทำให้การสมัครใช้บริการเสร็จสมบูรณ์จากเว็บฮุค Node.js คุณจะต้องบันทึก รหัสการแจ้งเตือนของผู้ใช้และความตั้งใจที่เลือก ทั้ง 2 ประเภทเป็น อาร์กิวเมนต์หากผู้ใช้ให้สิทธิ์
หากการดำเนินการของคุณสร้างด้วย Dialogflow แล้ว คุณต้องทำดังนี้
- เพิ่ม Intent ที่จัดการ
actions_intent_PERMISSION
- ระบุชื่อการดำเนินการของ Intent ให้เว็บฮุคของคุณทำได้ ใช้ตัวกรองไว้ภายหลัง
โค้ดต่อไปนี้แสดงวิธีจัดการ Intent ของ Dialogflow ด้วย Intent
ชื่อ 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 ด้านล่างจะอธิบายคำขอที่ส่งไปยังเว็บฮุค
{ "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 ด้านล่างจะอธิบายคำขอที่ส่งไปยังเว็บฮุค
{ "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" } ] } ] }
ส่งการแจ้งเตือน
คุณส่งข้อความ Push ไปยังผู้ใช้ได้โดยใช้ 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
- คลิกสร้างข้อมูลเข้าสู่ระบบ > คีย์บัญชีบริการ
- คลิกช่องเลือกใต้บัญชีบริการ แล้วคลิกบริการใหม่ บัญชี
- ตั้งชื่อบัญชีบริการ เช่น "การแจ้งเตือน" และบทบาทของ เจ้าของโปรเจ็กต์
- เลือกประเภทคีย์ JSON แล้วคลิกสร้าง คีย์บัญชีบริการ JSON คือ ดาวน์โหลดไปยังเครื่องภายในของคุณแล้ว
แลกเปลี่ยนคีย์สำหรับโทเค็นเพื่อการเข้าถึงและส่งการแจ้งเตือน
หากต้องการส่งการแจ้งเตือนผ่าน Actions API คุณจะต้องแลกเปลี่ยน คีย์บัญชีบริการสำหรับโทเค็นเพื่อการเข้าถึง เราขอแนะนำให้ใช้ไคลเอ็นต์ Google API สำหรับเรื่องนี้ ในชุดข้อมูลโค้ดที่ตามมา เราจะใช้ ไลบรารีของไคลเอ็นต์ Google API Node.js
- ติดตั้งไลบรารีไคลเอ็นต์ Google API และส่งคำขอดังนี้
npm install googleapis request --save
- ใช้รหัสต่อไปนี้เพื่อรับโทเค็นเพื่อการเข้าถึงจากคีย์บัญชีบริการ และส่งข้อความ Push ดังนี้
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); }