1. Przegląd
Actions on Google to platforma dla programistów, która umożliwia tworzenie oprogramowania rozszerzającego funkcjonalność Asystenta Google, wirtualnego asystenta osobistego Google, na ponad miliardzie urządzeń, w tym na inteligentnych głośnikach, telefonach, w samochodach, telewizorach, słuchawkach i innych. Użytkownicy rozmawiają z Asystentem, aby wykonywać różne czynności, np. kupować produkty spożywcze lub rezerwować przejazdy. (Pełną listę możliwości znajdziesz w katalogu działań). Jako deweloper możesz używać Actions on Google, aby łatwo tworzyć i zarządzać atrakcyjnymi i skutecznymi interakcjami głosowymi między użytkownikami a usługą zewnętrzną.
To zaawansowany moduł codelabu przeznaczony dla osób, które mają już pewne doświadczenie w tworzeniu działań na potrzeby Asystenta Google. Jeśli nie masz doświadczenia w tworzeniu działań w Google, zdecydowanie zalecamy zapoznanie się z platformą, wykonując nasze wprowadzające ćwiczenia z programowania ( poziom 1, poziom 2 i poziom 3). Te zaawansowane moduły przeprowadzą Cię przez szereg funkcji, które pomogą Ci rozszerzyć funkcjonalność działania i zwiększyć liczbę odbiorców.
Ważnym sposobem pomiaru skuteczności działania jest zaangażowanie użytkowników, czyli to, jak skutecznie działanie przyciąga użytkowników po pierwszej interakcji. Aby to ułatwić, możesz wdrożyć w swojej akcji kilka funkcji, które pozwolą użytkownikom wrócić do rozmowy.
W tym laboratorium znajdziesz informacje o funkcjach zwiększających zaangażowanie użytkowników i sprawdzone metody dotyczące działań na platformie Google.

Co utworzysz
Ulepszysz już utworzoną funkcję, umożliwiając jej:
- Wysyłaj użytkownikom codzienne aktualizacje, które mogą kliknąć, aby porozmawiać z Twoją akcją.
- Wysyłaj użytkownikom powiadomienia push z linkami do Twojej akcji.
- Tworzenie linku, który prowadzi użytkowników do Twojej akcji z poziomu mobilnej przeglądarki internetowej
Czego się nauczysz
- Czym jest zaangażowanie użytkowników i dlaczego jest ważne dla sukcesu działania
- Jak zmodyfikować działanie, aby zwiększyć zaangażowanie użytkowników
- Które funkcje zaangażowania użytkowników stosować w różnych rodzajach działań
- Jak używać interfejsu Actions API do wysyłania powiadomień przez Asystenta
Czego potrzebujesz
Musisz mieć te narzędzia:
- Wybrane IDE lub edytor tekstu, np. WebStorm, Atom lub Sublime.
- terminal do uruchamiania poleceń powłoki z zainstalowanymi Node.js, npm i git;
- przeglądarka internetowa, np. Google Chrome;
- lokalne środowisko programistyczne z interfejsem wiersza poleceń Firebase;
- urządzenie mobilne (Android lub iOS) z Asystentem (musisz zalogować się w Asystencie za pomocą tego samego konta Google, którego użyjesz do utworzenia tego projektu);
Aby zrozumieć kod webhooka, zalecamy (choć nie jest to wymagane) znajomość JavaScript (ES6).
2. Konfigurowanie projektu
W tej sekcji dowiesz się, jak dodać funkcje zaangażowania użytkowników do gotowej, utworzonej wcześniej akcji.
Interpretowanie próbki
Przykładowa aplikacja do tego laboratorium to prosta czynność dla fikcyjnej siłowni o nazwie „Action Gym”. Działanie zawiera informacje o siłowni, w tym listę zajęć, które zmieniają się każdego dnia. Taka informacyjna czynność jest dobrym kandydatem do wszystkich funkcji zwiększających zaangażowanie użytkowników, ponieważ rotacyjna lista zajęć każdego dnia dostarcza innych przydatnych informacji.
Na diagramie poniżej przedstawiono przepływ rozmowy w przykładowej aplikacji Action Gym:

