Dialogflow এ অন্বেষণ করুন
ডায়ালগফ্লোতে আমাদের বিজ্ঞপ্তির নমুনা আমদানি করতে অবিরত ক্লিক করুন। তারপরে, নমুনা স্থাপন এবং পরীক্ষা করতে নীচের পদক্ষেপগুলি অনুসরণ করুন:
- একটি এজেন্টের নাম লিখুন এবং নমুনার জন্য একটি নতুন ডায়ালগফ্লো এজেন্ট তৈরি করুন৷
- এজেন্ট ইম্পোর্ট করার পরে, এজেন্টে যান ক্লিক করুন।
- প্রধান নেভিগেশন মেনু থেকে, পূরণে যান।
- ইনলাইন এডিটর সক্ষম করুন, তারপর ডিপ্লোয় ক্লিক করুন। সম্পাদক নমুনা কোড রয়েছে.
- প্রধান নেভিগেশন মেনু থেকে, ইন্টিগ্রেশনে যান, তারপর Google সহকারীতে ক্লিক করুন।
- প্রদর্শিত মডেল উইন্ডোতে, অটো-প্রিভিউ পরিবর্তনগুলি সক্ষম করুন এবং অ্যাকশন সিমুলেটর খুলতে পরীক্ষা ক্লিক করুন।
- সিমুলেটরে, নমুনা পরীক্ষা করতে
Talk to my test app
প্রবেশ করুন!
আপনার অ্যাকশন ব্যবহারকারীদের কাছে যখনই প্রাসঙ্গিক হয় বিজ্ঞপ্তি পাঠাতে পারে, যেমন একটি কাজের জন্য নির্ধারিত তারিখ কাছাকাছি হলে একটি অনুস্মারক পাঠানো।
এই নির্দেশিকায়, আমরা আপনার অ্যাকশনের জন্য কীভাবে পুশ বিজ্ঞপ্তি সেট আপ করতে হয় তা দেখানোর জন্য একটি রেফারেন্স হিসাবে অ্যাকশন অন Google টিপস নমুনা ব্যবহার করি। যখন ব্যবহারকারীরা এই অ্যাকশনটি শুরু করেন, তখন তারা তাদের নিজস্ব অ্যাকশন তৈরি করার বিষয়ে একটি টিপ শুনতে চান কিনা তা জিজ্ঞাসা করে। ব্যবহারকারীরা টিপের জন্য একটি নির্দিষ্ট বা এলোমেলোভাবে নির্বাচিত বিভাগ বেছে নিতে পারেন, অথবা তারা সবচেয়ে সাম্প্রতিক টিপ শুনতে বেছে নিতে পারেন।
সমর্থিত পৃষ্ঠতল
পুশ নোটিফিকেশন অ্যান্ড্রয়েড এবং iOS ডিভাইসে পাওয়া যায় (পুশ নোটিফিকেশন পাওয়ার জন্য আইওএস ডিভাইসে অ্যাসিস্ট্যান্ট অ্যাপ ইনস্টল থাকতে হবে)। এগুলি বর্তমানে ভয়েস-অ্যাক্টিভেটেড স্পিকার, স্মার্ট ডিসপ্লে বা অন্যান্য পৃষ্ঠে সমর্থিত নয়।
পূর্বশর্ত
আপনার অ্যাকশন প্রোজেক্টের অন্তত একটি অ্যাকশনকে ট্রিগার করার অভিপ্রায় হিসেবে কনফিগার করতে হবে যা ব্যবহারকারী যখন অ্যাসিস্ট্যান্ট থেকে প্রাপ্ত একটি বিজ্ঞপ্তিতে ট্যাপ করবে তখন তা চালু করা হবে।
আপনার ক্রিয়াগুলি একটি পুশ বিজ্ঞপ্তি থেকে ডিফল্ট স্বাগতম অভিপ্রায় ট্রিগার করার জন্য কনফিগার করা যাবে না৷
কনসোল সেটআপ
আপনার অ্যাকশনে পুশ বিজ্ঞপ্তিগুলির জন্য সমর্থন যোগ করতে:
অ্যাকশন কনসোলে যান এবং বিল্ড > অ্যাকশন -এ নেভিগেট করুন।
অতিরিক্ত ট্রিগারিং অভিপ্রায়ের সাথে মেলে এমন ক্রিয়াটিতে ক্লিক করুন যার জন্য আপনি পুশ বিজ্ঞপ্তিগুলি সক্ষম করতে চান৷
অ্যাকশন অন Google টিপসের নমুনার জন্য, আপনি "tell_latest_tip" নির্বাচন করবেন।
ইউজার এনগেজমেন্ট বিভাগে স্ক্রোল করুন এবং আপনি কি পুশ বিজ্ঞপ্তি পাঠাতে চান ?
একটি বিষয়বস্তুর শিরোনাম লিখুন।
অ্যাকশন অন Google টিপসের নমুনার জন্য, শিরোনাম হতে পারে "নতুন টিপ যোগ করা হয়েছে"।
Save এ ক্লিক করুন।
আমদানি
পরবর্তী বিভাগগুলির উদ্দেশ্যে, আপনার পূর্ণতা কোডে, আপনাকে নিম্নলিখিত আমদানিগুলি ঘোষণা করতে হবে:
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 একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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
অনুমতি চাইতে হবে। নিম্নলিখিত কোড আপনাকে দেখায় কিভাবে Node.js ক্লায়েন্ট লাইব্রেরির askForUpdatePermission
ফাংশন দিয়ে এটি করতে হয়।
- ডায়ালগফ্লো কনসোলে আপনার এজেন্ট খুলুন এবং আপডেটের জন্য আপনি যে অভিপ্রায়টি কনফিগার করছেন সেটি নির্বাচন করুন।
- রেসপন্সে নিচে স্ক্রোল করুন এবং Google Assistant ট্যাব খুলুন।
- বার্তা সামগ্রী যোগ করুন ক্লিক করুন এবং সাজেশন চিপ নির্বাচন করুন।
- চিপ পাঠ্যটিকে এমন কিছুতে সেট করুন যা ব্যবহারকারীকে অপ্ট-ইন করতে আমন্ত্রণ জানায়। অ্যাকশন অন Google টিপসের নমুনায় আমরা নতুন টিপস সম্পর্কে আমাকে সতর্ক করার জন্য চিপ সেট করি।
- আরেকটি ডায়ালগফ্লো অভিপ্রায় যোগ করুন, উদাহরণ হিসেবে বলা হয় setup_push , এবং একটি সংশ্লিষ্ট ক্রিয়া সেট করুন, উদাহরণস্বরূপ setup.push । এই অভিপ্রায়ের ব্যবহারকারীর অভিব্যক্তি অবশ্যই অপ্ট-ইন চিপের পাঠ্যের সাথে মিলবে, আমাদের উদাহরণে আমাকে নতুন টিপস সম্পর্কে সতর্ক করুন ।
app.intent('Subscribe to Notifications', (conv) => { conv.ask(new UpdatePermission({ intent: 'Notification', })); });
ব্যবহারকারীর অভিব্যক্তি পুশ নোটিফিকেশন অপ্ট-ইন প্রম্পটের মানের সাথে মেলে কিনা এমন একটি ফাংশন ট্রিগার করার জন্য আপনাকে আপনার NLU সমাধান কনফিগার করতে হবে। এখানে স্ট্রিং মিলের উপর ভিত্তি করে একটি খুব মৌলিক উদাহরণ:
conv.ask(new UpdatePermission({ intent: 'Notification', }));
- ডায়ালগফ্লো কনসোলে আপনার এজেন্ট খুলুন এবং আপডেটের জন্য আপনি যে অভিপ্রায়টি কনফিগার করছেন সেটি নির্বাচন করুন।
- রেসপন্সে নিচে স্ক্রোল করুন এবং Google Assistant ট্যাব খুলুন।
- বার্তা সামগ্রী যোগ করুন ক্লিক করুন এবং সাজেশন চিপ নির্বাচন করুন।
- চিপ পাঠ্যটিকে এমন কিছুতে সেট করুন যা ব্যবহারকারীকে অপ্ট-ইন করতে আমন্ত্রণ জানায়। অ্যাকশন অন Google টিপসের নমুনায় আমরা নতুন টিপস সম্পর্কে আমাকে সতর্ক করার জন্য চিপ সেট করি।
- আরেকটি ডায়ালগফ্লো অভিপ্রায় যোগ করুন, উদাহরণ হিসেবে বলা হয় 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 সমাধান কনফিগার করতে হবে। এখানে স্ট্রিং মিলের উপর ভিত্তি করে একটি খুব মৌলিক উদাহরণ:
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add(new UpdatePermission().setIntent("Notification")); return responseBuilder.build();
মনে রাখবেন যে নীচের JSON ডায়ালগফ্লো ব্যবহার করে একটি ওয়েবহুকের প্রতিক্রিয়া বর্ণনা করে।
{ "payload": { "google": { "expectUserResponse": true, "systemIntent": { "intent": "actions.intent.PERMISSION", "data": { "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", "permissions": [ "UPDATE" ], "updatePermissionValueSpec": { "intent": "tell_latest_tip" } } } } } }
মনে রাখবেন যে নিচের JSON অ্যাকশন SDK ব্যবহার করে একটি ওয়েবহুক প্রতিক্রিয়া বর্ণনা করে।
{ "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 ওয়েবহুক থেকে সদস্যতা চূড়ান্ত করতে, আপনাকে ব্যবহারকারীর বিজ্ঞপ্তি আইডি এবং তাদের নির্বাচিত অভিপ্রায় সংরক্ষণ করতে হবে। উভয়ই যুক্তি হিসাবে পাস করা হয় যদি ব্যবহারকারী অনুমতি দেয়।
যদি আপনার অ্যাকশন ডায়ালগফ্লো দিয়ে তৈরি করা হয়, তাহলে আপনাকে এটি করতে হবে:
- একটি অভিপ্রায় যোগ করুন যা
actions_intent_PERMISSION
পরিচালনা করে। - আপনার ওয়েবহুক পরে ফিল্টার করতে পারে এমন কিছুতে অভিপ্রায়ের অ্যাকশন নামটি নির্দিষ্ট করুন৷
নিচের কোডটি দেখায় কিভাবে একটি ডায়ালগফ্লো অভিপ্রায় সম্পন্ন করতে হয় 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" } ] } ] }
বিজ্ঞপ্তি পাঠান
আপনি অ্যাকশন API ব্যবহার করে ব্যবহারকারীদের পুশ বিজ্ঞপ্তি পাঠাতে পারেন। এই API ব্যবহার করার জন্য, আপনাকে আপনার Google ক্লাউড প্রকল্পে API সক্রিয় করতে হবে এবং একটি JSON পরিষেবা অ্যাকাউন্ট কী সেটআপ এবং ডাউনলোড করতে হবে। এখানে কোড নমুনার নির্দেশাবলীর ধাপ # 8 দেখুন।
তারপরে আপনি Google OAuth2 ক্লায়েন্ট লাইব্রেরি ব্যবহার করে একটি অ্যাক্সেস টোকেনের জন্য পরিষেবা অ্যাকাউন্ট কী বিনিময় করতে পারেন এবং অ্যাকশন API এ আপনার অনুরোধগুলিকে প্রমাণীকরণ করতে টোকেনটি ব্যবহার করতে পারেন।
একটি পরিষেবা অ্যাকাউন্ট কী পান
- অ্যাকশন কনসোলে আপনার প্রোজেক্ট আইডি দিয়ে শেষে "example-project-1" প্রতিস্থাপন করে এই URL এ যান: https://console.developers.google.com/apis/api/actions.googleapis.com/overview?project = উদাহরণ-প্রকল্প-1
- আপনি যদি একটি সক্ষম বোতাম দেখতে পান তবে এটিতে ক্লিক করুন। অন্যথায়, ধাপ 3 এ এগিয়ে যান।
- অ্যাকশন কনসোলে আপনার প্রোজেক্ট আইডি দিয়ে শেষে "example-project-1" প্রতিস্থাপন করে এই URL-এ যান: https://console.developers.google.com/apis/credentials?project=example-project-1
- শংসাপত্র তৈরি করুন > পরিষেবা অ্যাকাউন্ট কী ক্লিক করুন।
- সার্ভিস অ্যাকাউন্টের অধীনে নির্বাচন বাক্সে ক্লিক করুন এবং নতুন পরিষেবা অ্যাকাউন্টে ক্লিক করুন।
- পরিষেবা অ্যাকাউন্টটিকে "নোটিফিকেশন" এবং প্রকল্পের মালিকের ভূমিকার মতো একটি নাম দিন৷
- JSON কী প্রকার নির্বাচন করুন এবং তৈরি করুন ক্লিক করুন। একটি JSON পরিষেবা অ্যাকাউন্ট কী আপনার স্থানীয় মেশিনে ডাউনলোড করা হয়েছে।
একটি অ্যাক্সেস টোকেনের জন্য কী বিনিময় করুন এবং একটি বিজ্ঞপ্তি পাঠান
অ্যাকশন API এর মাধ্যমে একটি বিজ্ঞপ্তি পাঠাতে, আপনাকে একটি অ্যাক্সেস টোকেনের জন্য পরিষেবা অ্যাকাউন্ট কী বিনিময় করতে হবে। আমরা এটির জন্য একটি Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করার পরামর্শ দিই। অনুসরণ করা কোড স্নিপেটগুলির সিরিজে, আমরা Google API Node.js ক্লায়েন্ট লাইব্রেরি ব্যবহার করছি।
- 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); }