Angażowanie użytkowników za pomocą Asystenta Google

1. Opis

Actions on Google to platforma dla programistów, która umożliwia tworzenie oprogramowania pozwalającego rozszerzyć funkcje Asystenta Google, wirtualnego asystenta osobistego na ponad miliardie urządzeń, w tym inteligentnych głośnikach, telefonach, samochodach, telewizorach, słuchawkach i innych urządzeniach. Użytkownicy rozmawiają z Asystentem podczas rozmowy, np. kupując artykuły spożywcze czy rezerwując przejazd. (Pełną listę możliwych działań znajdziesz w katalogu działań). Jako deweloper możesz korzystać z Actions on Google, by łatwo tworzyć przydatne rozmowy i zarządzać nimi między użytkownikami a usługami innych firm.

Jest to zaawansowany moduł ćwiczeń z programowania przeznaczony dla czytelników, którzy mają już doświadczenie w tworzeniu działań Asystenta Google. Jeśli nie masz doświadczenia w programie Actions on Google, zalecamy zapoznanie się z naszymi ćwiczeniami z programowania (Poziom 1, Poziom 2 i Poziom 3). W tych modułach zaawansowanych znajdziesz szereg funkcji, które pomogą Ci zwiększyć liczbę działań i powiększyć grono odbiorców.

Jednym z ważnych sposobów na pomiar skuteczności jest działanie użytkowników lub ich skuteczność w pozyskiwaniu użytkowników po pierwszej interakcji. Aby ułatwić sobie to zadanie, możesz zaimplementować w akcji kilka funkcji, które pozwolą użytkownikom wrócić do rozmowy.

Ćwiczenia z programowania obejmują funkcje związane z zaangażowaniem użytkowników i sprawdzone metody dotyczące Actions on Google.

A3fc0061bd01a75.png 961ef6e27dc73da2.png

Co stworzysz

Rozbudowaną funkcję, która została już utworzona, włączając:

  • Wysyłaj użytkownikom codzienne aktualizacje, które mogą kliknąć, by porozmawiać z Twoją akcją
  • Wysyłanie użytkownikom powiadomień push z linkiem do Twojej akcji
  • Utwórz link, który przekieruje użytkowników do działania w przeglądarce mobilnej

Czego się nauczysz

  • Co to jest zaangażowanie użytkowników i dlaczego jest ono istotne dla sukcesu działania
  • Jak zmodyfikować działanie, by zwiększyć zaangażowanie użytkowników
  • funkcji związanych z zaangażowaniem użytkowników, których można używać w różnych rodzajach działań;
  • Przesyłanie powiadomień za pomocą Asystenta za pomocą interfejsu Actions API

Czego potrzebujesz

Musisz mieć te narzędzia:

  • wybrany przez Ciebie IDE lub edytor tekstu, np. WebStorm, Atom lub Sublime.
  • Terminal uruchamiający polecenia powłoki z zainstalowanymi wersjami Node.js, npm i git
  • Przeglądarka internetowa, np. Google Chrome.
  • Lokalne środowisko programistyczne z interfejsem wiersza poleceń Firebase
  • Urządzenie mobilne (z Androidem lub iOS) z Asystentem (musisz się zalogować w Asystencie na to samo konto Google, którego użyjesz do utworzenia tego projektu).

Znajomość języka JavaScript (ES6) również jest konieczna, by ułatwić zrozumienie kodu webhooka.

2. Konfigurowanie projektu

Z tej sekcji dowiesz się, jak dodać funkcje związane z zaangażowaniem użytkowników do kompletnego, wcześniej utworzonego działania.

Zapoznaj się z próbką

Przykładowe ćwiczenia z tego ćwiczenia z ćwiczenia fikcyjnego o nazwie "Action Gym." Akcja zawiera informacje o siłowni, w tym listę zajęć, które zmieniają się codziennie. Przydatne informacje takie jak ta sprawdzają się przy wszystkich funkcjach związanych z zaangażowaniem użytkowników, ponieważ obracająca się lista zajęć każdego dnia dostarcza inne przydatne informacje.

Oto diagram rozmowy w aplikacji Gimnastyka Action:

e2d6e4ad98948cf3.png

Będziesz wprowadzać niewielkie modyfikacje w oknie dialogowym, aby lepiej pasowały do dodanych przez Ciebie funkcji związanych z zaangażowaniem. Ogólny układ rozmowy nie ulega jednak znacznym zmianom.

Pobieranie plików podstawowych

