۱. مرور کلی
«اقدامات در گوگل» یک پلتفرم توسعهدهندگان است که به شما امکان میدهد نرمافزاری برای گسترش عملکرد دستیار گوگل ، دستیار شخصی مجازی گوگل، در بیش از ۱ میلیارد دستگاه، از جمله بلندگوهای هوشمند، تلفنها، اتومبیلها، تلویزیونها، هدفونها و موارد دیگر ایجاد کنید. کاربران برای انجام کارهایی مانند خرید مواد غذایی یا رزرو تاکسی، با دستیار در مکالمه تعامل میکنند. (برای مشاهده لیست کاملی از امکانات، به فهرست «اقدامات» مراجعه کنید.) به عنوان یک توسعهدهنده، میتوانید از «اقدامات در گوگل» برای ایجاد و مدیریت آسان تجربیات مکالمهای لذتبخش و مؤثر بین کاربران و سرویس شخص ثالث خود استفاده کنید.
این یک ماژول آزمایشگاه کد پیشرفته است که برای خوانندگانی در نظر گرفته شده است که از قبل تجربه ساخت اکشنها برای دستیار گوگل را دارند. اگر هیچ تجربه توسعه قبلی با اکشنها در گوگل ندارید، اکیداً توصیه میکنیم با دنبال کردن آزمایشگاههای کد مقدماتی ما ( سطح ۱ ، سطح ۲ و سطح ۳ ) با این پلتفرم آشنا شوید. این ماژولهای پیشرفته شما را در مجموعهای از ویژگیها راهنمایی میکنند که میتواند به شما در گسترش عملکرد اکشن و افزایش مخاطبانتان کمک کند.
یکی از راههای مهم برای سنجش موفقیت یک اقدام، میزان مشارکت کاربر یا میزان اثربخشی آن اقدام در بازگرداندن کاربران پس از اولین تعاملشان است. برای آسانتر کردن این امر، میتوانید چندین ویژگی را در اقدام خود پیادهسازی کنید که به کاربران مسیرهایی برای بازگشت به مکالمه شما ارائه میدهد.
این آزمایشگاه کد، ویژگیهای مربوط به تعامل کاربر و بهترین شیوهها برای «اقدامات در گوگل» را پوشش میدهد.


آنچه خواهید ساخت
شما با فعال کردن یک ویژگی که از قبل ساخته شده است، آن را ارتقا خواهید داد:
- برای کاربران بهروزرسانی روزانه ارسال کنید تا بتوانند با کلیک روی آن با بخش اقدام شما صحبت کنند.
- برای کاربران اعلانهای فوری ارسال کنید که به اقدام شما لینک میدهند
- لینکی ایجاد کنید که کاربران را از طریق مرورگر وب موبایل به اکشن شما هدایت کند
آنچه یاد خواهید گرفت
- تعامل کاربر چیست و چرا برای موفقیت یک اقدام مهم است؟
- چگونه یک اکشن را برای افزایش تعامل کاربر تغییر دهیم
- از کدام ویژگیهای تعامل کاربر در انواع مختلف اقدامات استفاده کنیم؟
- نحوه استفاده از Actions API برای ارسال اعلانها از طریق دستیار
آنچه نیاز دارید
شما باید ابزارهای زیر را داشته باشید:
- یک IDE/ویرایشگر متن به دلخواه شما، مانند WebStorm ، Atom یا Sublime
- یک ترمینال برای اجرای دستورات shell با نصب Node.js، npm و git
- یک مرورگر وب، مانند گوگل کروم
- یک محیط توسعه محلی با رابط خط فرمان Firebase
- یک دستگاه تلفن همراه (اندروید یا iOS) با دستیار (شما باید با همان حساب گوگلی که برای ساخت این پروژه استفاده خواهید کرد، وارد دستیار شوید.)
آشنایی با جاوا اسکریپت (ES6) نیز اکیداً توصیه میشود، هرچند الزامی نیست، اما برای درک کد وبهوک ضروری است.
۲. پروژه خود را تنظیم کنید
این بخش به شما نشان میدهد که چگونه ویژگیهای تعامل کاربر را به یک اکشن کامل و از قبل ساخته شده اضافه کنید.
نمونه را درک کنید
نمونهی این آزمایشگاه کد، یک اکشن ساده برای یک باشگاه ورزشی خیالی به نام «اکشن جیم» است. اکشن اطلاعاتی در مورد باشگاه ورزشی ارائه میدهد، از جمله فهرستی از کلاسهایی که هر روز به صورت چرخشی برگزار میشوند. یک اکشن آموزنده مانند این، کاندیدای خوبی برای تمام ویژگیهای تعامل با کاربر است، زیرا فهرست کلاسهای چرخشی هر روز اطلاعات مفید متفاوتی ارائه میدهد.
نمودار زیر جریان مکالمهی نمونهی Action Gym را نشان میدهد:

شما تغییرات جزئی در گفتگو ایجاد خواهید کرد تا با ویژگیهای تعاملی که اضافه میکنید، بهتر مطابقت داشته باشد. با این حال، طراحی کلی مکالمه تغییر زیادی نخواهد کرد.
فایلهای پایه خود را دانلود کنید
دستور زیر را برای کلون کردن مخزن گیتهاب برای codelab اجرا کنید:
git clone https://github.com/actions-on-google/user-engagement-codelab-nodejs
پروژه و نماینده خود را تنظیم کنید
برای تنظیم پروژه Actions و عامل Dialogflow، مراحل زیر را انجام دهید:
- کنسول Actions را باز کنید.
- روی پروژه جدید کلیک کنید.
- نام پروژه را تایپ کنید، مانند
engagement-codelab. - روی ایجاد پروژه کلیک کنید.
- به جای انتخاب یک دسته، به پایین صفحه بروید تا به بخش «گزینههای بیشتر» برسید و روی کارت «مکالمه» کلیک کنید.
- برای گسترش گزینهها، روی «ساخت اقدام» کلیک کنید و «افزودن اقدام(ها)» را انتخاب کنید.
- روی افزودن اولین اقدام خود کلیک کنید.
- در پنجرهی Create Action ، گزینهی Custom Intent را انتخاب کنید و سپس روی Build کلیک کنید تا کنسول Dialogflow اجرا شود.
- در صفحه ایجاد عامل در کنسول Dialogflow، روی Create کلیک کنید.
- کلیک کنید
(آیکون چرخدنده) در نوار ناوبری سمت چپ. - روی «صادرات و واردات» و سپس «بازیابی از فایل زیپ» کلیک کنید.
- فایل
agent.zipرا از دایرکتوری/user-engagement-codelab-nodejs/start/که قبلاً دانلود کردهاید، آپلود کنید. - عبارت
RESTOREرا تایپ کنید و روی Restore کلیک کنید. - روی انجام شد کلیک کنید.
رضایت خود را مستقر کنید
اکنون که پروژه Actions و عامل Dialogflow شما آماده هستند، فایل محلی index.js خود را با استفاده از رابط خط فرمان توابع Firebase مستقر کنید.
از دایرکتوری /user-engagement-codelab-nodejs/start/functions/ مربوط به کلون فایلهای پایه خود، دستورات زیر را اجرا کنید:
firebase use <PROJECT_ID>
npm install
firebase deploy
بعد از چند دقیقه، باید عبارت « Deploy complete! » را ببینید که نشان میدهد وبهوک خود را با موفقیت در فایربیس مستقر کردهاید.
بازیابی آدرس اینترنتی استقرار
شما باید URL را به تابع cloud در Dialogflow ارائه دهید. برای بازیابی این URL، این مراحل را دنبال کنید:
- کنسول فایربیس را باز کنید.
- پروژه اکشنهای خود را از لیست گزینهها انتخاب کنید.
- در نوار ناوبری سمت چپ، به مسیر Develop > Functions بروید. اگر از شما خواسته شد که «تنظیمات اشتراکگذاری دادهها را انتخاب کنید»، میتوانید با کلیک روی «بعداً این کار را انجام دهید» این گزینه را نادیده بگیرید.
- در زیر تب داشبورد ، باید ورودی «تحقق» را با یک URL در زیر Trigger مشاهده کنید. این URL را ذخیره کنید؛ در بخش بعدی باید آن را در Dialogflow کپی کنید.

آدرس وب هوک را در Dialogflow تنظیم کنید
حالا باید عامل Dialogflow خود را بهروزرسانی کنید تا از وبهوک شما برای انجام درخواست استفاده کند. برای انجام این کار، این مراحل را دنبال کنید:
- کنسول Dialogflow را باز کنید (در صورت تمایل میتوانید کنسول Firebase را ببندید).
- روی تکمیل سفارش در منوی سمت چپ کلیک کنید.
- وبهوک را فعال کنید.
- اگر آدرس اینترنتی (URL) که از داشبورد Firebase کپی کردهاید، نمایش داده نمیشود، آن را جایگذاری کنید.
- روی ذخیره کلیک کنید.
تأیید کنید که پروژه شما به درستی تنظیم شده است
کاربران باید بتوانند برای کسب اطلاعات در مورد باشگاه ورزشی اکشن، از جمله یک پاسخ متنی کدگذاری شده با ساعات کاری و یک پاسخ متنی که برنامه کلاسها را برای هر روز هفته فهرست میکند، از اکشن شما استفاده کنند.
برای آزمایش اکشن خود در شبیهساز اکشنها:
- در منوی ناوبری سمت چپ کنسول Dialogflow، روی Integrations > Google Assistant کلیک کنید.
- مطمئن شوید که پیشنمایش خودکار تغییرات فعال است و برای بهروزرسانی پروژه Actions خود، روی Test کلیک کنید.
- شبیهساز اکشنها، پروژه اکشنهای شما را بارگذاری میکند. برای آزمایش اکشن خود، عبارت
Talk to my test appرا در فیلد ورودی تایپ کرده و اینتر را بزنید. - شما باید پاسخی مبنی بر خوشامدگویی به شما برای ورود به Action Gym ببینید. سعی کنید دستورالعملها را دنبال کنید تا مکالمه را ادامه دهید و در عین حال مطمئن شوید که بخش تکمیل پیام شما برای هر ورودی پاسخی دارد.

۳. اشتراکهای بهروزرسانی روزانه را اضافه کنید
یک روش رایج برای جذب کاربران، ارائه اطلاعات به آنها در مواقعی است که بیشترین کاربرد را دارند. این کار با ارائه گزینه اشتراک در بهروزرسانیهای روزانه برای یک هدف به کاربران انجام میشود که یک اعلان دستیار برای آنها ارسال میکند که مستقیماً به تحقق آن هدف مرتبط است.
در این مرحله، درباره اشتراکهای بهروزرسانی روزانه یاد خواهید گرفت و آنها را به لیست کلاسهای اکشن خود اضافه خواهید کرد. پس از دنبال کردن این دستورالعملها، مکالمه اکشن شما مانند نمودار زیر خواهد بود:

این چگونه کاربران را جذب خواهد کرد؟
کاربران گوشیهای هوشمند احتمالاً با اعلانهای فوری (push notifications) که اطلاعات و بهروزرسانیهای مخصوص برنامه را ارائه میدهند، آشنا هستند. اشتراکهای بهروزرسانی روزانه، راهی ساده برای دسترسی به کاربران در دستگاههای تلفن همراه خارج از دستیار گوگل هستند، مشروط بر اینکه هدفی که برای آن بهروزرسانی ارسال میکنید، همچنان به صورت روزانه برای کاربر ارزشآفرینی کند.
بهروزرسانیهای روزانه میتوانند ابزار مفیدی برای تعامل باشند، اما لزوماً نباید در هر اقدامی گنجانده شوند. هنگام تصمیمگیری در مورد اضافه کردن اشتراک بهروزرسانی روزانه به یک اقدام، این نکات را در نظر بگیرید:
- مطمئن شوید که بهروزرسانیهای روزانه باعث میشوند کاربر هر روز اطلاعات مفید و متفاوتی را مشاهده کند. اگر کلیک روی بهروزرسانی روزانه هر بار منجر به نمایش پیام مشابهی شود، احتمالاً کاربر پس از چند روز اشتراک خود را لغو خواهد کرد.
- مطمئن شوید که اگر کاربر مستقیماً به سراغ هدف بهروزرسانی روزانه شما میرود، دیالوگ شما برایش معنادار باشد. کاربر شما لزوماً از ابتدای مکالمه شروع نمیکند، بنابراین نباید انتظار داشت که اطلاعات زیادی در مورد موضوع داشته باشد.
- قبل از اینکه از کاربر بخواهید در بهروزرسانیهای روزانه مشترک شود، مزایای اقدام خود را به او نشان دهید. وقتی به کاربر گزینه اشتراک داده میشود، باید با خود فکر کند که "من هر روز این محتوا را میخواهم".
- کاربر را با پیشنهادهای مکرر برای عضویت سردرگم نکنید. بلافاصله پس از نشان دادن مطالبی که کاربر مایل به عضویت در آنهاست، به او اشتراک روزانه پیشنهاد دهید و از ایجاد مزاحمت برای او در مورد این موضوع در جاهای دیگر خودداری کنید.
- مکالمه را پس از شروع بهروزرسانی کوتاه نگه دارید. اکثر بهروزرسانیهای روزانه باید فقط شامل یک پاسخ باشند و سپس بدون نیاز به ورود کاربر بسته شوند.
فعال کردن بهروزرسانیهای روزانه
اشتراکهای بهروزرسانی روزانه را میتوان به هدف خوشامدگویی اضافه کرد که کاربر را در ابتدای مکالمه شما قرار میدهد، یا یک هدف خاصتر برای پیوند عمیق آنها به جایی در مکالمه. برای این آزمایشگاه کد، هدف فهرست کلاس منطقیترین گزینه است زیرا گفتگو هر روز تغییر میکند و کاربران ممکن است یادآوری اینکه چه کلاسهایی در دسترس هستند را مفید بدانند.
برای فعال کردن بهروزرسانیهای روزانه برای intent لیست کلاس ، این مراحل را دنبال کنید:
- در کنسول Actions، روی تب Develop کلیک کنید و در نوار ناوبری سمت چپ، Actions را انتخاب کنید.
- در زیر فهرست اقدامات ، روی فهرست کلاسها کلیک کنید.
- در بخش تعامل کاربر ، گزینه « آیا میخواهید بهروزرسانیهای روزانه را به کاربران ارائه دهید؟» را فعال یا غیرفعال کنید.
- یک عنوان توصیفی برای محتوا تنظیم کنید که بهروزرسانی روزانه را توصیف کند. متن به صورت «چه زمانی میخواهید <عنوان محتوای> روزانه شما را ارسال کنم» خواهد بود، بنابراین مطمئن شوید که عنوان شما هم توصیفی باشد و هم هنگام خواندن صحیح به نظر برسد. برای این مثال، عنوان محتوا را روی
list of upcoming Action Gym classesتنظیم کنید. - روی ذخیره در بالای صفحه کلیک کنید.

تنظیم جریان گفتگو
برای ایجاد اهداف (Intents) برای جریان اشتراک بهروزرسانی روزانه، این مراحل را در کنسول Dialogflow دنبال کنید:
کاربر را به عضویت تشویق کنید
- یک intent جدید برای مدیریت درخواست کاربر برای اشتراک در بهروزرسانیهای روزانه تنظیم کنید. در کنسول Dialogflow، روی دکمه + کنار Intents در نوار ناوبری سمت چپ کلیک کنید تا یک intent جدید ایجاد شود.
- نام این intent جدید را
Setup Updates. - در بخش عبارات آموزشی ، عبارات کاربری زیر را اضافه کنید:
-
Send daily reminders -
Reminder -
Remind me -
Updates -
Upcoming classes
- در بخش Fulfillment ، گزینه Enable webhook call for this intent را فعال کنید.
- روی ذخیره در بالای صفحه کلیک کنید.

رسیدگی به تصمیم کاربر
- یک intent جدید برای مدیریت پاسخ کاربر به درخواست اشتراک بهروزرسانیهای روزانه تنظیم کنید. برای ایجاد یک intent جدید، روی دکمه + کنار Intents در منوی ناوبری سمت چپ کلیک کنید.
- نام این هدف جدید را
Confirm Updates. - در بخش رویدادها ،
actions_intent_REGISTER_UPDATEرا اضافه کنید. این رویداد Dialogflow با اتمام جریان اشتراک بهروزرسانی روزانه توسط کاربر، چه در نهایت مشترک شده باشد و چه نشده باشد، فعال میشود. - در بخش Fulfillment ، گزینه Enable webhook call for this intent را فعال کنید.
- روی ذخیره در بالای صفحه کلیک کنید.

