Dialogflow'da keşfet
Dialogflow'da bildirim örneğimizi içe aktarmak için Devam'ı tıklayın. Ardından, adımları uygulayın:
- Bir aracı adı girin ve örnek için yeni bir Dialogflow aracısı oluşturun.
- Temsilcinin içe aktarma işlemini tamamladıktan sonra Temsilciye git'i tıklayın.
- Ana gezinme menüsünden Karşılama'ya gidin.
- Satır içi düzenleyici'yi etkinleştirin ve ardından Dağıt'ı tıklayın. Düzenleyici, örneği içeriyor girin.
- Ana gezinme menüsünden Integrations'a (Entegrasyonlar) gidin, ardından Google Asistan'a dokunun.
- Görünen kalıcı pencerede Otomatik önizleme değişiklikleri'ni etkinleştirin ve Test et'i tıklayın. Eylem simülatörünü açın.
- Simülatörde
Talk to my test app
komutunu girerek örneği test edebilirsiniz.
İşleminiz uygun olduğunda kullanıcılara bildirim gönderebilir. Örneğin, bir görev için son tarih yaklaştığında bir hatırlatıcı.
Bu kılavuzda, Actions on Google ipuçları örneğini kullanıyoruz. işleminize yönelik push bildirimlerini nasıl ayarlayacağınızı gösteren referans olarak kullanabilirsiniz. Kullanıcılar bu işlemi çağırdığında bir ipucu duymak isteyip istemedikleri sorulur . Kullanıcılar şunları yapabilir: ipucu için belirli veya rastgele seçilmiş bir kategori seçebilir veya en son ipucunu dinlemeyi seçin.
Desteklenen yüzeyler
Push bildirimleri Android ve iOS cihazlarda kullanılabilir (iOS cihazlar push bildirimlerini almak için Asistan uygulamasını yüklemeniz gerekir). Bunlar: şu anda sesle etkinleştirilen hoparlörler, akıllı ekranlar veya diğer yüzeylerde desteklenmektedir.
Ön koşullar
Actions projenizdeki Eylemlerden en az biri Kullanıcı, şuradan alınan bir bildirime dokunduğunda çağrılacak olan tetikleme niyeti Asistan.
İşlemleriniz, push bildiriminden Varsayılan Karşılama Niyetini tetikleyecek şekilde yapılandırılamıyor.
Konsol kurulumu
İşleminize push bildirimleri desteği eklemek için:
Actions Console'a gidin ve Oluştur > İşlemler.
Kullanmak istediğiniz ek tetikleme amacıyla eşleşen İşlemi tıklayın push bildirimlerini etkinleştirebilirsiniz.
Actions on Google ipuçları örneği için "tell_En Son_tip" öğesini seçersiniz.
Kullanıcı etkileşimi bölümüne gidin ve etkinleştirin Push bildirimi göndermek ister misiniz?
İçerik başlığı girin.
Actions on Google ipuçları örneği için başlık "Yeni ipucu eklendi" olabilir.
Kaydet'i tıklayın.
İçe aktarılanlar
Sonraki bölümlerde, sipariş karşılama kodunuzda aşağıdaki içe aktarmaları bildirmeniz gerekir:
const { dialogflow, UpdatePermission, Suggestions, } = require('actions-on-google');
const { actionssdk, UpdatePermission, Suggestions, } = require('actions-on-google');
İzin veren kullanıcılar
Kullanıcılara push bildirimleri göndermeden önce bildirimleri etkinleştirmelerini istemeniz gerekir. Bunun için çocuğunuza bir öneri çipi göstererek izin istemesini sağlayabilirsiniz. İzin verdiklerinde, gönderebileceğiniz bir güncelleme kullanıcı kimliği alırsınız. push bildirimi gönderebilirsiniz.
Etkinleştirme için öneri çiplerini göster
Kullanıcıların İşleminizle ilgili push bildirimleri alabilmesi için kullanıcılara öneri çipini kullanarak push bildirimlerini etkinleştirmeye davet edebilirsiniz.
Aşağıdaki kod snippet'i kullanıcıya "Yeni ipuçları konusunda beni uyar" gönderir öneri simgesini tıklayı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" });
Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.
{ "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" } ] } } } }
Aşağıdaki JSON dosyasının bir webhook yanıtını açıkladığını unutmayın.
{ "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" } ] } } } ] }
Kullanıcılar çipe dokunduktan sonra UPDATE
izni istemeniz gerekir.
Aşağıdaki kodda, askForUpdatePermission
ile bunu nasıl yapacağınız gösterilmektedir
işlevinden emin olun.
- Dialogflow konsolunda aracınızı açın ve güncellemeler için yapılandırdığınız amacı seçin.
- Ekranı aşağı kaydırarak Yanıt bölümüne gidin ve Google Asistan sekmesini açın.
- Mesaj içeriği ekle'yi tıklayın ve Öneri çipleri'ni seçin.
- Çip metnini, kullanıcıyı kaydolmaya davet edecek bir şeye ayarlayın. Actions on Google ipuçları örneği için çipi Beni yeni ipuçları konusunda uyar olarak ayarladık.
- setup_push gibi adlı başka bir Dialogflow niyeti ekleyin ve karşılık gelen bir işlem ayarlayın (örneğin, setup.push). Bu amacın kullanıcı ifadesi, etkinleştirme çipinin metniyle eşleşmelidir. Beni yeni ipuçları konusunda uyar.
app.intent('Subscribe to Notifications', (conv) => { conv.ask(new UpdatePermission({ intent: 'Notification', })); });
NLU çözümünüzü, Kullanıcı ifadesi, push bildirimlerinin değeriyle eşleşirse izin etkinleştirme istemi. Dize eşleştirmeye dayalı çok temel bir örneği aşağıda bulabilirsiniz:
conv.ask(new UpdatePermission({ intent: 'Notification', }));
- Dialogflow konsolunda aracınızı açın ve güncellemeler için yapılandırdığınız amacı seçin.
- Ekranı aşağı kaydırarak Yanıt bölümüne gidin ve Google Asistan sekmesini açın.
- Mesaj içeriği ekle'yi tıklayın ve Öneri çipleri'ni seçin.
- Çip metnini, kullanıcıyı kaydolmaya davet edecek bir şeye ayarlayın. Actions on Google ipuçları örneği için çipi Beni yeni ipuçları konusunda uyar olarak ayarladık.
- setup_push gibi adlı başka bir Dialogflow niyeti ekleyin ve karşılık gelen bir işlem ayarlayın (örneğin, setup.push). Bu amacın kullanıcı ifadesi, etkinleştirme çipinin metniyle eşleşmelidir. Beni yeni ipuçları konusunda uyar.
@ForIntent("Subscribe to Notifications") public ActionResponse subscribeToNotifications(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build(); }
NLU çözümünüzü, Kullanıcı ifadesi, push bildirimlerinin değeriyle eşleşirse izin etkinleştirme istemi. Dize eşleştirmeye dayalı çok temel bir örneği aşağıda bulabilirsiniz:
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build();
Aşağıdaki JSON dosyasının Dialogflow kullanarak bir webhook yanıtını açıkladığını unutmayın.
{ "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" } } } } } }
Aşağıdaki JSON dosyasının Actions SDK'sını kullanarak webhook yanıtını açıkladığını unutmayın.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.PERMISSION", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", "permissions": [ "UPDATE" ], "updatePermissionValueSpec": { "intent": "tell_latest_tip" } } } ] } ] }
Aboneliği tamamlama
Aboneliği Node.js webhook'unuzdan tamamlamak için Kullanıcının bildirim kimliği ve seçtiği amaç. Her ikisi de bağımsız değişkenleri de dahil etmelisiniz.
İşleminiz Dialogflow ile derlenmişse şunları yapmanız gerekir:
actions_intent_PERMISSION
işleyen bir intent ekleyin.- Niyetin İşlem adını, webhook'unuzun yapabileceği bir şekilde belirtin filtre uygulayabilirsiniz.
Aşağıdaki kodda, bir intent içeren Dialogflow niyetinin nasıl işleneceği gösterilmektedir
finish_push_setup
adlı, İşlem adı 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(); }
Aşağıdaki JSON dosyasının webhook'a yapılan bir isteği açıkladığını unutmayın.
{ "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" }
Aşağıdaki JSON dosyasının webhook'a yapılan bir isteği açıkladığını unutmayın.
{ "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" } ] } ] }
Bildirim gönder
Actions API'yi kullanarak kullanıcılara push bildirimleri gönderebilirsiniz. Bu API'yi kullanmak için Google Cloud projenizde API'yi etkinleştirmeniz ve uygulamanızı indirip JSON hizmet hesabı anahtarı. Buradaki kod örneğinde bulunan talimatlarda 8. adıma bakın.
Ardından, hizmet hesabı anahtarı değişimi için Google OAuth2 istemci kitaplığını kullanabilirsiniz ve Actions API'ye yönelik isteklerinizin kimliğini doğrulamak için jetonu kullanın.
Hizmet hesabı anahtarı al
- "ornek-proje-1" ifadesini değiştirerek bu URL'ye gidin sonuna proje kimliği ekleyin Actions konsolunda: https://console.developers.google.com/apis/api/actions.googleapis.com/overview?project=example-project-1
- Etkinleştir düğmesini görüyorsanız bu düğmeyi tıklayın. Aksi durumda 3. adıma geçin.
- "ornek-proje-1" ifadesini değiştirerek bu URL'ye gidin sonuna proje kimliği ekleyin Actions konsolunda: https://console.developers.google.com/apis/credentials?project=example-project-1
- Kimlik bilgileri oluştur > Hizmet Hesabı Anahtarı.
- Service Account (Hizmet Hesabı) bölümünde Select (Seç) kutusunu ve New Service'i (Yeni Hizmet) tıklayın. Hesap.
- Hizmet Hesabına "bildirimler" gibi bir ad verin. ve şu görevin Rolü: Proje Sahibi.
- JSON anahtarı türünü seçip Create'i (Oluştur) tıklayın. JSON hizmet hesabı anahtarı yerel makinenize indirin.
Anahtarı bir erişim jetonuyla değiştirin ve bildirim gönderin
Actions API üzerinden bildirim göndermek için erişim jetonu için hizmet hesabı anahtarını kullanın. Google API istemcisi kullanmanızı öneririz kitaplığını oluşturacağım. İzleyen kod snippet'leri dizisinde, Google API Node.js istemci kitaplığı.
- Google API istemci kitaplığını yükleyin ve şunları isteyin:
npm install googleapis request --save
. - Hizmet hesabı anahtarından erişim jetonu almak için aşağıdaki kodu kullanın ve bir push bildirimi gönderin:
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); }