Uruchom następujące polecenie, aby skopiować repozytorium GitHub na potrzeby ćwiczeń z programowania:

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:

  1. Otwórz konsolę Actions.
  2. Kliknij Nowy projekt.
  3. Wpisz nazwę projektu, np. engagement-codelab.
  4. Kliknij Utwórz projekt.
  5. Zamiast wybierać kategorię, przewiń w dół do sekcji Więcej opcji i kliknij kartę Rozmowa.
  6. Kliknij Build your Action (Utwórz akcję), by rozwinąć opcje, i wybierz Add Action(s) (Dodaj akcje).
  7. Kliknij Dodaj pierwsze działanie.
  8. W oknie Create Action (Utwórz działanie) wybierz Custom Intent (Intencja niestandardowa) i kliknij Build (Utwórz), aby uruchomić konsolę Dialogflow.
  9. Na stronie tworzenia agenta w konsoli Dialogflow kliknij Utwórz.
  10. Kliknij 6bf56243a8a11a3b.png (ikonę koła zębatego) w menu po lewej stronie.
  11. Kliknij Eksportuj i zaimportuj, a następnie Przywróć z pliku ZIP.
  12. Prześlij plik agent.zip z pobranego wcześniej katalogu /user-engagement-codelab-nodejs/start/.
  13. Wpisz RESTORE i kliknij Przywróć.
  14. Kliknij Gotowe.

Wdrażanie realizacji

Gdy Twój projekt Actions i agent Dialogflow będą gotowe, wdróż lokalny plik index.js za pomocą interfejsu wiersza poleceń Firebase.

Z katalogu /user-engagement-codelab-nodejs/start/functions/ swoich plików podstawowych uruchom następujące polecenia:

firebase use <PROJECT_ID>
npm install
firebase deploy

Po kilku minutach powinien wyświetlić się komunikat Deployment completed! (Wdrożenie zakończone) oznacza, że udało Ci się wdrożyć webhooka w Firebase.

Pobieranie adresu URL wdrożenia

Musisz podać Dialogflow adres URL do funkcji w chmurze. Aby go uzyskać, wykonaj te czynności:

  1. Otwórz konsolę Firebase.
  2. Wybierz projekt z listy opcji.
  3. Otwórz Program > Funkcje na pasku nawigacyjnym po lewej stronie. Jeśli pojawi się prośba o „wybranie ustawień udostępniania danych”, możesz zignorować tę opcję, klikając Później.
  4. Na karcie Pulpit nawigacyjny powinien być widoczny wpis dotyczący opcji „"fulfillment"” z adresem URL w sekcji Trigger (Aktywator). Zapisz ten adres URL. Skopiuj go do następnej sekcji w Dialogflow.

1741a329947975db

Ustawianie adresu URL webhooka w Dialogflow

Teraz musisz zaktualizować agenta Dialogflow, aby używać webhooka do realizacji. Jak to zrobić:

  1. Otwórz konsolę Dialogflow (jeśli chcesz, możesz zamknąć konsolę Firebase).
  2. W panelu nawigacyjnym po lewej stronie kliknij Realizacja.
  3. Włącz Webhook.
  4. Wklej URL skopiowany z panelu Firebase, jeśli nie jest widoczny.
  5. Kliknij Zapisz.

Sprawdzanie, czy projekt jest prawidłowo skonfigurowany

Użytkownicy powinni mieć możliwość wywoływania Twojego działania w celu uzyskania informacji o aplikacji Gym Action, w tym zakodowanej na nią odpowiedzi tekstowej z godzinami pracy oraz odpowiedzi tekstowej zawierającej listę zajęć z każdego dnia tygodnia.

Aby przetestować działanie w symulatorze:

  1. W panelu nawigacyjnym po lewej stronie kliknij Integrations (Integracje) Google Assistant (Asystent Google).
  2. Upewnij się, że Automatyczny podgląd zmian jest włączony, a następnie kliknij Przetestuj, aby zaktualizować projekt w Actions.
  3. Symulator Actions wczytuje projekt. Aby przetestować działanie, wpisz Talk to my test app w polu Dane wejściowe i naciśnij Enter.
  4. Powinna pojawić się odpowiedź na Twoją siłownię. Postępuj zgodnie z wyświetlanymi instrukcjami, aby kontynuować rozmowę, jednocześnie upewniając się, że Twoja odpowiedź zawiera wszystkie odpowiedzi.

60acf1ff87b1a87f.png

3. Dodaj subskrypcje dziennej aktualizacji

Częstym sposobem angażowania użytkowników jest oferowanie im informacji, które są najbardziej przydatne. W tym celu można zaoferować użytkownikom subskrypcję codziennych aktualizacji intencji, dzięki czemu Asystent otrzyma powiadomienie z linkiem bezpośrednio do realizacji intencji.

W tym kroku dowiesz się więcej o subskrypcjach dziennych aktualizacji i dodasz je do intencji Lista zajęć w ramach akcji. Po wykonaniu tych czynności rozmowa Akcji będzie wyglądała następująco:

F48891C8118f7436.png

Jak to wpłynie na zaangażowanie użytkowników?