Wprowadź drobne zmiany w oknie, aby lepiej dopasować je do dodawanych funkcji zaangażowania. Ogólny wygląd rozmowy nie ulegnie jednak większym zmianom.
Pobieranie plików podstawowych
Aby sklonować repozytorium GitHub dla tego laboratorium, uruchom to polecenie:
git clone https://github.com/actions-on-google/user-engagement-codelab-nodejs
Konfigurowanie projektu i agenta
Aby skonfigurować projekt Actions i agenta Dialogflow, wykonaj te czynności:
- Otwórz konsolę Actions.
- Kliknij Nowy projekt.
- Wpisz nazwę projektu, np.
engagement-codelab. - Kliknij Utwórz projekt.
- Zamiast wybierać kategorię, przewiń w dół do sekcji Więcej opcji i kliknij kartę Konwersacyjna.
- Kliknij Build your Action (Utwórz akcję), aby rozwinąć opcje, i wybierz Add Action(s) (Dodaj akcje).
- Kliknij Dodaj pierwsze działanie.
- W oknie Utwórz działanie kliknij Niestandardowe intencje, a potem Utwórz,aby otworzyć konsolę Dialogflow.
- Na stronie tworzenia agenta w konsoli Dialogflow kliknij Utwórz.
- W menu nawigacyjnym po lewej stronie kliknij
(ikonę koła zębatego). - Kliknij kolejno Eksportowanie i importowanie i Przywróć z pliku ZIP.
- Prześlij plik
agent.zipz pobranej wcześniej lokalizacji/user-engagement-codelab-nodejs/start/. - Wpisz
RESTOREi kliknij Przywróć. - Kliknij Gotowe.
Wdrażanie realizacji zamówień
Gdy projekt Actions i agent Dialogflow będą gotowe, wdróż lokalny plik index.js za pomocą interfejsu wiersza poleceń Firebase Functions.
W katalogu /user-engagement-codelab-nodejs/start/functions/ sklonowanych plików bazowych uruchom te polecenia:
firebase use <PROJECT_ID>
npm install
firebase deploy
Po kilku minutach powinien pojawić się komunikat „Wdrożenie zostało ukończone”, który oznacza, że webhook został wdrożony w Firebase.
Pobieranie adresu URL wdrożenia
Musisz podać Dialogflow adres URL funkcji w Cloud Functions. Aby uzyskać ten adres URL, wykonaj te czynności:
- Otwórz konsolę Firebase.
- Wybierz projekt Actions z listy opcji.
- Na pasku nawigacyjnym po lewej stronie kliknij Develop > Functions (Programowanie > Funkcje). Jeśli pojawi się prośba o wybranie ustawień udostępniania danych, możesz ją zignorować, klikając Zrób to później.
- Na karcie Panel powinna być widoczna pozycja „realizacja” z adresem URL w sekcji Wywołanie. Zapisz ten adres URL. W następnej sekcji musisz go skopiować do Dialogflow.

Ustawianie adresu URL webhooka w Dialogflow
Teraz musisz zaktualizować agenta Dialogflow, aby używał webhooka do realizacji. W tym celu wykonaj następujące czynności:
- Otwórz konsolę Dialogflow (możesz zamknąć konsolę Firebase).
- W menu po lewej stronie kliknij Fulfillment (Realizacja).
- Włącz Webhook.
- Wklej adres URL skopiowany z panelu Firebase, jeśli jeszcze się nie wyświetla.
- Kliknij Zapisz.
Sprawdzanie, czy projekt jest prawidłowo skonfigurowany
Użytkownicy powinni mieć możliwość wywołania Twojej usługi, aby uzyskać informacje o Action Gym, w tym zakodowaną na stałe odpowiedź tekstową z godzinami otwarcia oraz odpowiedź tekstową z harmonogramem zajęć na każdy dzień tygodnia.
Aby przetestować akcję w Symulatorze Actions:
- W menu po lewej stronie konsoli Dialogflow kliknij Integracje > Asystent Google.
- Sprawdź, czy opcja Automatyczny podgląd zmian jest włączona, a następnie kliknij Testuj, aby zaktualizować projekt działań.
- Symulator Actions wczytuje Twój projekt Actions. Aby przetestować działanie, wpisz
Talk to my test appw polu Input (Dane wejściowe) i naciśnij Enter. - Powinna pojawić się odpowiedź z powitaniem w Action Gym. Postępuj zgodnie z instrukcjami, aby kontynuować rozmowę, i upewnij się, że usługa ma odpowiedź na każde dane wejściowe.

3. Dodawanie subskrypcji codziennych aktualności
Częstym sposobem na zaangażowanie użytkowników jest oferowanie im informacji wtedy, gdy są one najbardziej przydatne. Można to osiągnąć, oferując użytkownikom możliwość subskrybowania codziennych aktualizacji dotyczących intencji. W tym celu wysyłane są powiadomienia Asystenta Google z linkami bezpośrednio do realizacji tej intencji.
W tym kroku dowiesz się, jak subskrybować codzienne aktualizacje i dodać je do intencji Class List działania. Po wykonaniu tych instrukcji rozmowa z Twoją akcją będzie wyglądać jak na tym diagramie:

Jak to zaangażuje użytkowników?
Użytkownicy smartfonów prawdopodobnie znają powiadomienia push, które dostarczają informacji i aktualizacji dotyczących aplikacji. Subskrypcje codziennych aktualizacji to prosty sposób na docieranie do użytkowników na urządzeniach mobilnych poza Asystentem, pod warunkiem że intencja, dla której wysyłasz aktualizacje, nadal zapewnia użytkownikowi wartość każdego dnia.
Codzienne aktualizacje mogą być przydatnym narzędziem do zwiększania zaangażowania, ale nie muszą być uwzględniane w każdej czynności. Decydując, czy dodać do działania subskrypcje codziennych aktualizacji, weź pod uwagę te wskazówki:
- Zadbaj o to, aby codzienne aktualizacje zapewniały użytkownikowi różne, przydatne informacje. Jeśli po kliknięciu codziennej aktualizacji za każdym razem wyświetla się ten sam prompt, użytkownik prawdopodobnie zrezygnuje z subskrypcji po kilku dniach.
- Upewnij się, że dialog jest zrozumiały dla użytkownika, jeśli przejdzie on bezpośrednio do intencji codziennej aktualizacji. Użytkownik nie musi zaczynać od początku rozmowy, więc nie należy oczekiwać, że będzie miał dużo kontekstu.
- Przed poproszeniem użytkownika o subskrypcję codziennych aktualizacji pokaż mu korzyści, jakie przyniesie mu Twoja czynność. Gdy użytkownik ma możliwość subskrypcji, powinien myśleć: „Chcę otrzymywać te treści codziennie”.
- Nie zasypuj użytkownika powtarzającymi się sugestiami dotyczącymi subskrypcji. Zaproponuj subskrypcję codziennych aktualizacji od razu po pokazaniu użytkownikowi, co będzie subskrybować, i unikaj nagabywania go w innych miejscach.
- Po wywołaniu intencji aktualizacji prowadź krótką rozmowę. Większość codziennych aktualizacji powinna składać się tylko z jednej odpowiedzi, a potem zamykać się bez konieczności wprowadzania danych przez użytkownika.
Włączanie codziennych aktualizacji
Subskrypcje codziennych aktualizacji można dodać do intencji powitalnej, która umieszcza użytkownika na początku rozmowy, lub do bardziej szczegółowej intencji, aby utworzyć precyzyjny link do określonego miejsca w rozmowie. W tym samouczku najbardziej odpowiedni jest zamiar Class List, ponieważ dialog będzie się zmieniać każdego dnia, a użytkownicy mogą uznać za przydatne przypomnienie o dostępnych zajęciach.
Aby włączyć codzienne aktualizacje intencji Lista zajęć:
- W Konsoli Actions kliknij kartę Rozwijanie i na lewym pasku nawigacyjnym wybierz Działania.
- Na liście Działania kliknij Lista zajęć.
- W sekcji Zaangażowanie użytkowników włącz lub wyłącz opcję Czy chcesz oferować użytkownikom codzienne aktualizacje?.
- Ustaw opisowy tytuł treści, który opisuje codzienne aktualności. Kontekst to „O której godzinie mam wysyłać codzienne aktualności na temat:”, więc upewnij się, że tytuł jest opisowy i brzmi poprawnie, gdy jest odczytywany na głos. W tym przykładzie ustaw Tytuł treści na
list of upcoming Action Gym classes. - Kliknij Zapisz u góry strony.

Konfiguracja Dialogflow
Aby utworzyć intencje dla procesu subskrypcji codziennych aktualizacji, wykonaj te czynności w konsoli Dialogflow:
Zachęcanie użytkownika do subskrypcji
- Skonfiguruj nowy zamiar, który będzie obsługiwać prośbę użytkownika o subskrypcję codziennych aktualizacji. W konsoli Dialogflow kliknij przycisk + obok opcji Intencje w menu po lewej stronie, aby utworzyć nową intencję.
- Nazwij ten nowy zamiar
Setup Updates. - W sekcji Wyrażenia na potrzeby trenowania dodaj te wyrażenia użytkownika:
Send daily remindersReminderRemind meUpdatesUpcoming classes
- W sekcji Fulfillment (Realizacja) włącz opcję Enable webhook call for this intent (Aktywuj wywołanie webhooka dla tej intencji).
- Kliknij Zapisz u góry strony.

Obsługa decyzji użytkownika
- Skonfiguruj nowy zamiar, który będzie obsługiwać odpowiedź użytkownika na prompta dotyczącego subskrypcji codziennych aktualizacji. Aby utworzyć nowy zamiar, w lewym panelu nawigacyjnym kliknij przycisk + obok pozycji Zamiary.
- Nazwij ten nowy zamiar
Confirm Updates. - W sekcji Zdarzenia dodaj
actions_intent_REGISTER_UPDATE. To zdarzenie Dialogflow zostanie wywołane, gdy użytkownik zakończy proces subskrypcji codziennych aktualizacji, niezależnie od tego, czy ostatecznie ją wykupi. - W sekcji Fulfillment (Realizacja) włącz opcję Enable webhook call for this intent (Aktywuj wywołanie webhooka dla tej intencji).
- Kliknij Zapisz u góry strony.

