Khám phá trong Dialogflow
Nhấp vào Tiếp tục để nhập mẫu Thông báo của chúng tôi vào Dialogflow. Sau đó, hãy làm theo các bước bên dưới để triển khai và thử nghiệm mẫu:
- Nhập tên nhân viên hỗ trợ và tạo một nhân viên hỗ trợ Dialogflow mới cho mẫu.
- Sau khi nhân viên hỗ trợ nhập xong, hãy nhấp vào Chuyển đến nhân viên hỗ trợ.
- Trong trình đơn điều hướng chính, hãy chuyển đến phần Fulfillment (Thực hiện đơn hàng).
- Bật Inline Editor (Trình chỉnh sửa cùng dòng), sau đó nhấp vào Deploy (Triển khai). Trình chỉnh sửa chứa mẫu .
- Trong trình đơn điều hướng chính, hãy chuyển đến mục Tích hợp, rồi nhấp vào Google Trợ lý Google.
- Trong cửa sổ phụ xuất hiện, hãy bật tuỳ chọn Tự động xem trước các thay đổi rồi nhấp vào Kiểm tra để mở Trình mô phỏng thao tác.
- Trong trình mô phỏng, hãy nhập
Talk to my test app
để kiểm tra mẫu!
Hành động của bạn có thể đẩy thông báo cho người dùng bất cứ khi nào thích hợp, chẳng hạn như gửi lời nhắc khi ngày đến hạn của một việc cần làm đang đến gần.
Trong hướng dẫn này, chúng tôi sẽ dùng Mẫu các mẹo về Actions on Google để tham khảo cách thiết lập thông báo đẩy cho Hành động của bạn. Khi người dùng gọi Hành động này, nó sẽ hỏi xem họ có muốn nghe mẹo hay không về cách phát triển Hành động của chính họ. Người dùng có thể chọn danh mục cụ thể hoặc được chọn ngẫu nhiên cho tiền boa hoặc họ có thể chọn nghe mẹo gần đây nhất.
Nền tảng được hỗ trợ
Thông báo đẩy hoạt động trên thiết bị Android và iOS (thiết bị iOS phải cài đặt ứng dụng Trợ lý để nhận thông báo đẩy). Không hiện được hỗ trợ trên loa kích hoạt bằng giọng nói, màn hình thông minh hoặc các nền tảng khác.
Điều kiện tiên quyết
Ít nhất một trong các Hành động trong dự án Actions của bạn phải được định cấu hình dưới dạng ý định kích hoạt sẽ được gọi khi người dùng nhấn vào một thông báo nhận được từ Trợ lý.
Bạn không thể định cấu hình Hành động để kích hoạt Ý định chào mừng mặc định qua thông báo đẩy.
Thiết lập bảng điều khiển
Cách thêm tính năng hỗ trợ cho thông báo đẩy vào Hành động của bạn:
Truy cập vào bảng điều khiển Actions rồi chuyển đến vào Build > Hành động.
Nhấp vào Hành động khớp với ý định kích hoạt bổ sung mà bạn muốn bật thông báo đẩy.
Đối với các mẹo áp dụng cho Hành động trên Google, bạn sẽ chọn "tell_Latest_tip".
Di chuyển xuống phần Mức độ tương tác của người dùng rồi bật Bạn có muốn gửi thông báo đẩy không.
Nhập Tiêu đề nội dung.
Đối với mẫu mẹo sử dụng Actions on Google, tiêu đề có thể là "Đã thêm mẹo mới".
Nhấp vào Lưu.
Nhập
Trong các phần tiếp theo, trong mã thực hiện, bạn sẽ cần khai báo các lệnh nhập sau:
const { dialogflow, UpdatePermission, Suggestions, } = require('actions-on-google');
const { actionssdk, UpdatePermission, Suggestions, } = require('actions-on-google');
Người dùng chọn tham gia
Trước khi có thể gửi thông báo đẩy cho người dùng, bạn phải yêu cầu họ chọn nhận thông báo. Bạn có thể làm việc này bằng cách cho họ thấy khối đề xuất để yêu cầu họ cấp quyền. Khi họ cấp quyền, bạn sẽ nhận được một mã nhận dạng người dùng cập nhật để gửi thông báo đẩy đến người dùng đó.
Hiện các khối đề xuất cho lựa chọn sử dụng
Trước khi người dùng có thể nhận thông báo đẩy từ Hành động của bạn, bạn phải cho họ thấy để mời họ chọn nhận thông báo đẩy.
Đoạn mã sau đây gửi cho người dùng một thông báo "Cảnh báo cho tôi về các mẹo mới" đề xuất cùng với câu trả lời bằng văn bản.
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" });
Xin lưu ý rằng JSON bên dưới mô tả phản hồi 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" } ] } } } }
Xin lưu ý rằng JSON bên dưới mô tả phản hồi 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" } ] } } } ] }
Sau khi họ nhấn vào khối, bạn phải yêu cầu quyền UPDATE
.
Mã sau đây hướng dẫn bạn cách thực hiện việc này bằng askForUpdatePermission
hàm của thư viện ứng dụng Node.js.
- Mở nhân viên hỗ trợ trong bảng điều khiển Dialogflow rồi chọn ý định mà bạn đang định cấu hình cho các bản cập nhật.
- Di chuyển xuống phần Phản hồi rồi mở thẻ Trợ lý Google.
- Nhấp vào Thêm nội dung tin nhắn rồi chọn Khối đề xuất.
- Đặt văn bản trong khối thành nội dung có lời mời người dùng chọn sử dụng. Trong Ví dụ về các mẹo trên Actions on Google mà chúng tôi đã đặt khối là Cảnh báo tôi về các mẹo mới.
- Thêm một ý định Dialogflow khác, chẳng hạn như setup_push, và đặt một hành động tương ứng, ví dụ: setup.push. Biểu thức của người dùng về ý định này phải khớp với văn bản của khối chọn tham gia, trong ví dụ của chúng tôi là Cảnh báo cho tôi các mẹo mới.
app.intent('Subscribe to Notifications', (conv) => { conv.ask(new UpdatePermission({ intent: 'Notification', })); });
Bạn nên định cấu hình giải pháp NLU của mình để kích hoạt một hàm yêu cầu nếu biểu thức người dùng khớp với giá trị của thông báo đẩy chọn tham gia. Sau đây là một ví dụ rất cơ bản dựa trên việc so khớp chuỗi:
conv.ask(new UpdatePermission({ intent: 'Notification', }));
- Mở nhân viên hỗ trợ trong bảng điều khiển Dialogflow rồi chọn ý định mà bạn đang định cấu hình cho các bản cập nhật.
- Di chuyển xuống phần Phản hồi rồi mở thẻ Trợ lý Google.
- Nhấp vào Thêm nội dung tin nhắn rồi chọn Khối đề xuất.
- Đặt văn bản trong khối thành nội dung có lời mời người dùng chọn sử dụng. Trong Ví dụ về các mẹo trên Actions on Google mà chúng tôi đã đặt khối là Cảnh báo tôi về các mẹo mới.
- Thêm một ý định Dialogflow khác, chẳng hạn như setup_push, và đặt một hành động tương ứng, ví dụ: setup.push. Biểu thức của người dùng về ý định này phải khớp với văn bản của khối chọn tham gia, trong ví dụ của chúng tôi là Cảnh báo cho tôi các mẹo mới.
@ForIntent("Subscribe to Notifications") public ActionResponse subscribeToNotifications(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build(); }
Bạn nên định cấu hình giải pháp NLU của mình để kích hoạt một hàm yêu cầu nếu biểu thức người dùng khớp với giá trị của thông báo đẩy chọn tham gia. Sau đây là một ví dụ rất cơ bản dựa trên việc so khớp chuỗi:
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build();
Xin lưu ý rằng JSON bên dưới mô tả phản hồi webhook bằng 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" } } } } } }
Xin lưu ý rằng JSON bên dưới mô tả phản hồi webhook bằng SDK Hành động.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.PERMISSION", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", "permissions": [ "UPDATE" ], "updatePermissionValueSpec": { "intent": "tell_latest_tip" } } } ] } ] }
Hoàn tất gói thuê bao
Để hoàn tất gói đăng ký từ webhook Node.js, bạn cần lưu mã thông báo của người dùng và ý định mà họ đã chọn. Cả hai đều được truyền dưới dạng đối số nếu người dùng cấp quyền.
Nếu Hành động của bạn được tạo bằng Dialogflow, bạn cần:
- Thêm một ý định xử lý
actions_intent_PERMISSION
. - Chỉ định tên Hành động của ý định thành tên mà webhook của bạn có thể sử dụng để lọc sau.
Mã sau đây cho biết cách xử lý ý định Dialogflow bằng ý định
có tên là finish_push_setup
cùng với Tên hành động là 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(); }
Xin lưu ý rằng JSON bên dưới mô tả một yêu cầu đối với 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" }
Xin lưu ý rằng JSON bên dưới mô tả một yêu cầu đối với 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" } ] } ] }
Gửi thông báo
Bạn có thể gửi thông báo đẩy cho người dùng bằng Actions API. Để sử dụng API này, bạn cần kích hoạt API trong dự án trên Google Cloud, đồng thời thiết lập và tải một Khoá tài khoản dịch vụ JSON. Xem bước 8 trong hướng dẫn trong mã mẫu tại đây.
Sau đó, bạn có thể dùng thư viện ứng dụng Google OAuth2 để trao đổi khoá tài khoản dịch vụ để có mã truy cập và sử dụng mã này để xác thực yêu cầu của bạn với Actions API.
Lấy khoá tài khoản dịch vụ
- Truy cập URL này, thay thế "example-project-1" ở cuối có mã dự án của bạn trong bảng điều khiển Actions: https://console.developers.google.com/apis/api/actions.googleapis.com/overview?project=example-project-1
- Nếu bạn nhìn thấy nút Enable (Bật), hãy nhấp vào nút đó. Nếu không, hãy chuyển sang bước 3.
- Truy cập URL này, thay thế "example-project-1" ở cuối có mã dự án của bạn trong bảng điều khiển Actions: https://console.developers.google.com/apis/credentials?project=example-project-1
- Nhấp vào Tạo thông tin xác thực > Khoá tài khoản dịch vụ.
- Nhấp vào hộp Chọn trong phần Tài khoản dịch vụ rồi nhấp vào Dịch vụ mới Tài khoản.
- Đặt tên cho tài khoản dịch vụ, chẳng hạn như "thông báo" và Vai trò của Chủ sở hữu dự án.
- Chọn loại khoá JSON rồi nhấp vào Tạo. Khoá tài khoản dịch vụ JSON là được tải xuống máy cục bộ của bạn.
Đổi khoá lấy mã truy cập rồi gửi thông báo
Để gửi thông báo thông qua API Actions, bạn cần phải trao đổi khoá tài khoản dịch vụ cho mã truy cập. Bạn nên dùng ứng dụng Google API thư viện cho việc này. Trong chuỗi đoạn mã tiếp theo, chúng tôi sử dụng Thư viện ứng dụng Node.js cho API của Google.
- Cài đặt thư viện ứng dụng API của Google và yêu cầu:
npm install googleapis request --save
- Hãy dùng mã sau để nhận mã truy cập từ khoá tài khoản dịch vụ rồi gửi một thông báo đẩy:
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); }