Użytkownicy smartfonów prawdopodobnie znają powiadomienia push, które zawierają informacje i aktualizacje aplikacji. Subskrypcje z codzienną aktualizacją to prosty sposób na dostęp do użytkowników urządzeń mobilnych poza Asystentem, o ile użytkownik wysyła codziennie aktualizacje z myślą o korzyściach.

Codzienne aktualizacje mogą być przydatnym narzędziem do zwiększania zaangażowania, ale niekoniecznie trzeba je włączać do poszczególnych działań. Zanim zdecydujesz, czy chcesz dodać do działania subskrypcje dzienne, weź pod uwagę te wskazówki:

  • Upewnij się, że z codziennych aktualizacji wynika to, że codziennie wyświetlane są użytkownikowi przydatne informacje. Jeśli po kliknięciu codziennej aktualizacji za każdym razem pojawi się ten sam komunikat, użytkownik prawdopodobnie anuluje subskrypcję po kilku dniach.
  • Upewnij się, że okno dialogowe jest zrozumiałe dla użytkownika, gdy przechodzi do codziennej aktualizacji. Użytkownik nie musi zaczynać od początku rozmowy, więc nie powinien mieć dużo kontekstu.
  • Pokaż użytkownikowi korzyści płynące z działania, zanim wyświetli się prośba o subskrypcję codziennych aktualizacji. Użytkownik powinien myśleć „Chcę otrzymywać te treści codziennie”, gdy tylko będzie miał możliwość zasubskrybowania kanału.
  • Nie przytłaczaj użytkownika zbyt dużą liczbą sugestii subskrypcji. Zaoferuj dzienną subskrypcję aktualizacji natychmiast po tym, jak pokażesz użytkownikowi to, co subskrybują, i uniknij informowania go o tym w innym miejscu.
  • Po uruchomieniu intencji aktualizacji rozmowa powinna być krótka. Większość dziennych aktualizacji powinna zawierać tylko jedną odpowiedź, a potem zamykana bez konieczności wprowadzania danych przez użytkownika.

Włącz aktualizacje dzienne

Subskrypcje z codzienną aktualizacją można dodać do intencji powitalnej, która powoduje umieszczenie użytkownika na początku rozmowy, lub bardziej szczegółowego celu, aby utworzyć precyzyjny link do dowolnego miejsca w rozmowie. W tym ćwiczeniu warto rozważyć intencję Listy zajęć, bo dialogi zmieniają się każdego dnia, a użytkownikom przypomina przypomnienie, które zajęcia są dla nich dostępne.

Aby włączyć dzienne aktualizacje intencji Lista zajęć, wykonaj te czynności:

  1. W konsoli działań kliknij kartę Programowanie i wybierz Działania na pasku nawigacyjnym po lewej stronie.
  2. Na liście Działania kliknij Lista zajęć.
  3. W sekcji Zaangażowanie użytkowników przełącz opcję Czy chcesz oferować użytkownikom codzienne aktualizacje.
  4. Ustaw opisowy tytuł treści opisujący codzienną aktualizację. Kontekst będzie podany w określonej godzinie, w której mam wysyłać codzienne &daty, więc tytuł powinien być opisowy i brzmić prawidłowo podczas mówienia. W tym przykładzie ustaw Tytuł treści na list of upcoming Action Gym classes.
  5. Kliknij Zapisz u góry strony.

C00885cc30e14d68.png

Konfiguracja Dialogflow

Aby utworzyć intencje codziennej aktualizacji subskrypcji, wykonaj te czynności w konsoli Dialogflow:

Poproś użytkownika o subskrypcję

  1. Skonfiguruj nową intencję obsługi użytkownika, który prosi o subskrypcję codziennych aktualizacji. W konsoli Dialogflow kliknij przycisk + obok opcji Intents (Intencje) w panelu nawigacyjnym po lewej stronie, aby utworzyć nową intencję.
  2. Nazwij tę nową intencję Setup Updates.
  3. W sekcji Wyrażenia na potrzeby trenowania dodaj te wyrażenia użytkownika:
  • Send daily reminders
  • Reminder
  • Remind me
  • Updates
  • Upcoming classes
  1. W sekcji Realizacja ustaw opcję Włącz wywołanie webhooka dla tej intencji.
  2. Kliknij Zapisz u góry strony.

5c70faa02151da0.png

Podejmuj decyzję użytkownika

  1. Skonfiguruj nową intencję obsługi odpowiedzi użytkownika na prośbę o subskrypcję codziennych aktualizacji. Aby utworzyć nową intencję, kliknij przycisk + obok opcji Intents (Intencje) w panelu nawigacyjnym po lewej stronie.
  2. Nazwij tę nową intencję Confirm Updates.
  3. W sekcji Zdarzenia dodaj actions_intent_REGISTER_UPDATE. To zdarzenie Dialogflow będzie wywoływane przez użytkownika kończącego codzienną subskrypcję, niezależnie od tego, czy ją aktywował.
  4. W sekcji Realizacja ustaw opcję Włącz wywołanie webhooka dla tej intencji.
  5. Kliknij Zapisz u góry strony.