Wdrożenie realizacji
Aby zaimplementować realizację w webhooku, wykonaj te czynności:
Wczytaj zależności
W pliku index.js zaktualizuj funkcję require(), aby dodać pakiet RegisterUpdate z pakietu actions-on-google. Instrukcje importu powinny wyglądać tak:
index.js
const {
dialogflow,
Suggestions,
RegisterUpdate,
} = require('actions-on-google');
Aktualizowanie sugestii
W pliku index.js dodaj wpis DAILY do listy tytułów sugestii, aby definicja Suggestion wyglądała tak:
index.js
// Suggestion chip titles
const Suggestion = {
HOURS: 'Ask about hours',
CLASSES: 'Learn about classes',
DAILY: 'Send daily reminders',
};
Dodawanie realizacji nowych intencji
Gdy użytkownik powie, że chce się zasubskrybować, rozpocznij proces subskrypcji codziennych aktualizacji, wywołując funkcję RegisterUpdate z docelowym zamiarem aktualizacji (Class List) i typem (DAILY). Po zakończeniu procesu subskrypcji Asystent wywołuje zdarzenie actions_intent_REGISTER_UPDATE z argumentem status, który określa, czy subskrypcja się powiodła. Wyświetlaj użytkownikowi kolejne prompty, które zmieniają się w zależności od stanu subskrypcji.
W pliku index.js dodaj ten kod:
index.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]));
}
});
Zaproponuj użytkownikowi alternatywne prompty
Odpowiedź Listy zajęć będzie zawierać na końcu subskrypcję codziennych aktualizacji, ale to stanowi problem. Ta sama odpowiedź zostanie wywołana, gdy użytkownik kliknie powiadomienie o codziennej aktualizacji, więc nadal będzie proszony o subskrypcję codziennych aktualizacji, mimo że właśnie z niej przyszedł. Jak sprawić, aby użytkownik nie myślał, że musi ponownie zasubskrybować usługę?
Na szczęście argumenty obiektu conv zawierają informacje o tym, gdzie użytkownik rozpoczął rozmowę. Możesz sprawdzić convargumenty, aby zobaczyć, czy zawierają sekcję UPDATES, która wskazuje, że użytkownik rozpoczął rozmowę z poziomu powiadomienia o codziennej aktualizacji. W zależności od tego możesz zmienić odpowiedź. Możesz też użyć tej gałęzi rozmowy, aby zamknąć okno dialogowe natychmiast po podaniu listy zajęć, co jest zgodne z naszą sprawdzoną metodą polegającą na tym, że codzienne aktualizacje powinny być krótkie.
W pliku index.js zastąp ten kod:
index.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]));
}
});
z tym:
index.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]));
};
};
});
Testowanie codziennych aktualności
Aby wdrożyć zaktualizowany kod webhooka w Firebase, uruchom w terminalu to polecenie:
firebase deploy
Aby przetestować niestandardowy komunikat w symulatorze działań:
- W konsoli Actions otwórz Test (Testuj).
- Wpisz
Talk to my test appw polu Input (Dane wejściowe) i naciśnij Enter. - Wpisz
Learn about classesi naciśnij Enter. Odpowiedź Twojej usługi powinna teraz zawierać propozycję wysyłania codziennych przypomnień. - Wpisz
Send daily remindersi naciśnij Enter. - Wpisz godzinę, o której chcesz zobaczyć aktualizację, i naciśnij Enter. Na potrzeby testów spróbuj odpowiedzieć 3–5 minut później niż bieżący czas.

Na urządzeniu mobilnym powinno pojawić się powiadomienie od Asystenta w określonym przez Ciebie czasie. Pamiętaj, że to powiadomienie może się pojawić dopiero po kilku minutach. Kliknij powiadomienie, aby przejść bezpośrednio do intencji Lista zajęć w Asystencie. Zobaczysz listę nadchodzących zajęć:

4. Dodawanie powiadomień push
Inną opcją angażowania użytkowników poza Akcją jest wywoływanie interfejsu Actions API w celu wysyłania do nich powiadomień push. W przeciwieństwie do codziennych powiadomień nie są one automatycznie planowane przez Asystenta, więc możesz je wysyłać w dowolnym momencie.
W tym kroku dowiesz się, jak wdrożyć powiadomienia push w swojej akcji, dodając nowy zamiar Class Canceled i wysyłając powiadomienia do użytkowników, które informują ich o odwołaniu zajęć. Skonfigurujesz też te 3 komponenty potrzebne do wysyłania powiadomień:
- Konto interfejsu Actions API – powiadomienia do użytkownika wysyłasz, przesyłając
POSTżądanie do interfejsu API. Musisz więc skonfigurować konto usługi i dane logowania, aby korzystać z tego interfejsu. - Asystent uprawnień – aby uzyskać dostęp do identyfikatora użytkownika potrzebnego do wysyłania powiadomień push, musisz mieć jego zgodę. W tym przykładzie użyjesz funkcji biblioteki klienta, aby wywołać narzędzie do obsługi uprawnień i poprosić o ten identyfikator.
- Przechowywanie – aby wysyłać powiadomienia push do użytkownika poza rozmową, musisz przechowywać identyfikatory użytkowników w miejscu, z którego można je w dowolnym momencie przywołać. W tym przykładzie skonfigurujesz bazę danych Firestore do przechowywania informacji o każdym użytkowniku.
Po wykonaniu tych instrukcji dodasz do rozmowy z Action te dialogi:

Jak to zaangażuje użytkowników?
Użytkownicy smartfonów prawdopodobnie znają powiadomienia push, które dostarczają informacji i aktualizacji dotyczących aplikacji. Powiadomienia push to elastyczny sposób docierania do użytkowników na urządzeniach mobilnych poza Asystentem, pod warunkiem że użytkownicy mają dobry powód, aby je włączyć. Dzięki codziennym aktualizacjom użytkownicy wiedzą, że będą otrzymywać powiadomienia codziennie. W przypadku powiadomień push użytkownicy nie wiedzą, czy wyrażają zgodę na otrzymywanie rzadkich powiadomień, czy też będą otrzymywać wiele powiadomień dziennie.
Powiadomienia push mogą być przydatnym narzędziem do zwiększania zaangażowania, ale nie muszą być uwzględniane w każdej czynności. Decydując, czy dodać do działania powiadomienia push, weź pod uwagę te wskazówki:
- Zaplanuj przykładowe harmonogramy powiadomień push. Jeśli planujesz wysyłać tylko jedno powiadomienie push dziennie, rozważ użycie aktualizacji dziennych.
- Zadbaj o to, aby powiadomienia push za każdym razem zawierały przydatne informacje. Powiadomienia mogą też zawierać precyzyjne linki do jednej z intencji działania, więc upewnij się, że intencja jest przydatna i trafna.
- Wyraźnie proś użytkownika o subskrypcję powiadomień push. Powinni wiedzieć, czego mogą się spodziewać w przypadku każdego powiadomienia push, i mieć pewne pojęcie o tym, jak często są one wysyłane.
Włączanie interfejsu Actions API
- Otwórz konsolę Google Cloud i w menu wybierz nazwę projektu Actions.

- W menu nawigacyjnym (☰) otwórz Interfejsy API i usługi > Biblioteka.
- Wyszukaj Actions API i kliknij Włącz.

Tworzenie konta usługi
Interfejs Actions API wymaga uwierzytelniania, więc aby wysyłać żądania, musisz utworzyć konto usługi. Aby utworzyć i zainstalować klucz konta usługi dla interfejsu Actions API, wykonaj te czynności:
- W menu nawigacyjnym (☰) konsoli Google Cloud kliknij Interfejsy API i usługi > Dane logowania.
- Kliknij Utwórz dane logowania > Klucz konta usługi.
- W menu Konto usługi wybierz Nowe konto usługi.
- Podaj te informacje:
- Nazwa konta usługi:
service-account - Rola: Projekt > Właściciel
- Identyfikator konta usługi:
service-account(zawsze po nim występuje @<project_id>.iam.gserviceaccount.com) - Typ klucza: JSON
- Kliknij Utwórz.
- Przenieś pobrany plik JSON do katalogu /user-engagement-codelab/start/functions/ w projekcie.
- Zmień nazwę pliku JSON na
service-account.json.

Włączanie Firestore
Aby wysyłać powiadomienia poza rozmową, musisz mieć sposób na przechowywanie identyfikatorów użytkowników, do których możesz się odwoływać w kodzie powiadomień. W tym przykładzie używamy bazy danych Firestore do przechowywania identyfikatorów użytkowników, którzy subskrybują powiadomienia.
Aby utworzyć bazę danych Firestore dla działania:
- W konsoli Firebase wybierz nazwę projektu Actions.
- W panelu nawigacyjnym po lewej stronie kliknij Programowanie > Baza danych, a następnie Utwórz bazę danych.
- Kliknij Uruchom w trybie testowym.
- Kliknij Włącz.

Konfiguracja Dialogflow
Aby utworzyć w konsoli Dialogflow proces uzyskiwania zgody na powiadomienia push:
Zachęcanie użytkownika do subskrypcji
- Skonfiguruj nowy zamiar, który będzie obsługiwać prośby użytkowników o subskrypcję powiadomień push o odwołanych zajęciach. W konsoli Dialogflow kliknij przycisk + obok opcji Intencje w menu po lewej stronie, aby utworzyć nową intencję.
- Nazwij ten nowy zamiar
Setup Push Notifications. - W sekcji Wyrażenia na potrzeby trenowania dodaj te wyrażenia użytkownika:
Subscribe to notificationsSend notificationNotify meSend class notificationsCancelled notifications
- W sekcji Fulfillment (Realizacja) włącz opcję Enable webhook call for this intent (Aktywuj wywołanie webhooka dla tej intencji).
- Kliknij Zapisz u góry strony.

Obsługa decyzji użytkownika
- Skonfiguruj nowy zamiar, który będzie obsługiwać odpowiedź użytkownika na prośbę o subskrypcję powiadomień push. Aby utworzyć nowy zamiar, w lewym panelu nawigacyjnym kliknij przycisk + obok pozycji Zamiary.
- Nazwij ten nowy zamiar
Confirm Push Notifications. - W sekcji Zdarzenia dodaj
actions_intent_PERMISSION. To zdarzenie Dialogflow zostanie wywołane, gdy użytkownik zakończy proces subskrypcji powiadomień push, niezależnie od tego, czy ostatecznie zasubskrybuje powiadomienia. - W sekcji Fulfillment (Realizacja) włącz opcję Enable webhook call for this intent (Aktywuj wywołanie webhooka dla tej intencji).
- Kliknij Zapisz u góry strony.