اجرای تحقق
برای پیادهسازی تکمیل سفارش در وبهوک خود، مراحل زیر را انجام دهید:
وابستگیها را بارگذاری کنید
در فایل index.js ، تابع require() را بهروزرسانی کنید تا پکیج RegisterUpdate را از پکیج actions-on-google اضافه کند، بنابراین importهای شما به این شکل خواهند بود:
ایندکس.js
const {
dialogflow,
Suggestions,
RegisterUpdate,
} = require('actions-on-google');
تراشههای پیشنهادی را بهروزرسانی کنید
در فایل index.js ، یک ورودی DAILY به لیست عناوین چیپهای پیشنهادی اضافه کنید، بنابراین تعریف Suggestion شما به این شکل خواهد بود:
ایندکس.js
// Suggestion chip titles
const Suggestion = {
HOURS: 'Ask about hours',
CLASSES: 'Learn about classes',
DAILY: 'Send daily reminders',
};
برای اهداف جدید، تحقق اهداف را اضافه کنید
وقتی کاربر میگوید که میخواهد مشترک شود، جریان اشتراک بهروزرسانیهای روزانه را با فراخوانی تابع کمکی RegisterUpdate با هدف بهروزرسانی ( Class List ) و تایپ ( DAILY ) آغاز کنید. پس از اتمام جریان اشتراک، Assistant رویداد actions_intent_REGISTER_UPDATE را با یک آرگومان status که نشان میدهد آیا اشتراک موفقیتآمیز بوده است یا خیر، فعال میکند. پیامهای پیگیری را به کاربر ارائه دهید که بسته به وضعیت اشتراک تغییر میکنند.
در فایل index.js ، کد زیر را اضافه کنید:
ایندکس.js
// Start opt-in flow for daily updates
app.intent('Setup Updates', (conv) => {
conv.ask(new RegisterUpdate({
intent: 'Class List',
frequency: 'DAILY',
}));
});
// Confirm outcome of opt-in for daily updates
app.intent('Confirm Updates', (conv, params, registered) => {
if (registered && registered.status === 'OK') {
conv.ask(`Gotcha, I'll send you an update everyday with the ` +
'list of classes. Can I help you with anything else?');
} else {
conv.ask(` I won't send you daily reminders. Can I help you with anything else?`);
}
if (conv.screen) {
conv.ask(new Suggestions([Suggestion.HOURS, Suggestion.CLASSES]));
}
});
پیشنهادهای جایگزین برای کاربر
پاسخ لیست کلاس شما در انتها اشتراک بهروزرسانی روزانه را ارائه میدهد، اما این یک مشکل ایجاد میکند. از آنجایی که همین پاسخ زمانی که کاربر روی اعلان بهروزرسانی روزانه ضربه میزند، فعال میشود، همچنان از او خواسته میشود که در بهروزرسانیهای روزانه مشترک شود، حتی اگر این بهروزرسانیها تازه از یکی آمده باشند. چگونه میتوانید کاری کنید که کاربر فکر نکند باید دوباره مشترک شود؟
خوشبختانه، آرگومانهای شیء conv شما شامل اطلاعاتی در مورد محل شروع مکالمه توسط کاربر است. میتوانید آرگومانهای conv را بررسی کنید تا ببینید آیا حاوی بخش UPDATES هستند یا خیر، که نشان میدهد کاربر مکالمه را از یک اعلان بهروزرسانی روزانه شروع کرده است، و پاسخ را بر این اساس تغییر دهید. همچنین میتوانید از این شاخه مکالمه برای بستن کادر محاورهای بلافاصله پس از ارائه لیست کلاسها استفاده کنید، که از بهترین رویه ما در کوتاه نگه داشتن بهروزرسانی روزانه پیروی میکند.
در فایل index.js ، کد زیر را جایگزین کنید:
ایندکس.js
// Class list intent handler
app.intent('Class List', (conv, {day}) => {
if (!day) {
day = DAYS[new Date().getDay()];
}
const classes =
[...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
.join(', ');
const classesMessage =
`On ${day} we offer the following classes: ${classes}. ` +
`Can I help you with anything else?`;
conv.ask(classesMessage);
if (conv.screen) {
conv.ask(new Suggestions([Suggestion.HOURS]));
}
});
با این:
ایندکس.js
// Class list intent handler
app.intent('Class List', (conv, {day}) => {
if (!day) {
day = DAYS[new Date().getDay()];
}
const classes =
[...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
.join(', ');
let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
// If the user started the conversation from the context of a daily update,
// the conv's arguments will contain an 'UPDATES' section.
let engagement = conv.arguments.get('UPDATES');
// Check the conv arguments to tailor the conversation based on the context.
if (engagement) {
classesMessage += `Hope to see you soon at Action Gym!`;
conv.close(classesMessage);
} else {
classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
conv.ask(classesMessage);
if (conv.screen) {
conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
};
};
});
بهروزرسانیهای روزانه خود را آزمایش کنید
در ترمینال، دستور زیر را اجرا کنید تا کد وبهوک بهروزرسانیشدهتان را در فایربیس مستقر کنید:
firebase deploy
برای آزمایش دستور reprompt سفارشی خود در شبیهساز Actions، این مراحل را دنبال کنید:
- در کنسول Actions، به Test بروید.
- عبارت
Talk to my test appدر فیلد ورودی تایپ کنید و اینتر را بزنید. - عبارت «
Learn about classesرا تایپ کنید و اینتر را بزنید. اکنون پاسخ «اقدام» شما باید ارسال یادآوریهای روزانه را پیشنهاد دهد. - عبارت
Send daily remindersرا تایپ کنید و اینتر را بزنید. - زمانی را که میخواهید بهروزرسانی را ببینید تایپ کنید و اینتر را بزنید. برای آزمایش، سعی کنید ۳ تا ۵ دقیقه دیرتر از زمان فعلی پاسخ دهید.

در دستگاه تلفن همراه خود، باید در حدود زمانی که برای بهروزرسانیها مشخص کردهاید، اعلانی از دستیار دریافت کنید. توجه داشته باشید که نمایش این اعلان ممکن است چند دقیقه طول بکشد. روی اعلان ضربه بزنید تا مستقیماً به لیست کلاسها در دستیار متصل شود و لیستی از کلاسهای آینده را به شما نشان دهد:

۴. اعلانهای فوری اضافه کنید
به عنوان گزینه دیگری برای تعامل با کاربران خارج از Action خود، میتوانید Actions API را برای ارسال اعلانهای فوری به کاربران فراخوانی کنید. برخلاف بهروزرسانیهای روزانه، این اعلانها به طور خودکار توسط Assistant زمانبندی نمیشوند، بنابراین میتوانید آنها را به دلخواه ارسال کنید.
در این مرحله، یاد خواهید گرفت که چگونه با اضافه کردن یک Class Canceled intent جدید و ارسال اعلانها به کاربرانی که آنها را از لغو کلاس مطلع میکنند، اعلانهای فشاری را در Action خود پیادهسازی کنید. همچنین سه مؤلفه مورد نیاز برای ارسال اعلانها را تنظیم خواهید کرد:
- حساب کاربری Actions API - شما با ارسال یک درخواست
POSTبه یک API، اعلانها را برای کاربر ارسال میکنید، بنابراین برای ارتباط با این API باید یک حساب کاربری سرویس و اعتبارنامه تنظیم کنید. - تابع کمکی Permission - برای دسترسی به شناسه کاربری مورد نیاز جهت ارسال اعلانهای فوری به کاربر، به مجوز کاربر نیاز دارید. در این مثال، از یک تابع کتابخانه کلاینت برای فراخوانی تابع کمکی permission و درخواست این شناسه استفاده خواهید کرد.
- ذخیرهسازی - برای ارسال اعلانهای فوری به یک کاربر خارج از مکالمه، باید شناسههای کاربر را در جایی ذخیره کنید که در صورت نیاز قابل بازیابی باشد. در این مثال، یک پایگاه داده Firestore برای ذخیره اطلاعات هر کاربر راهاندازی خواهید کرد.
پس از دنبال کردن این دستورالعملها، کادر محاورهای زیر به گفتگوی مربوط به اکشن شما اضافه خواهد شد:

این چگونه کاربران را جذب خواهد کرد؟
کاربران گوشیهای هوشمند احتمالاً با اعلانهای فوری (push notifications) که اطلاعات و بهروزرسانیهای مخصوص برنامه را ارائه میدهند، آشنا هستند. اعلانهای فوری روشی انعطافپذیر برای دسترسی به کاربران در دستگاههای تلفن همراه خارج از دستیار گوگل هستند، مشروط بر اینکه دلیل خوبی برای فعال کردن آنها به کاربران داده شود. با بهروزرسانیهای روزانه، کاربران از قبل میدانند که روزانه به آنها اطلاع داده خواهد شد. با این حال، با اعلانهای فوری، کاربران نمیدانند که آیا تصمیم گرفتهاند اعلانهای نادر دریافت کنند یا با اعلانهای متعدد در روز مواجه خواهند شد.
اعلانهای فشاری میتوانند ابزار تعاملی مفیدی باشند، اما لزوماً نباید در هر عملی گنجانده شوند. هنگام تصمیمگیری در مورد افزودن اعلانهای فشاری به یک عمل، این نکات را در نظر بگیرید:
- چند برنامه زمانی نمونه برای اعلانهای فوری خود برنامهریزی کنید. اگر قصد دارید فقط یک اعلان فوری در روز ارسال کنید، به جای آن از بهروزرسانیهای روزانه استفاده کنید.
- مطمئن شوید که اعلانهای شما هر بار که دریافت میشوند، اطلاعات مفیدی ارائه میدهند. اعلانهای شما همچنین میتوانند به یکی از اهداف اقدام شما پیوند عمیق داشته باشند، بنابراین مطمئن شوید که هدف مفید و مرتبط است.
- هنگام درخواست از کاربر برای عضویت در اعلانهای فوری، صریح باشید. آنها باید بدانند که با هر اعلان فوری چه انتظاری باید داشته باشند و بدانند که اعلانها چند وقت یکبار ارسال میشوند.
فعال کردن API اکشنها
- کنسول گوگل کلود را باز کنید و نام پروژه اکشنهای خود را از منوی کشویی انتخاب کنید.

- در منوی پیمایش ( ☰ ) ، به APIها و خدمات > کتابخانه بروید.
- API مربوط به Actions را جستجو کنید و روی Enable کلیک کنید.

ایجاد حساب کاربری سرویس
API مربوط به Actions نیاز به احراز هویت دارد، بنابراین برای ارسال درخواستها باید یک حساب کاربری ایجاد کنید. برای ایجاد و نصب کلید حساب کاربری برای Actions API، این مراحل را دنبال کنید:
- در منوی ناوبری کنسول ابری گوگل (☰) ، به APIها و خدمات > اعتبارنامهها بروید.
- روی ایجاد اعتبارنامهها > کلید حساب سرویس کلیک کنید.
- در منوی کشویی حساب سرویس ، حساب سرویس جدید را انتخاب کنید.
- اطلاعات زیر را پر کنید:
- نام حساب سرویس :
service-account - نقش : پروژه > مالک
- شناسه حساب سرویس:
service-account(همیشه بعد از @<project_id>.iam.gserviceaccount.com قرار میگیرد) - نوع کلید : JSON
- روی ایجاد کلیک کنید.
- فایل JSON دانلود شده را به دایرکتوری /user-engagement-codelab/start/functions/ پروژه خود منتقل کنید.
- فایل JSON را به
service-account.jsonتغییر نام دهید.

فعال کردن فایراستور
برای ارسال اعلانها به خارج از مکالمه، به روشی برای ذخیره شناسههای کاربری نیاز دارید که بتوان از کد اعلان شما به آنها ارجاع داد. برای این مثال، ما از یک پایگاه داده Firestore برای ذخیره شناسههای کاربری کاربران مشترک استفاده میکنیم.
برای ایجاد یک پایگاه داده Firestore برای اکشن خود، این مراحل را دنبال کنید:
- در کنسول Firebase ، نام پروژه Actions خود را انتخاب کنید.
- در منوی سمت چپ، به مسیر Develop > Database بروید و روی Create database کلیک کنید.
- شروع در حالت آزمایشی را انتخاب کنید.
- روی فعال کردن کلیک کنید.

تنظیم جریان گفتگو
برای ایجاد جریان انتخاب اعلانهای پوش نوتیفیکیشن، این مراحل را در کنسول Dialogflow دنبال کنید:
کاربر را به عضویت تشویق کنید
- یک intent جدید برای مدیریت درخواست کاربر برای عضویت در push notifications برای کلاسهای لغو شده تنظیم کنید. در کنسول Dialogflow، روی دکمه + کنار Intents در نوار ناوبری سمت چپ کلیک کنید تا یک intent جدید ایجاد شود.
- نام این intent جدید
Setup Push Notifications. - در بخش عبارات آموزشی ، عبارات کاربری زیر را اضافه کنید:
-
Subscribe to notifications -
Send notification -
Notify me -
Send class notifications -
Cancelled notifications
- در بخش Fulfillment ، گزینه Enable webhook call for this intent را فعال کنید.
- روی ذخیره در بالای صفحه کلیک کنید.

رسیدگی به تصمیم کاربر
- یک intent جدید برای مدیریت پاسخ کاربر به درخواست اشتراک پوش نوتیفیکیشن تنظیم کنید. برای ایجاد یک intent جدید، روی دکمه + کنار Intents در منوی سمت چپ کلیک کنید.
- نام این هدف جدید
Confirm Push Notifications. - در بخش رویدادها ،
actions_intent_PERMISSIONرا اضافه کنید. این رویداد Dialogflow با اتمام جریان اشتراک اعلانهای فوری توسط کاربر، چه در نهایت مشترک شده باشد و چه نشده باشد، فعال میشود. - در بخش Fulfillment ، گزینه Enable webhook call for this intent را فعال کنید.
- روی ذخیره در بالای صفحه کلیک کنید.

مدیریت اعلانهای فوری
شما میتوانید اعلانهای فوری خود را به یک هدف خاص پیوند دهید، بنابراین کاربرانی که روی اعلان فوری ضربه میزنند، مستقیماً به آن هدف در اکشن شما پیوند عمیق مییابند. در این مثال، یک هدف جدید برای اعلانهای فوری اضافه کنید که جزئیاتی در مورد کلاسهای لغو شده ارائه میدهد.
برای افزودن یک اینتنت که با ضربه زدن کاربر روی یک اعلان فشاری فعال شود، این مراحل را دنبال کنید:
- در کنسول Dialogflow، روی دکمه + کنار Intents در نوار ناوبری سمت چپ کلیک کنید تا یک intent جدید ایجاد شود.
- نام این intent جدید
Class Canceled. - در بخش عبارات آموزشی ،
Cancelationsبه عنوان یک عبارت کاربری اضافه کنید. - در بخش Fulfillment ، گزینه Enable webhook call for this intent را فعال کنید.
- روی ذخیره در بالای صفحه کلیک کنید.

ارسال اعلانهای آزمایشی در اواسط مکالمه
در محیط عملیاتی، شما باید اسکریپتی جدا از کد تکمیل عملیات خود داشته باشید که اعلانهای فوری ارسال کند. برای این مثال، یک intent ایجاد کنید که بتوانید هنگام صحبت با Action خود، آن را برای ارسال اعلان فوری فراخوانی کنید. این intent فقط برای اهداف اشکالزدایی است؛ در عمل، اعلانهای فوری نباید توسط تکمیل عملیات شما مدیریت شوند یا به عنوان بخشی از مکالمه Action شما فعال شوند.
برای ایجاد یک intent جهت آزمایش اعلانهای پوش نوتیفیکیشن، این مراحل را دنبال کنید:
- برای آزمایش و اشکالزدایی، یک intent جدید تنظیم کنید که به شما امکان ارسال اعلانهای فوری به کاربران مشترک را میدهد. در کنسول Dialogflow، روی دکمه + کنار Intents در نوار ناوبری سمت چپ کلیک کنید تا یک intent جدید ایجاد کنید.
- نام این intent جدید
Test Notification. - در بخش عبارات آموزشی ،
Test notificationبه عنوان یک عبارت کاربری اضافه کنید. - در بخش Fulfillment ، گزینه Enable webhook call for this intent را فعال کنید.
- روی ذخیره در بالای صفحه کلیک کنید.

اعلانهای فشاری را روشن کنید
برای فعال کردن اعلانهای فوری برای intent مربوط به Class Canceled، این مراحل را دنبال کنید:
- در کنسول Dialogflow، در نوار ناوبری به Integrations بروید.
- در کارت دستیار گوگل ، روی «تنظیمات ادغام» کلیک کنید.
- افزودن Class Canceled به عنوان یک Intent فراخوانی ضمنی . این مرحله برای Dialogflow ضروری است تا تشخیص دهد که کاربران میتوانند مکالمه شما را با Intent مربوط به Class Canceled (با ضربه زدن روی یک اعلان فوری) شروع کنند.
- روی بستن کلیک کنید.

- در کنسول Actions، روی تب Develop کلیک کنید و در نوار ناوبری سمت چپ، Actions را انتخاب کنید.
- در فهرست اقدامات ، روی «کلاس لغو شد» کلیک کنید.
- در بخش تعامل کاربر ، گزینه « آیا میخواهید اعلانهای فوری ارسال کنید؟» را فعال یا غیرفعال کنید.
- یک عنوان توصیفی برای محتوا تنظیم کنید که اعلان فوری را توصیف کند. متن به صورت «آیا اشکالی ندارد که برای <content title> اعلان فوری ارسال کنم؟» خواهد بود، بنابراین مطمئن شوید که عنوان شما هم توصیفی باشد و هم هنگام خواندن صحیح به نظر برسد. برای این مثال، عنوان محتوا را روی
class cancelationsتنظیم کنید. - روی ذخیره در بالای صفحه کلیک کنید.

اجرای تحقق
برای پیادهسازی تکمیل سفارش در وبهوک خود، مراحل زیر را انجام دهید:
وابستگیها را بارگذاری کنید
در فایل index.js ، تابع require() را بهروزرسانی کنید تا پکیج UpdatePermission را از پکیج actions-on-google اضافه کند، بنابراین importهای شما به این شکل خواهند بود:
ایندکس.js
const {
dialogflow,
Suggestions,
RegisterUpdate,
UpdatePermission,
} = require('actions-on-google');
تراشههای پیشنهادی را بهروزرسانی کنید
در فایل index.js ، یک ورودی NOTIFICATIONS به لیست عناوین چیپهای پیشنهادی اضافه کنید، بنابراین تعریف Suggestion شما به این شکل خواهد بود:
ایندکس.js
// Suggestion chip titles
const Suggestion = {
HOURS: 'Ask about hours',
CLASSES: 'Learn about classes',
DAILY: 'Send daily reminders',
NOTIFICATIONS: 'Get notifications',
};
تنظیم واردات جدید
برای اتصال به پایگاه داده Firestore خود، بسته firebase-admin را اضافه کنید و ثابتهایی را برای فیلدهای ذخیره شده در پایگاه داده اضافه کنید. همچنین، بستههای google-auth-library و request را برای مدیریت احراز هویت و درخواستها به Actions API وارد کنید.
در فایل index.js ، کد زیر را به فایلهای import خود اضافه کنید:
ایندکس.js
// Firebase admin import
const admin = require('firebase-admin');
// Initialize Firestore
admin.initializeApp();
const db = admin.firestore();
// Firestore constants
const FirestoreNames = {
INTENT: 'intent',
USER_ID: 'userId',
USERS: 'users',
};
// Actions API authentication imports
const {auth} = require('google-auth-library');
const request = require('request');
پیشنهاد تنظیم اعلانهای لغو کلاس
در فایل index.js ، کد زیر را جایگزین کنید:
ایندکس.js
// Class list intent handler
app.intent('Class List', (conv, {day}) => {
if (!day) {
day = DAYS[new Date().getDay()];
}
const classes =
[...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
.join(', ');
let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
// If the user started the conversation from the context of a daily update,
// the conv's arguments will contain an 'UPDATES' section.
let engagement = conv.arguments.get('UPDATES');
// Check the conv arguments to tailor the conversation based on the context.
if (engagement) {
classesMessage += `Hope to see you soon at Action Gym!`;
conv.close(classesMessage);
} else {
classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
conv.ask(classesMessage);
if (conv.screen) {
conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
};
};
});
با این:
ایندکس.js
// Class list intent handler
app.intent('Class List', (conv, {day}) => {
if (!day) {
day = DAYS[new Date().getDay()];
}
const classes =
[...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
.join(', ');
let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
// If the user started the conversation from the context of a daily update,
// the conv's arguments will contain an 'UPDATES' section.
let engagement = conv.arguments.get('UPDATES');
// Check the conv arguments to tailor the conversation based on the context.
if (engagement) {
classesMessage += `Hope to see you soon at Action Gym!`;
conv.close(classesMessage);
} else {
classesMessage += `Would you like to receive daily reminders of upcoming classes, subscribe to notifications about cancelations, or can I help you with anything else?`;
conv.ask(classesMessage);
if (conv.screen) {
conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.NOTIFICATIONS,
Suggestion.HOURS]));
};
};
});
برای اهداف جدید، تحقق اهداف را اضافه کنید
وقتی کاربر میگوید که میخواهد در دریافت اعلانهای فوری مشترک شود، تابع کمکی UpdatePermission را فراخوانی کنید تا از کاربر اجازه دریافت آن را درخواست کنید. اگر این کار موفقیتآمیز باشد، آرگومان PERMISSION به آرگومانهای شیء conv اضافه میشود که میتوانید برای تغییر جهت مکالمه آن را بررسی کنید.
پس از دریافت مجوز کاربر، شناسه کاربر را از آرگومانهای شیء conv دریافت کرده و آن را در پایگاه داده خود ذخیره کنید. بعداً این شناسه کاربر را به Actions API ارسال خواهید کرد، و به این ترتیب Assistant تعیین میکند چه کسی اعلان را دریافت کند.
در آخر، برای هدف Class Canceled intent) که با ضربه زدن روی اعلان فعال میشود، تکمیل (compliance) را اضافه کنید. در این مثال، پاسخ شما یک رشتهی نگهدارنده (placeholder string) است، اگرچه در نسخهی آمادهی تولید این اکشن (Action) اسکریپت اعلان شما اطلاعات پویاتری در مورد اینکه کدام کلاس لغو شده است، ارائه میدهد.
در فایل index.js ، کد زیر را اضافه کنید:
ایندکس.js
// Call the User Information helper for permission to send push notifications
app.intent('Setup Push Notifications', (conv) => {
conv.ask('Update permission for setting up push notifications');
conv.ask(new UpdatePermission({intent: 'Class Canceled'}));
});
// Handle opt-in or rejection of push notifications
app.intent('Confirm Push Notifications', (conv) => {
if (conv.arguments.get('PERMISSION')) {
let userId = conv.arguments.get('UPDATES_USER_ID');
if (!userId) {
userId = conv.request.conversation.conversationId;
}
// Add the current conversation ID and the notification's
// target intent to the Firestore database.
return db.collection(FirestoreNames.USERS)
.add({
[FirestoreNames.INTENT]: 'Class Canceled',
[FirestoreNames.USER_ID]: userId,
})
.then(() => {
conv.ask(`Great, I'll notify you whenever there's a class cancelation. ` +
'Can I help you with anything else?');
});
} else {
conv.ask(`Okay, I won't send you notifications about class cancelations. ` +
'Can I help you with anything else?');
}
if (conv.screen) {
conv.ask(new Suggestions([Suggestion.CLASSES, Suggestion.HOURS]));
}
});
// Intent triggered by tapping the push notification
app.intent('Class Canceled', (conv) => {
conv.ask('Classname at classtime has been canceled.');
});
اضافه کردن اعلانهای آزمایشی
برای ارسال اعلان فشار به یک کاربر، یک درخواست POST به API Actions با شناسه کاربر، عنوان اعلان و هدف هدف ارسال کنید. در این مثال، فعال کردن هدف اعلان آزمایشی، از طریق پایگاه داده Firestore شما تکرار میشود و اعلانهای فشار را به هر کاربری که در اعلانها مشترک شده است، ارسال میکند.
به یاد داشته باشید که در این مثال، شما کدی را که اعلان فشار را ارسال میکند در تکمیل وبهوک خود قرار میدهید و آن کد را با فراخوانی یک قصد آزمایشی در مکالمه خود فعال میکنید. در اقداماتی که قصد انتشار آنها را دارید، کد اعلان فشار شما باید در اسکریپتی جدا از تکمیل شما وجود داشته باشد.
در فایل index.js ، کد زیر را اضافه کنید:
ایندکس.js
// Debug intent to trigger a test push notification
app.intent('Test Notification', (conv) => {
// Use the Actions API to send a Google Assistant push notification.
let client = auth.fromJSON(require('./service-account.json'));
client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'];
let notification = {
userNotification: {
title: 'Test Notification from Action Gym',
},
target: {},
};
client.authorize((err, tokens) => {
if (err) {
throw new Error(`Auth error: ${err}`);
}
// Iterate through Firestore and send push notifications to every user
// who's currently opted in to canceled class notifications.
db.collection(FirestoreNames.USERS)
.where(FirestoreNames.INTENT, '==', 'Class Canceled')
.get()
.then((querySnapshot) => {
querySnapshot.forEach((user) => {
notification.target = {
userId: user.get(FirestoreNames.USER_ID),
intent: user.get(FirestoreNames.INTENT),
};
request.post('https://actions.googleapis.com/v2/conversations:send', {
'auth': {
'bearer': tokens.access_token,
},
'json': true,
'body': {'customPushMessage': notification, 'isInSandbox': true},
}, (err, httpResponse, body) => {
if (err) {
throw new Error(`API request error: ${err}`);
}
console.log(`${httpResponse.statusCode}: ` +
`${httpResponse.statusMessage}`);
console.log(JSON.stringify(body));
});
});
})
.catch((error) => {
throw new Error(`Firestore query error: ${error}`);
});
});
conv.ask('A notification has been sent to all subscribed users.');
});
اعلانهای فوری خود را آزمایش کنید
در ترمینال، دستور زیر را اجرا کنید تا کد وبهوک بهروزرسانیشدهتان را در فایربیس مستقر کنید:
firebase deploy
برای آزمایش اعلانها در شبیهساز Actions، این مراحل را دنبال کنید:
- در کنسول Actions، به تب Test بروید.
- عبارت
Talk to my test appدر فیلد ورودی تایپ کنید و اینتر را بزنید. - عبارت
Learn about classesرا تایپ کنید و اینتر را بزنید. - عبارت
Get notificationsرا تایپ کنید و اینتر را بزنید. - اگر قبلاً مجوز ارسال اعلانهای فوری را به Action خود ندادهاید،
yesرا تایپ کرده و Enter را بزنید. -
yesرا تایپ کنید و اینتر را بزنید. اکنون حساب گوگل شما باید برای دریافت اعلانهای فوری برای این اقدام مشترک شود.