b871c2bdadac8abc.png

Wdrażanie realizacji

Aby wdrożyć realizację w webhooku, wykonaj te czynności:

Zależności wczytywania

B2F84ff91b0e1396.png W pliku index.js zaktualizuj funkcję require(), by dodać pakiet RegisterUpdate z pakietu actions-on-google. Twoje importy będą wyglądać tak:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
} = require('actions-on-google');

Aktualizowanie elementów z sugestią

B2F84ff91b0e1396.png W pliku index.js dodaj wpis DAILY do listy tytułów elementów propozycji, 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',
};

Dodaj realizację w nowych zamiarach

Gdy użytkownik poinformuje, że chce rozpocząć subskrypcję, rozpocznij codzienny proces aktualizacji, wywołując asystenta RegisterUpdate z intencją docelową aktualizacji (Lista zajęć) i typem (DAILY). Po jego zakończeniu Asystent aktywuje zdarzenie actions_intent_REGISTER_UPDATE z argumentem status, który opisuje, czy subskrypcja się powiodła. Wyświetlać użytkownikowi monity, które zmieniają się w zależności od stanu subskrypcji.

B2F84ff91b0e1396.png 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]));
  }
});

Oferuj alternatywne sugestie dla użytkownika

Odpowiedzi na Listę zajęć będą zawierać na koniec subskrypcję codziennej aktualizacji, ale stanowi to problem. Ta sama odpowiedź zostanie aktywowana, gdy użytkownik kliknie powiadomienie o codziennej aktualizacji, więc i tak zostanie poproszony o zasubskrybowanie aktualizacji dziennych, mimo że właśnie je otrzymali. Jak możesz sprawić, żeby użytkownik nie wiedział, że musi odnowić subskrypcję?

Na szczęście argumenty obiektu conv zawierają informacje o tym, gdzie użytkownik rozpoczął rozmowę. Argumenty conv mogą sprawdzać, czy zawierają sekcję UPDATES, która wskazuje, że użytkownik rozpoczął rozmowę z powiadomienia o codziennej aktualizacji, i odpowiednio zmienić odpowiedź. Za pomocą tego oddziału możesz też zamknąć okno dialogowe bezpośrednio po podaniu listy zajęć, zgodnie z naszymi sprawdzonymi metodami dotyczącymi codziennej aktualizacji.

B2F84ff91b0e1396.png 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]));
  }
});

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 aktualizacji

W terminalu uruchom następujące polecenie, aby wdrożyć zaktualizowany kod webhooka w Firebase:

firebase deploy

Aby przetestować niestandardowe powtórzenie w Symulatorze działań, wykonaj następujące czynności:

  1. W konsoli Actions otwórz Test.
  2. Wpisz Talk to my test app w polu Dane wejściowe i naciśnij Enter.
  3. Wpisz Learn about classes i naciśnij Enter. Twoja odpowiedź w kategorii „Działanie” powinna teraz proponować wysyłanie dziennych przypomnień.
  4. Wpisz Send daily reminders i naciśnij Enter.
  5. Wpisz godzinę, którą chcesz zobaczyć, i naciśnij Enter. Na potrzeby testów spróbuj odpowiedzieć 3–5 minut później niż aktualny czas.

83a15ecac8c71787.png

Na urządzeniu mobilnym w wyznaczonym przez Ciebie czasie powinno się pojawić powiadomienie od Asystenta. Może to potrwać kilka minut. Kliknij powiadomienie. Powinno ono zawierać precyzyjny link do intencji Lista zajęć w Asystencie, który zawiera listę nadchodzących zajęć:

8582482eafc67d5b.png

4. Dodawanie powiadomień push

Możesz też wywoływać interfejs API Actions, aby wysyłać do użytkowników powiadomienia push. W przeciwieństwie do codziennych powiadomień te powiadomienia nie są automatycznie planowane przez Asystenta, więc możesz je wysyłać w dowolnej chwili.

W tym kroku dowiesz się, jak wdrożyć powiadomienia push w akcji, dodając nową intencję Anulowana klasa i wysyłając powiadomienia do użytkowników, którzy powiadomią ich o anulowaniu zajęć. Musisz też skonfigurować te trzy komponenty, których potrzebujesz do wysyłania powiadomień:

  • Konto Actions API – wysyłasz do użytkownika powiadomienia, wysyłając żądanie POST do interfejsu API. Aby skonfigurować ten interfejs, należy skonfigurować konto usługi i dane logowania.
  • Asystent uprawnień – aby móc wysyłać powiadomienia push, musisz mieć uprawnienia dostępu użytkownika. W tym przykładzie użyjemy funkcji biblioteki klienckiej, aby wywołać asystenta uprawnień i zażądać tego identyfikatora.
  • Przechowywanie danych – aby wysyłać powiadomienia push do użytkownika spoza rozmowy, musisz przechowywać identyfikatory użytkowników w dowolnym miejscu. W tym przykładzie skonfigurujesz bazę danych Firestore do przechowywania informacji o każdym użytkowniku.