Obsługa powiadomienia push
Możesz połączyć powiadomienia push z określoną intencją, aby użytkownicy, którzy klikną powiadomienie push, byli kierowani bezpośrednio do tej intencji w Twojej akcji. W tym przykładzie dodaj nowy zamiar dotyczący powiadomień push, który zawiera szczegóły odwołanych zajęć.
Aby dodać intencję, która ma być wywoływana przez użytkownika po kliknięciu powiadomienia push:
- W konsoli Dialogflow kliknij przycisk + obok opcji Intencje w menu po lewej stronie, aby utworzyć nową intencję.
- Nazwij ten nowy zamiar
Class Canceled. - W sekcji Training phrases (Wyrażenia na potrzeby trenowania) dodaj
Cancelationsjako wyrażenie użytkownika. - W sekcji Fulfillment (Realizacja) włącz opcję Enable webhook call for this intent (Aktywuj wywołanie webhooka dla tej intencji).
- Kliknij Zapisz u góry strony.

Wysyłanie powiadomień testowych w trakcie rozmowy
W środowisku produkcyjnym powinien być skrypt oddzielony od kodu realizacji działania, który wysyła powiadomienia push. W tym przykładzie utwórz intencję, którą możesz wywołać, aby wysłać powiadomienie push podczas rozmowy z akcją. Ten zamiar służy tylko do debugowania. W praktyce powiadomienia push nie powinny być obsługiwane przez usługę ani wywoływane w ramach rozmowy z Twoją usługą.
Aby utworzyć intencję do testowania powiadomień push:
- Na potrzeby testowania i debugowania skonfiguruj nowy zamiar, który umożliwi Ci wysyłanie powiadomień push do subskrybujących użytkowników. W konsoli Dialogflow kliknij przycisk + obok opcji Intencje w menu po lewej stronie, aby utworzyć nową intencję.
- Nazwij ten nowy zamiar
Test Notification. - W sekcji Training phrases (Wyrażenia na potrzeby trenowania) dodaj
Test notificationjako wyrażenie użytkownika. - W sekcji Fulfillment (Realizacja) włącz opcję Enable webhook call for this intent (Aktywuj wywołanie webhooka dla tej intencji).
- Kliknij Zapisz u góry strony.

Włącz powiadomienia push
Aby włączyć powiadomienia push dla intencji Class Canceled (Zajęcia odwołane):
- W konsoli Dialogflow na pasku nawigacyjnym kliknij Integracje.
- Na karcie Asystent Google kliknij Ustawienia integracji.
- Dodaj intencję Class Canceled jako intencję wywołania niejawnego. Ten krok jest niezbędny, aby Dialogflow rozpoznał, że użytkownicy mogą rozpocząć rozmowę z intencją Class Canceled (klikając powiadomienie push).
- Kliknij Zamknij.

- W Konsoli Actions kliknij kartę Rozwijanie i na lewym pasku nawigacyjnym wybierz Działania.
- Na liście Działania kliknij Zajęcia odwołane.
- W sekcji Zaangażowanie użytkowników włącz opcję Czy chcesz wysyłać powiadomienia push?.
- Ustaw opisowy tytuł treści, który opisuje powiadomienie push. Kontekst to „Czy mogę wysyłać Ci powiadomienia push na temat: ?”, więc upewnij się, że tytuł jest opisowy i brzmi poprawnie po odczytaniu na głos. W tym przykładzie ustaw Tytuł treści na
class cancelations. - Kliknij Zapisz u góry strony.