- برای خروج،
noرا تایپ کرده و enter را فشار دهید. - برای شروع مکالمه جدید، عبارت
Talk to my test appرا تایپ کرده و اینتر را بزنید. - عبارت
Test notificationتایپ کرده و اینتر را بزنید.

ظرف چند دقیقه باید یک اعلان فوری «اعلان تست از Action Gym» روی دستگاه تلفن همراه خود دریافت کنید. ضربه زدن روی این اعلان، شما را به هدف لغو کلاس اکشن شما متصل میکند.

۵. یک لینک دستیار ایجاد کنید
تا اینجا در مورد ویژگیهای تعاملی که میتوانید برای بازگرداندن کاربران به اکشن خود پیادهسازی کنید، بحث کردیم، اما این ویژگیها منوط به داشتن کاربرانی هستند که اکشن شما را کشف و از آن استفاده میکنند.
شما میتوانید یک لینک دستیار ایجاد کنید که کاربران دستگاههای تلفن همراه را مستقیماً به اکشن شما در دستیار متصل کند. از آنجایی که لینک دستیار یک هایپرلینک استاندارد است، میتوانید آن را به یک وبسایت یا هرگونه محتوای بازاریابی وب مانند وبلاگ یا پست رسانههای اجتماعی اضافه کنید.
در این مرحله، شما یاد خواهید گرفت که لینک دستیار چیست، چگونه میتوانید یکی برای هدف خوشامدگویی اکشن خود ایجاد کنید و چگونه آن را برای آزمایش به یک وبسایت ساده اضافه کنید.
این چگونه کاربران را جذب خواهد کرد؟
جذب کاربران به اکشن شما برای اولین بار میتواند چالش برانگیز باشد، به خصوص زمانی که آنها نیاز دارند تا به طور صریح اکشن شما را در دستیار فراخوانی کنند. یک لینک دستیار با ارائه لینک مستقیم به اکشن شما به کاربران، این اصطکاک را کاهش میدهد. وقتی کاربری لینک دستیار شما را در دستگاهی که دستیار در آن فعال است دنبال میکند، مستقیماً به اکشن شما هدایت میشود. وقتی کاربری لینک شما را در دستگاهی غیر از موبایل یا هر دستگاه دیگری که از دستیار پشتیبانی نمیکند باز میکند، همچنان به فهرست دایرکتوری اکشنهای شما (در صورت انتشار) هدایت میشود، بنابراین لینک همچنان میتواند اکشن شما را به آن کاربران معرفی کند.
لینکهای دستیار میتوانند ابزار مفیدی برای تعامل باشند، بنابراین اگر قصد دارید اقدام خود را از طریق وبسایت یا رسانههای اجتماعی تبلیغ کنید، باید یکی ایجاد کنید. فقط قبل از ایجاد و توزیع لینک دستیار، نکات زیر را در نظر داشته باشید:
- Assistant links only work once your Action is published. While your project is in a draft state, the link will only work on your own devices. Anyone else will be taken to a 404 page in the Actions directory.
- You can let users test an Assistant link prior to publishing by releasing your Action in an alpha or beta environment . Note that only users who participate in your alpha or beta will be able to test your Assistant link.
- Make sure the destination intent for your Assistant link makes a good first impression with new users. Your welcome intent is the default destination for an Assistant link because it should already do a good job of introducing your Action
Turn on Assistant links
Follow these steps to create an Assistant link for the welcome intent:
- In the Actions console, click the Develop tab, and choose Actions in the left navigation bar.
- Click on actions.intent.MAIN under the Actions list.
- Under the Links section, toggle the Would you like enable a URL for this Action option.
- Set a descriptive Link title that describes your Action. Make your title a simple verb-noun pair that describes what the user can accomplish with your Action. For this example, set the Link title to
learn about Action Gym. - Copy the HTML snippet from the bottom of this page and save it for later.
- Click Save at the top of the page.