Po wykonaniu tych czynności do rozmowy zostanie dodane następujące okno dialogowe:

7c9d4b633c547823.png

Jak to wpłynie na zaangażowanie użytkowników?

Użytkownicy smartfonów prawdopodobnie znają powiadomienia push, które zawierają informacje i aktualizacje aplikacji. Powiadomienia push to elastyczny sposób uzyskiwania dostępu do użytkowników na urządzeniach mobilnych poza Asystentem, o ile użytkownicy mają możliwość ich włączenia. Dzięki natychmiastowym powiadomieniom użytkownicy są świadomi, że będą codziennie powiadamiani. Jednak w przypadku powiadomień push użytkownicy nie wiedzą, czy decydują się na otrzymywanie okazjonalnych powiadomień, ponieważ mogą mieć problem z wyświetlaniem ich kilka razy dziennie.

Powiadomienia push mogą być przydatnym narzędziem do interakcji, ale niekoniecznie trzeba je włączać w każdej czynności. Zanim zdecydujesz, czy chcesz dodać powiadomienia push do działania, weź pod uwagę te wskazówki:

  • Zaplanuj przykładowe harmonogramy powiadomień push. Jeśli planujesz wysyłać tylko jedno powiadomienie push dziennie, rozważ używanie codziennych aktualizacji.
  • Upewnij się, że powiadomienia push zawierają przydatne informacje za każdym razem, gdy są odbierane. Powiadomienia mogą też zawierać precyzyjne linki do jednej z Twoich intencji w Akcjach. Upewnij się więc, że są one trafne i przydatne.
  • Wyraźnie poproś użytkownika o zasubskrybowanie powiadomień push. Powinien on wiedzieć, czego się spodziewać przy każdym powiadomieniu push, i wiedzieć, jak często są wysyłane powiadomienia.

Włącz Actions API

  1. Otwórz Google Cloud Console i wybierz z menu nazwę projektu.

d015c1515b99e3db.png

  1. W menu nawigacyjnym (☰) kliknij APIs & Services > Library.
  2. Wyszukaj Actions API i kliknij Enable (Włącz).

6d464f49c88e70b4.png

Tworzenie konta usługi

Interfejs Actions API wymaga uwierzytelniania, więc aby tworzyć żądania, musisz utworzyć konto usługi. Aby utworzyć i zainstalować klucz konta usługi dla interfejsu Actions API, wykonaj te czynności:

  1. W menu nawigacyjnym Google Cloud Console (&) kliknij APIs & Services > Credentials (Interfejsy API i dane logowania).
  2. Kliknij Create credentials > Service account key (Utwórz dane logowania do klucza usługi).
  3. W menu Konto usługi wybierz Nowe konto usługi.
  4. Podaj te informacje:
  • Nazwa konta usługi: service-account
  • Rola: Projekt > Właściciel
  • Identyfikator konta usługi: service-account (zawsze po znaku @<project_id>.iam.gserviceaccount.com)
  • Typ klucza: JSON
  1. Kliknij Utwórz.
  2. Przenieś pobrany plik JSON do katalogu /user-engagement-codelab/start/functions/ projektu.
  3. Zmień nazwę pliku JSON na service-account.json.

d9bd79d35691de3a.png

Włącz Firestore

Aby wysyłać powiadomienia poza wątkiem, musisz mieć możliwość przechowywania identyfikatorów użytkowników, do których można się odwoływać w kodzie powiadomienia. W tym przykładzie używamy bazy danych Firestore do przechowywania identyfikatorów użytkowników subskrybowanych użytkowników.

Aby utworzyć bazę danych Firestore, wykonaj te czynności:

  1. W konsoli Firebase wybierz nazwę projektu akcji.
  2. W panelu nawigacyjnym po lewej stronie przejdź do menu Programowanie > Baza danych i kliknij Utwórz bazę danych.
  3. Wybierz Uruchom w trybie testowym.
  4. Kliknij Enable (Włącz).

6dfc386413954caa.png

Konfiguracja Dialogflow

Aby utworzyć proces włączania powiadomień push, wykonaj te czynności w konsoli Dialogflow:

Poproś użytkownika o subskrypcję

  1. Skonfiguruj nową intencję obsługi użytkownika, który chce zasubskrybować powiadomienia push o anulowanych zajęciach. W konsoli Dialogflow kliknij przycisk + obok opcji Intents (Intencje) w panelu nawigacyjnym po lewej stronie, aby utworzyć nową intencję.
  2. Nazwij tę nową intencję Setup Push Notifications.
  3. W sekcji Wyrażenia na potrzeby trenowania dodaj te wyrażenia użytkownika:
  • Subscribe to notifications
  • Send notification
  • Notify me
  • Send class notifications
  • Cancelled notifications
  1. W sekcji Realizacja ustaw opcję Włącz wywołanie webhooka dla tej intencji.
  2. Kliknij Zapisz u góry strony.

3D99bc41d0492552

Podejmuj decyzję użytkownika

  1. Skonfiguruj nową intencję obsługi odpowiedzi użytkownika na prośbę o subskrypcję powiadomień push. Aby utworzyć nową intencję, kliknij przycisk + obok opcji Intents (Intencje) w panelu nawigacyjnym po lewej stronie.
  2. Nazwij tę nową intencję Confirm Push Notifications.
  3. W sekcji Zdarzenia dodaj actions_intent_PERMISSION. To zdarzenie Dialogflow zostanie wywołane przez użytkownika, który zakończy subskrypcję powiadomień push, niezależnie od tego, czy zakończył subskrypcję.
  4. W sekcji Realizacja ustaw opcję Włącz wywołanie webhooka dla tej intencji.
  5. Kliknij Zapisz u góry strony.

D37f550c5e07cb73.png

Obsługa powiadomień push

Możesz łączyć powiadomienia push z konkretną intencją, aby użytkownicy, którzy kliknęli powiadomienie push, mieli precyzyjne linki do tej intencji w akcji. W tym przykładzie dodaj nową intencję powiadomień push, która zawiera szczegółowe informacje o anulowanych zajęciach.

Aby dodać intencję wywoływaną przez użytkownika, który kliknie powiadomienie push, wykonaj te czynności:

  1. W konsoli Dialogflow kliknij przycisk + obok opcji Intents (Intencje) w panelu nawigacyjnym po lewej stronie, aby utworzyć nową intencję.
  2. Nazwij tę nową intencję Class Canceled.
  3. W sekcji Training phrases (Wyrażenia na potrzeby trenowania) dodaj Cancelations jako wyrażenie użytkownika.
  4. W sekcji Realizacja ustaw opcję Włącz wywołanie webhooka dla tej intencji.
  5. Kliknij Zapisz u góry strony.

940379556f559631.png

Wysyłanie powiadomień testowych w trakcie rozmowy

W wersji produkcyjnej powinien być tworzony skrypt niezależny 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 wysyłać powiadomienia push podczas rozmowy z akcją. Intencja służy tylko do debugowania. W praktyce powiadomienia push nie powinny być obsługiwane przez realizację lub w inny sposób uruchamiane w ramach rozmowy dotyczącej akcji.

Aby utworzyć intencję testowania powiadomień push, wykonaj te czynności:

  1. Na potrzeby testów i debugowania skonfiguruj nową intencję, która pozwala wysyłać powiadomienia push do subskrybentów. W konsoli Dialogflow kliknij przycisk + obok opcji Intents (Intencje) w panelu nawigacyjnym po lewej stronie, aby utworzyć nową intencję.
  2. Nazwij tę nową intencję Test Notification.
  3. W sekcji Training phrases (Wyrażenia na potrzeby trenowania) dodaj Test notification jako wyrażenie użytkownika.
  4. W sekcji Realizacja ustaw opcję Włącz wywołanie webhooka dla tej intencji.
  5. Kliknij Zapisz u góry strony.

6967f5a997643eb8.png

Włącz powiadomienia push

Aby włączyć powiadomienia push dla intencji Klasa anulowana:

  1. W konsoli Dialogflow otwórz Integrations (Integracje) na pasku nawigacyjnym.
  2. Na karcie Asystent Google kliknij Ustawienia integracji.
  3. Dodaj Klasa anulowana jako intencję dowolnego wywołania. Jest to konieczne, aby Dialogflow wiedziało, że użytkownik może rozpocząć rozmowę z intencją Anulowanej klasy (klikając powiadomienie push).
  4. Kliknij Zamknij.

1ac725231ed279a1.png

  1. W konsoli działań kliknij kartę Programowanie i wybierz Działania na pasku nawigacyjnym po lewej stronie.
  2. Na liście Działania kliknij Anulowano zajęcia.
  3. W sekcji Zaangażowanie użytkownika ustaw opcję Czy chcesz wysyłać powiadomienia push?.
  4. Ustaw opisowy Tytuł treści opisujący powiadomienie push. Kontekst zmieni się w to, czy mogę wysyłać powiadomienia push na podstawie tekstu. Dzięki temu tytuł powinien być opisowy i brzmić prawidłowo podczas mówienia. W tym przykładzie ustaw Tytuł treści na class cancelations.
  5. Kliknij Zapisz u góry strony.