Wdrożenie realizacji
Aby zaimplementować realizację w webhooku, wykonaj te czynności:
Wczytaj zależności
W pliku index.js zaktualizuj funkcję require(), aby dodać pakiet UpdatePermission z pakietu actions-on-google. Instrukcje importu powinny wyglądać tak:
index.js
const {
dialogflow,
Suggestions,
RegisterUpdate,
UpdatePermission,
} = require('actions-on-google');
Aktualizowanie sugestii
W pliku index.js dodaj wpis NOTIFICATIONS do listy tytułów sugestii, aby definicja Suggestion wyglądała tak:
index.js
// Suggestion chip titles
const Suggestion = {
HOURS: 'Ask about hours',
CLASSES: 'Learn about classes',
DAILY: 'Send daily reminders',
NOTIFICATIONS: 'Get notifications',
};
Konfigurowanie nowych importów
Aby połączyć się z bazą danych Firestore, dodaj pakiet firebase-admin i stałe dla pól przechowywanych w bazie danych. Zaimportuj też pakiety google-auth-library i request, aby obsługiwać uwierzytelnianie i żądania do interfejsu Actions API.
W pliku index.js dodaj do instrukcji importu ten kod:
index.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');
Propozycja skonfigurowania powiadomień o odwołaniu zajęć
W pliku index.js zastąp ten kod:
index.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]));
};
};
});
z tym:
index.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]));
};
};
});
Dodawanie realizacji nowych intencji
Gdy użytkownik powie, że chce subskrybować powiadomienia push, wywołaj funkcję pomocniczą UpdatePermission, aby poprosić go o zgodę. Jeśli się to uda, argument PERMISSION zostanie dodany do argumentów obiektu conv, które możesz sprawdzić, aby zmienić temat rozmowy.
Gdy uzyskasz zgodę użytkownika, pobierz identyfikator użytkownika z argumentów obiektu conv i zapisz go w bazie danych. Ten identyfikator użytkownika wyślesz później do interfejsu Actions API, dzięki czemu Asystent będzie wiedzieć, kto ma otrzymać powiadomienie.
Na koniec dodaj realizację intencji Class Canceled, która jest wywoływana przez kliknięcie powiadomienia push. W tym przykładzie Twoja odpowiedź jest ciągiem zastępczym, ale w wersji tej czynności gotowej do wdrożenia skrypt powiadomienia zawierałby bardziej dynamiczne informacje o tym, które zajęcia zostały odwołane.
W pliku index.js dodaj ten kod:
index.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.');
});
Dodawanie powiadomień testowych
Aby wysłać powiadomienie push do użytkownika, wyślij żądanie POST do interfejsu Actions API z identyfikatorem użytkownika, tytułem powiadomienia i docelowym zamiarem. W tym przykładzie wywołanie intencji Test Notification spowoduje iterację bazy danych Firestore i wysłanie powiadomień push do wszystkich użytkowników, którzy subskrybują powiadomienia.
Pamiętaj, że w tym przykładzie w odpowiedzi webhooka umieszczasz kod, który wysyła powiadomienie push, i wywołujesz ten kod, wywołując w rozmowie testowy zamiar. W przypadku działań, które chcesz opublikować, kod powiadomienia push powinien znajdować się w skrypcie oddzielonym od skryptu realizacji.
W pliku index.js dodaj ten kod:
index.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.');
});
Testowanie powiadomień push
Aby wdrożyć zaktualizowany kod webhooka w Firebase, uruchom w terminalu to polecenie:
firebase deploy
Aby przetestować powiadomienia w symulatorze działań, wykonaj te czynności:
- W Konsoli Actions otwórz kartę Test.
- Wpisz
Talk to my test appw polu Input (Dane wejściowe) i naciśnij Enter. - Wpisz
Learn about classesi naciśnij Enter. - Wpisz
Get notificationsi naciśnij Enter. - Jeśli nie masz jeszcze uprawnień do wysyłania powiadomień push, wpisz
yesi naciśnij Enter. - Wpisz
yesi naciśnij Enter. Na Twoim koncie Google powinny być teraz włączone powiadomienia push dotyczące tego działania.

- Wpisz
noi naciśnij Enter, aby zamknąć. - Wpisz
Talk to my test appi naciśnij Enter, aby rozpocząć nową rozmowę. - Wpisz
Test notificationi naciśnij Enter.

Po kilku minutach na urządzeniu mobilnym powinno pojawić się powiadomienie push Asystenta „Testowe powiadomienie z Action Gym”. Kliknięcie tego powiadomienia spowoduje przejście do intencji Class Canceled (Zajęcia odwołane) w Twojej czynności.