Deploy a test website
To test your Assistant link, you can use Firebase tools to deploy a test website alongside your fulfillment. We've already built a simple test website for this example, you just need to add your Assistant link.
Go to your fulfillment's /user-engagement-codelab-nodejs/start/public/ directory and open the index.html file in a text editor.
In the index.html file, paste your Assistant link's HTML snippet into the body element. The file should end up looking like the snippet below:
فهرست.html
<body>
<p>
<a href="https://assistant.google.com/services/invoke/uid/000000efb5f2fd97">🅖 Ask my test app to learn about Action Gym
</a>
</p>
</body>
Test your Assistant link
In the terminal, run the following command to deploy your test website to Firebase:
firebase deploy
Once the deploy command finishes running, take note of the Hosting URL in the output.

Go to this URL on your mobile device's web browser and you should see the Assistant link on your test website. Clicking this link on your mobile device should take you to your Action's welcome intent in Assistant.

You can also try going to the Hosting URL on a desktop browser, which should take you to a 404 page in the Assistant directory since your Action isn't published.
6. Next steps
تبریک میگویم!
You've now learned about the importance of user engagement when developing an Action, what user engagement features are available on the platform, and how to add each feature to an Action.
Additional learning resources
Explore these resources to learn more about user engagement for your Action:
- User engagement & Assistant links docs : The official Actions on Google documentation on the features discussed in this codelab and user engagement in general.
- User retention analytics : Documentation for the analytics feature in the Actions console that shows user retention for your published Action.
- Conversational design guidelines : Best practices and guidelines for how to design user engagement features.
- Actions on Google GitHub repo : Sample code and libraries.
- r/GoogleAssistantDev : The official Reddit community for developers working with Assistant.
Follow us on Twitter @ActionsOnGoogle to stay tuned to our latest announcements, and tweet to #AoGDevs to share what you have built!
Feedback survey
Before you go, please fill out this form to let us know how we're doing!