4304c7cd575f6de3.png

Wdrażanie realizacji

Aby wdrożyć realizację w webhooku, wykonaj te czynności:

Zależności wczytywania

B2F84ff91b0e1396.png W pliku index.js zaktualizuj funkcję require(), by dodać pakiet UpdatePermission z pakietu actions-on-google. Twoje importy będą wyglądać tak:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
  UpdatePermission,
} = require('actions-on-google');

Aktualizowanie elementów z sugestią

B2F84ff91b0e1396.png W pliku index.js dodaj wpis NOTIFICATIONS do listy tytułów elementów propozycji, 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 dodaj stałe wartości pól przechowywanych w bazie danych. Zaimportuj też pakiety google-auth-library i request, aby obsługiwać uwierzytelnianie i żądania w interfejsie Actions API.

B2F84ff91b0e1396.png W pliku index.js dodaj do importów 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');

Oferta konfigurowania powiadomień o anulowaniu zajęć

B2F84ff91b0e1396.png 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]));
    };
  };
});

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]));
    };
  };
});

Dodaj realizację w nowych zamiarach

Gdy użytkownik wyrazi zgodę na otrzymywanie powiadomień push, wywołaj pomoc Asystenta UpdatePermission, aby poprosić o przyznanie uprawnień. Jeśli ten argument się powiedzie, argument PERMISSION zostanie dodany do argumentów obiektu conv, których zaznaczenie możesz zmienić.

Gdy uzyskasz uprawnienia użytkownika, pobierz identyfikator użytkownika z argumentów obiektu conv i zapisz go w swojej bazie danych. Później wyślesz ten identyfikator użytkownika do interfejsu Actions API, aby Asystent mógł określić, kto otrzyma powiadomienie.

Na koniec dodaj realizację w intencji Class Canceled, która została wywołana przez kliknięcie powiadomienia push. W tym przykładzie Twoja odpowiedź jest ciągiem zastępczym, ale w gotowej do działania wersji tej akcji skrypt powiadomień będzie zawierał bardziej dynamiczne informacje o zapisanych zajęciach.

B2F84ff91b0e1396.png 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ć do użytkownika powiadomienie push, wyślij żądanie POST do interfejsu Actions API z identyfikatorem użytkownika, tytułem powiadomienia i intencją docelową. W tym przykładzie aktywacja intencji Powiadomienie testowe jest powtarzana w bazie danych Firestore i wysyła powiadomienia push do każdego użytkownika, który subskrybuje powiadomienia.

Pamiętaj, że w tym przykładzie ten kod zawiera kod, który wysyła powiadomienie push w ramach realizacji webhooka, i wywołuje go, wywołując intencję testową w rozmowie. W działaniach, które chcesz opublikować, kod powiadomienia push powinien znajdować się w skrypcie innym niż realizacja.

B2F84ff91b0e1396.png 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

W terminalu uruchom następujące polecenie, aby wdrożyć zaktualizowany kod webhooka w Firebase:

firebase deploy

Aby przetestować powiadomienia w Symulatorze działań, wykonaj te czynności:

  1. W konsoli Actions otwórz kartę Test.
  2. Wpisz Talk to my test app w polu Dane wejściowe i naciśnij Enter.
  3. Wpisz Learn about classes i naciśnij Enter.
  4. Wpisz Get notifications i naciśnij Enter.
  5. Jeśli Akcja nie ma jeszcze uprawnień do wysyłania Ci powiadomień push, wpisz yes i naciśnij Enter.
  6. Wpisz yes i naciśnij Enter. Na Twoim koncie Google powinny być włączone powiadomienia push związane z tym działaniem.

3a8704bdc0bcbb17.png

  1. Wpisz no i naciśnij Enter, aby wyjść.
  2. Aby rozpocząć nową rozmowę, wpisz Talk to my test app i naciśnij Enter.
  3. Wpisz Test notification i naciśnij Enter.

634dfcb0be8dfdec.png

W ciągu kilku minut otrzymasz powiadomienie „Testuj z Aplikacji Gimnazjum” oraz powiadomienie push na urządzeniu mobilnym. Kliknięcie tego powiadomienia spowoduje przejście do intencji Zajęcia anulowane.

33cbde513c10122e.png

5. Utwórz połączenie z Asystentem

Jak dotąd omówiliśmy funkcje związane z zaangażowaniem, które możesz zaimplementować, aby użytkownicy wracali do akcji, ale ich głównym celem jest pozyskiwanie użytkowników i wykorzystywanie ich.

