Przeglądaj w Dialogflow
Kliknij Dalej, aby zaimportować próbkę zapisanych danych w Dialogflow. Następnie wykonaj poniższe czynności, aby wdrożyć i przetestować przykład:
- Wpisz nazwę agenta i utwórz nowego agenta Dialogflow na potrzeby przykładu.
- Po zakończeniu importowania agenta kliknij Otwórz agenta.
- W głównym menu nawigacyjnym kliknij Fulfillment (Realizacja).
- Włącz Edytor wbudowany, a potem kliknij Wdróż. Edytor zawiera przykładowy kod.
- W głównym menu nawigacyjnym kliknij Integracje, a następnie Asystent Google.
- W wyświetlonym oknie modalnym włącz Automatyczny podgląd zmian i kliknij Przetestuj, aby otworzyć symulator Actions.
- W symulatorze wpisz
Talk to my test app
, aby przetestować próbkę.
Jedną z korzyści zapewnianych użytkownikom jest często możliwość zapisywania danych między kolejnymi etapami rozmowy lub podczas wielu rozmów z użytkownikiem. Jest to przydatne, gdy przekazujesz pomocne powtórzenia w jednej rozmowie, zapisujesz wyniki gry w różnych sesjach lub zapamiętujesz drobne informacje dla użytkownika.
Wymagania różnią się nieznacznie w zależności od tego, czy chcesz zapisywać dane w rozmowie, czy w poszczególnych rozmowach. Aby zapisać dane w rozmowie, możesz użyć pola conversationToken
obiektu AppResponse
.
Aby zapisać dane w rozmowach, wykonaj te czynności:
- Ustal, czy użytkownik jest zweryfikowany czy gość.
- Przechowuj dane użytkownika lub uzyskują do nich dostęp w polu
userStorage
obiektuAppResponse
.
Zapisywanie danych między kolejnymi etapami rozmowy
Pole conversationToken
to ciąg znaków zawierający nieprzejrzysty token, który jest recyrkulowany w akcji przy każdym zakręcie rozmowy. Jeśli na przykład ustawisz wartość "count=1"
dla pierwszego etapu rozmowy w AppResponse
, to pole AppRequest
otrzymane przez akcję w drugim kroku rozmowy będzie zawierać w conversationToken
wartość "count=1"
.
Token jest zawsze inicjowany na początku rozmowy jako pusty ciąg. Jeśli używasz biblioteki klienta Actions on Google w środowisku Node.js, możesz połączyć się z tokenem rozmowy jako obiektem JSON za pomocą metody conv.data
, gdzie conv
to Twoje wystąpienie instancji Conversation
.
Z przykładu poniżej dowiesz się, jak zapisać licznik w polu conversationToken
interfejsu AppResponse
:
Node.js
conv.data.firstNum = firstNum; conv.ask(`Got it, the first number is ${firstNum}.`); conv.ask(`What's the second number?`);
Java
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.getConversationData().put("firstNum", firstNum); responseBuilder.add("Got it, the first number is " + firstNum + "."); responseBuilder.add("What's the second number?"); return responseBuilder.build();
JSON
Uwaga: poniższy kod JSON opisuje odpowiedź webhooka, która używa outputContexts
zamiast conversationToken
.
{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Got it, the first number is 23." } }, { "simpleResponse": { "textToSpeech": "What's the second number?" } } ] } } }, "outputContexts": [ { "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google", "lifespanCount": 99, "parameters": { "data": "{\"firstNum\":23}" } } ] }
JSON
Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.TEXT" } ], "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "Got it, the first number is 23." } }, { "simpleResponse": { "textToSpeech": "What's the second number?" } } ] } } } ], "conversationToken": "{\"data\":{\"firstNum\":23}}" }
Praktyczny przykład zastosowania znajdziesz w naszym przewodniku ze sprawdzonymi metodami publikowania pomocnych wniosków i powodów niepowodzeń.
Zapisywanie danych w rozmowach
Pole userStorage
obiektu AppResponse
to ciąg znaków zawierający nieprzejrzysty token dostarczony przez akcję, który jest zapisany w rozmowach konkretnego użytkownika. Na przykład gra może zapisać najwyższy wynik użytkownika w zasadzie userStorage
i wykorzystać tę wartość w wiadomości powitalnej za każdym razem, gdy użytkownik rozpoczyna nową rozmowę.
Określanie stanu weryfikacji użytkownika i obsługa go
Stan weryfikacji użytkownika może mieć wartość GUEST
lub VERIFIED
. Na początku każdej rozmowy Actions on Google określa stan weryfikacji użytkownika na podstawie różnych wskaźników rozpoczęcia rozmowy. Przykład: użytkownik zalogowany w Asystencie Google na urządzeniu mobilnym ma stan weryfikacji VERIFIED
.
Stan weryfikacji użytkownika GUEST
może mieć jedną z tych przyczyn:
- użytkownik wyłączył funkcję Twoje wyniki;
- użytkownik wyłączył Aktywność w internecie i aplikacjach. Pamiętaj, że niektórzy użytkownicy mogą mieć wyłączone to ustawienie na poziomie domeny.
- Jeśli na urządzeniu jest włączona funkcja Voice Match, a dopasowanie nie powiedzie się lub użytkownik wywoła Asystenta bez użycia głosu (np. przytrzymanie urządzenia Google Home).
- Użytkownik nie jest zalogowany.
Zawsze sprawdzaj stan weryfikacji użytkownika przed zapisaniem danych w usłudze userStorage
lub rozpoczęciem procesu łączenia kont, aby uniemożliwić gościom interakcję z funkcją, która dla nich nie powiedzie się.
Jeśli używasz biblioteki klienta Actions On Google dla Node.js, możesz używać pamięci użytkownika w postaci obiektu JSON, używając conv.user.storage
, gdzie conv
to wystąpienie Conversation
. Z tego przykładu dowiesz się, jak zapisać licznik w polu userStorage
w AppResponse
:
Node.js
app.intent('Save Sum', (conv) => { if (conv.user.verification === 'VERIFIED') { conv.user.storage.sum = conv.data.sum; conv.close(`Alright, I'll store that for next time. See you then.`); } else { conv.close(`I can't save that right now, but we can add ` + `new numbers next time!`); } });
Java
@ForIntent("Save Sum") public ActionResponse saveSum(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); Integer sum = ((Double) request.getConversationData().get("sum")).intValue(); String verificationStatus = request.getUser().getUserVerificationStatus(); if (verificationStatus.equals("VERIFIED")) { responseBuilder.getUserStorage().put("sum", sum); responseBuilder.add("Alright, I'll store that for next time. See you then."); } else { responseBuilder.add("I can't save that right now, but we can add new numbers next time!"); } responseBuilder.endConversation(); return responseBuilder.build(); }
Node.js
if (conv.user.verification === 'VERIFIED') { conv.user.storage.sum = conv.data.sum; conv.close(`Alright, I'll store that for next time. See you then.`); } else { conv.close(`I can't save that right now, but we can add ` + `new numbers next time!`); }
Java
ResponseBuilder responseBuilder = getResponseBuilder(request); Integer sum = ((Double) request.getConversationData().get("sum")).intValue(); String verificationStatus = request.getUser().getUserVerificationStatus(); if (verificationStatus.equals("VERIFIED")) { responseBuilder.getUserStorage().put("sum", sum); responseBuilder.add("Alright, I'll store that for next time. See you then."); } else { responseBuilder.add("I can't save that right now, but we can add new numbers next time!"); } responseBuilder.endConversation(); return responseBuilder.build();
JSON
Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I'll store that for next time. See you then." } } ] }, "userStorage": "{\"data\":{\"sum\":68}}" } } }
JSON
Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I'll store that for next time. See you then." } } ] } }, "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}", "userStorage": "{\"data\":{\"sum\":68}}" }
Praktyczny przykład zastosowania znajdziesz w artykule na temat personalizacji rozmowy na podstawie preferencji użytkownika w poradniku ze sprawdzonymi metodami.
Uwaga prawna: uzyskiwanie zgody przed uzyskaniem dostępu do usługi userStorage
.
W niektórych krajach deweloperzy muszą uzyskać zgodę użytkownika, zanim uzyskają dostęp do określonych informacji (np. danych osobowych) lub zapiszą je w usłudze userStorage
. Jeśli prowadzisz działalność w jednym z tych krajów i chcesz uzyskać dostęp do tych informacji lub zapisać je w usłudze userStorage
, musisz skorzystać z Asystenta do potwierdzania danych, aby poprosić użytkownika o zgodę i uzyskać jego zgodę, zanim zaczniesz przechowywać takie informacje w usłudze userStorage
.
Wygaśnięcie miejsca na dane użytkownika
Gdy Asystent może dopasować tożsamość do użytkownika, zawartość userStorage
nigdy nie wygasa i tylko użytkownik lub sama akcja może ją usunąć.
Gdy Asystent nie może dopasować tożsamości do użytkownika, treść usługi userStorage
jest czyszczona po zakończeniu rozmowy. Oto kilka przykładów sytuacji, w których Asystent nie może dopasować tożsamości do użytkownika:
- Skonfigurowano Voice Match i nie znaleziono dopasowania.
- użytkownik wyłączył dane osobowe;
Wyczyść zawartość pola userStorage
Aby wyczyścić zawartość pola userStorage
Akcja, ustaw w polu resetUserStorage
wartość „true” (prawda).AppResponse
Jeśli ustawisz wartość userStorage
na pusty ciąg znaków, wartość userStorage
pozostanie niezmieniona w następnym kroku wątku. Pozwoli Ci to uniknąć odsyłania całego userStorage
w sytuacjach, gdy jego treść się nie zmieniła.
Jeśli używasz biblioteki klienta Actions On Google dla Node.js, możesz ustawić wartość conv.user.storage
na {}
(pusty obiekt).
Node.js
app.intent('Forget Number', (conv) => { conv.user.storage = {}; conv.ask(`Alright, I forgot your last result.`); conv.ask(`Let's add two new numbers. What is the first number?`); });
Java
@ForIntent("Forget Number") public ActionResponse forgetNumber(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.getUserStorage().clear(); responseBuilder.add("Alright, I forgot your last result."); responseBuilder.add("Let's add two new numbers. What is the first number?"); return responseBuilder.build(); }
Node.js
conv.user.storage = {}; conv.ask(`Alright, I forgot your last result.`); conv.ask(`Let's add two new numbers. What is the first number?`);
Java
ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.getUserStorage().clear(); responseBuilder.add("Alright, I forgot your last result."); responseBuilder.add("Let's add two new numbers. What is the first number?"); return responseBuilder.build();
JSON
Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.
{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I forgot your last result." } }, { "simpleResponse": { "textToSpeech": "Let's add two new numbers. What is the first number?" } } ] }, "userStorage": "{\"data\":{}}" } } }
JSON
Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.
{ "expectUserResponse": true, "expectedInputs": [ { "possibleIntents": [ { "intent": "actions.intent.TEXT" } ], "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "Alright, I forgot your last result." } }, { "simpleResponse": { "textToSpeech": "Let's add two new numbers. What is the first number?" } } ] } } } ], "userStorage": "{\"data\":{}}" }
Jako użytkownik możesz wyświetlić zawartość pola userStorage
w wywołanej akcji. Możesz też usunąć z niej przechowywane dane użytkownika, wyłączając opcję zapamiętywania Cię przez usługę.
- Otwórz aplikację Asystent na telefonie.
- Kliknij ikonę panelu.
- Na karcie Odkrywaj znajdź działanie, dla którego chcesz wyświetlić lub wyczyścić miejsce na dane użytkownika, i kliknij je, aby otworzyć stronę z informacjami.
- Przewiń stronę w dół.
- Aby wyświetlić zawartość pola
userStorage
, kliknij [Wyświetl zapisane dane]. - Aby usunąć przechowywane dane użytkownika, kliknij Wyłącz zapamiętywanie mnie przez użytkownika $action.
- Aby wyświetlić zawartość pola