5. Tworzenie linku do asystenta
Do tej pory omawialiśmy funkcje zwiększające zaangażowanie, które możesz wdrożyć, aby zachęcić użytkowników do powrotu do Twojej akcji. Jednak aby to było możliwe, musisz mieć użytkowników, którzy odkryją Twoją akcję i będą z niej korzystać.
Możesz utworzyć link do Asystenta, który będzie kierować użytkowników urządzeń mobilnych bezpośrednio do Twojej akcji w Asystencie. Link do Asystenta to standardowy hiperlink, więc możesz go dodać do witryny lub dowolnych materiałów marketingowych w internecie, takich jak blog czy post w mediach społecznościowych.
W tym kroku dowiesz się, czym jest link do Asystenta, jak utworzyć go dla intencji powitalnej działania i jak dodać go do prostej witryny w celu przetestowania.
Jak to zaangażuje użytkowników?
Przyciągnięcie użytkowników do akcji po raz pierwszy może być trudne, zwłaszcza gdy muszą oni wyraźnie wywołać akcję w Asystencie. Link do Asystenta zmniejsza te trudności, ponieważ zapewnia użytkownikom bezpośredni dostęp do Twojej działania. Gdy użytkownik kliknie link do Asystenta na urządzeniu z Asystentem, zostanie przekierowany bezpośrednio do Twojej akcji. Gdy użytkownik otworzy Twój link na urządzeniu mobilnym lub innym urządzeniu, które nie obsługuje Asystenta, nadal zostanie przekierowany do Twojej wizytówki w katalogu działań (jeśli została opublikowana), dzięki czemu link nadal będzie mógł promować Twoje działanie wśród tych użytkowników.
Linki do Asystenta mogą być przydatnym narzędziem do zwiększania zaangażowania, więc warto je utworzyć, jeśli planujesz reklamować swoją akcję w witrynie lub w mediach społecznościowych. Zanim utworzysz i rozpowszechnisz link do Asystenta, zapoznaj się z tymi wskazówkami:
- Linki do Asystenta działają tylko po opublikowaniu działania. Gdy projekt jest w stanie roboczym, link będzie działać tylko na Twoich urządzeniach. Pozostałe osoby zostaną przekierowane na stronę 404 w katalogu działań.
- Zanim opublikujesz link do Asystenta, możesz umożliwić użytkownikom jego przetestowanie, udostępniając działanie w środowisku alfa lub beta. Pamiętaj, że tylko użytkownicy, którzy biorą udział w testach alfa lub beta, będą mogli przetestować połączenie z Asystentem.
- Zadbaj o to, aby intencja docelowa linku do Asystenta wywarła dobre pierwsze wrażenie na nowych użytkownikach. Intencja powitalna jest domyślnym miejscem docelowym linku do Asystenta, ponieważ powinna już dobrze wprowadzać użytkownika w działanie.
Włączanie linków Asystenta
Aby utworzyć link do Asystenta dla intencji powitalnej:
- W Konsoli Actions kliknij kartę Rozwijanie i na lewym pasku nawigacyjnym wybierz Działania.
- Na liście Działania kliknij actions.intent.MAIN.
- W sekcji Linki włącz opcję Czy chcesz włączyć adres URL dla tego działania?.
- Ustaw opisowy tytuł linku, który opisuje Twoje działanie. Tytuł powinien być prostą parą czasownik-rzeczownik, która opisuje, co użytkownik może osiągnąć za pomocą Twojej czynności. W tym przykładzie ustaw tytuł linku na
learn about Action Gym. - Skopiuj fragment kodu HTML z dołu tej strony i zapisz go na później.
- Kliknij Zapisz u góry strony.

Wdrażanie testowej witryny
Aby przetestować link do Asystenta, możesz użyć narzędzi Firebase do wdrożenia testowej witryny wraz z realizacją. Na potrzeby tego przykładu utworzyliśmy już prostą witrynę testową. Musisz tylko dodać link do Asystenta.
Otwórz katalog /user-engagement-codelab-nodejs/start/public/ w usłudze realizacji zamówień i otwórz plik index.html w edytorze tekstu.
W pliku index.html wklej fragment kodu HTML linku do Asystenta w elemencie body. Plik powinien wyglądać jak poniższy fragment kodu:
index.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>
Przetestuj link do Asystenta
W terminalu uruchom to polecenie, aby wdrożyć testową witrynę w Firebase:
firebase deploy
Po zakończeniu wykonywania polecenia wdrażania zwróć uwagę na adres URL hostingu w danych wyjściowych.

Otwórz ten adres URL w przeglądarce na urządzeniu mobilnym. Na testowej stronie powinna pojawić się ikona Asystenta. Kliknięcie tego linku na urządzeniu mobilnym powinno spowodować przejście do intencji powitalnej działania w Asystencie.

Możesz też otworzyć adres URL hostingu w przeglądarce na komputerze. Powinna się wtedy wyświetlić strona 404 w katalogu Asystenta, ponieważ Twoja czynność nie jest opublikowana.
6. Dalsze kroki
Gratulacje!
Wiesz już, jak ważne jest zaangażowanie użytkowników podczas tworzenia działania, jakie funkcje zaangażowania użytkowników są dostępne na platformie i jak dodać każdą z nich do działania.
Dodatkowe materiały szkoleniowe
Zapoznaj się z tymi materiałami, aby dowiedzieć się więcej o zaangażowaniu użytkowników w Twoją akcję:
- Zaangażowanie użytkowników i dokumentacja linków Asystenta: oficjalna dokumentacja Actions on Google dotycząca funkcji omówionych w tym samouczku i zaangażowania użytkowników w ogóle.
- Statystyki utrzymania użytkowników: dokumentacja funkcji statystycznych w konsoli Actions, która pokazuje utrzymanie użytkowników opublikowanej przez Ciebie akcji.
- Wskazówki dotyczące projektowania interakcji konwersacyjnych: sprawdzone metody i wskazówki dotyczące projektowania funkcji angażujących użytkowników.
- Repozytorium GitHub Actions on Google: przykładowy kod i biblioteki.
- r/GoogleAssistantDev: oficjalna społeczność Reddit dla programistów pracujących z Asystentem.
Obserwuj nas na Twitterze @ActionsOnGoogle, aby być na bieżąco z najnowszymi ogłoszeniami, i publikuj tweety z hasztagiem #AoGDevs, aby dzielić się swoimi projektami.
Ankieta dotycząca opinii
Zanim to zrobisz, wypełnij ten formularz, aby powiedzieć nam, jak sobie radzimy.