Możesz utworzyć link Asystenta, który połączy użytkowników urządzeń mobilnych bezpośrednio z akcją Asystenta. Link w Asystencie to standardowy hiperlink, więc możesz dodać go do witryny lub dowolnych innych materiałów marketingowych, np. bloga lub posta w mediach społecznościowych.

W tym kroku dowiesz się, czym jest link Asystenta, jak utworzyć go z powitaniem akcji i jak dodać go do prostej witryny do testowania.

Jak to wpłynie na zaangażowanie użytkowników?

Pierwsze użycie akcji do działania może być trudne, zwłaszcza jeśli musi wywołać wezwanie do działania w Asystencie. Uprość to, podając użytkownikom bezpośredni link do akcji. Gdy użytkownik kliknie link do Asystenta na urządzeniu z Asystentem, zostanie przekierowany bezpośrednio do jego akcji. Gdy użytkownik otworzy link na urządzeniu mobilnym lub innym, które nie obsługuje Asystenta, i tak zostanie przekierowany do Twojej katalogu działań (jeśli została opublikowana), więc link może nadal oferować tę akcję tym użytkownikom.

Linki do Asystenta mogą być przydatne, dlatego warto utworzyć je, jeśli chcesz reklamować działania w swojej witrynie lub mediach społecznościowych. Zanim utworzysz i udostępnisz link do Asystenta, pamiętaj o tych wskazówkach:

  • Linki Asystenta działają dopiero po opublikowaniu akcji. Gdy projekt jest w wersji roboczej, link działa tylko na Twoich urządzeniach. Inni użytkownicy zostaną przekierowani na stronę błędu 404 w katalogu Actions.
  • Możesz zezwolić użytkownikom na testowanie linku Asystenta przed opublikowaniem, udostępniając działanie w środowisku alfa lub beta. Pamiętaj, że tylko użytkownicy, którzy będą korzystać z wersji alfa lub beta, będą mogli przetestować link do Asystenta.
  • Zadbaj o to, by miejsce docelowe linku w Asystencie wywarło dobre pierwsze wrażenie na nowych użytkownikach. Intencja powitalna to domyślne miejsce docelowe linku Asystenta, ponieważ powinno ono już dobrze służyć do przedstawiania działania

Aby utworzyć link Asystenta do intencji powitalnej, wykonaj te czynności:

  1. W konsoli działań kliknij kartę Programowanie i wybierz Działania na pasku nawigacyjnym po lewej stronie.
  2. Na liście Działania kliknij actions.intent.MAIN.
  3. W sekcji Linki włącz opcję Czy chcesz włączyć adres URL dla tej czynności?.
  4. Ustaw opisowy tytuł linku, który opisuje działanie. Tytuł powinien być prostą parą czasownikową, która opisuje to, co użytkownik może zrobić przy użyciu akcji. W tym przykładzie ustaw Tytuł połączenia na learn about Action Gym.
  5. Skopiuj fragment kodu HTML z dołu strony i zapisz go na później.
  6. Kliknij Zapisz u góry strony.

55341b8102b71eab.png

Wdrażanie witryny testowej

Aby przetestować połączenie z Asystentem, możesz skorzystać z narzędzi Firebase, aby wdrożyć witrynę testową razem z usługą realizacji. Utworzyliśmy już prostą stronę testową na potrzeby tego przykładu – wystarczy tylko dodać link do Asystenta.

Przejdź do katalogu /user-engagement-codelab-nodejs/start/public/ realizacji i otwórz plik index.html w edytorze tekstu.

B2F84ff91b0e1396.png W pliku index.html wklej fragment kodu HTML Asystenta do elementu „body”. Plik powinien wyglądać tak:

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>

W terminalu uruchom następujące polecenie, aby wdrożyć witrynę testową w Firebase:

firebase deploy

Po uruchomieniu polecenia wdrożenia zwróć uwagę na URL hosta w danych wyjściowych.

b01e8d322fb5d623.png

Otwórz ten adres w przeglądarce mobilnej i powinien być widoczny link do Asystenta w witrynie testowej. Gdy klikniesz ten link na urządzeniu mobilnym, przekierujemy Cię do strony powitalnej Akcji w Asystencie.

599845d647f5b624.png

Możesz też otworzyć URL hosta w przeglądarce na komputerze. Powinno nastąpić przekierowanie do strony 404 w katalogu Asystenta, ponieważ akcja nie została 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ć do niej poszczególne funkcje.

Dodatkowe materiały szkoleniowe

Zapoznaj się z tymi zasobami, aby dowiedzieć się więcej o zaangażowaniu użytkowników w działania:

Obserwuj nas na Twitterze (@ActionsOnGoogle), aby być na bieżąco z nowościami, i publikuj tweeta w serwisie #AoGDevs oraz dziel się swoimi spostrzeżeniami.

Ankieta dotycząca opinii

Na koniec wypełnij ten formularz, aby poinformować nas, jak nam idzie.