이 라이브러리는Dialogflow/dialogflow-fulfillment-nodejs에서 영감을 받았습니다.
v1 및 v2 에이전트에 대한 Dialogflow의 처리 웹훅 JSON 요청 및 응답을 지원합니다.
전체 수업 참조는 문서를 참조하세요.
작곡가를 통해 설치: composer require eristemena/dialogflow-fulfillment-webhook-php
.
에이전트를 시작하려면 입력 매개변수가 Dialogflow에서 오는 요청 배열인 DialogflowWebhookClient
생성자를 사용합니다.
바닐라 PHP에서는 다음과 같이 수행할 수 있습니다.
use Dialogflow WebhookClient ;
$ agent = new WebhookClient ( json_decode ( file_get_contents ( ' php://input ' ), true ));
// or
$ agent = WebhookClient :: fromData ( $ _POST );
또는 Laravel을 사용하는 경우
$ agent = Dialogflow WebhookClient :: fromData ( $ request -> json ()-> all ());
$ intent = $ agent -> getIntent ();
$ action = $ agent -> getAction ();
$ query = $ agent -> getQuery ();
$ parameters = $ agent -> getParameters ();
$ session = $ agent -> getSession ();
$ contexts = $ agent -> getContexts ();
$ language = $ agent -> getLocale ();
google
, facebook
, slack
등) $ originalRequest = $ agent -> getRequestSource ();
$ originalRequest = $ agent -> getOriginalRequest ();
$ agentVersion = $ agent -> getAgentVersion ();
답장을 보내려면 reply()
메소드를 사용하십시오.
$ agent -> reply ( ' Hi, how can I help? ' );
그런 다음 render()
사용하여 배열로 응답을 얻습니다. 당신이 해야 할 일은 배열을 JSON으로 인쇄하는 것뿐입니다.
header ( ' Content-type: application/json ' );
echo json_encode ( $ agent -> render ());
또는 라라벨에서는
return response ()-> json ( $ agent -> render ());
응답 페이로드는 요청의 에이전트 버전에 따라 자동으로 형식이 지정됩니다.
$ text = Dialogflow RichMessage Text :: create ()
-> text ( ' This is text ' )
-> ssml ( ' <speak>This is <say-as interpret-as="characters">ssml</say-as></speak> ' )
;
$ agent -> reply ( $ text );
$ image = Dialogflow RichMessage Image :: create ( ' https://www.example.com/image.png ' );
$ agent -> reply ( $ image );
$ card = Dialogflow RichMessage Card :: create ()
-> title ( ' This is title ' )
-> text ( ' this is text body ' )
-> image ( ' https://www.example.com/image.png ' )
-> button ( ' This is a button ' , ' https://docs.dialogflow.com/ ' )
;
$ agent -> reply ( $ card );
$ suggestion = Dialogflow RichMessage Suggestion :: create ([ ' Suggestion one ' , ' Suggestion two ' ]);
$ agent -> reply ( $ suggestion );
if ( $ agent -> getRequestSource ()== ' google ' ) {
$ agent -> reply ( Dialogflow RichMessage Payload :: create ([
' expectUserResponse ' => false
]));
}
이 라이브러리는 Actions on Google 특정 기능도 지원합니다. 아직 개발 중이므로 앞으로 더 많은 기능이 추가될 예정입니다.
Google Dialogflow 대화 개체에서 작업을 사용하려면 먼저 requestSource
가 Google 어시스턴트에서 오는지 확인해야 합니다.
if ( $ agent -> getRequestSource ()== ' google ' ) {
$ conv = $ agent -> getActionConversation ();
// here you can use the rest of Actions on Google responses and helpers
$ agent -> reply ( $ conv );
}
또는 getActionConversation()
메서드를 호출하면 Google 어시스턴트에서 요청이 오지 않으면 null
반환됩니다.
$ conv = $ agent -> getActionConversation ();
if ( $ conv ) {
// here you can use the rest of Actions on Google responses and helpers
} else {
// the request does not come from Google Assistant
}
Dialogflow Conversation 개체를 사용하면 두 가지 방법으로 답장을 보낼 수 있습니다.
$ conv -> close ( ' Have a nice day! ' );
$ conv -> ask ( ' Hi, how can I help? ' );
여기에서 설명서를 참조하세요.
use Dialogflow Action Responses SimpleResponse ;
$ conv -> ask ( SimpleResponse :: create ()
-> displayText ( ' Hello, how can i help? ' )
-> ssml ( ' <speak>Hello,<break time="0.5s"/> <prosody rate="slow">how can i help?</prosody></speak> ' )
);
use Dialogflow Action Responses Image ;
$ conv -> close ( Image :: create ( ' https://picsum.photos/400/300 ' ));
여기에서 설명서를 참조하세요.
use Dialogflow Action Responses BasicCard ;
$ conv -> close ( BasicCard :: create ()
-> title ( ' This is a title ' )
-> formattedText ( ' This is a subtitle ' )
-> image ( ' https://picsum.photos/400/300 ' )
-> button ( ' This is a button ' , ' https://docs.dialogflow.com/ ' )
);
여기에서 설명서를 참조하세요.
단일 선택 목록은 사용자에게 여러 항목의 수직 목록을 제공하고 사용자가 단일 항목을 선택할 수 있도록 합니다. 목록에서 항목을 선택하면 목록 항목의 제목이 포함된 사용자 쿼리(말풍선)가 생성됩니다.
use Dialogflow Action Questions ListCard ;
use Dialogflow Action Questions ListCard Option ;
$ conv -> ask ( ' Please choose below ' );
$ conv -> ask ( ListCard :: create ()
-> title ( ' This is a title ' )
-> addOption ( Option :: create ()
-> key ( ' OPTION_1 ' )
-> title ( ' Option 1 ' )
-> synonyms ([ ' option one ' , ' one ' ])
-> description ( ' Select option 1 ' )
-> image ( ' https://picsum.photos/48/48 ' )
)
-> addOption ( Option :: create ()
-> key ( ' OPTION_2 ' )
-> title ( ' Option 2 ' )
-> synonyms ([ ' option two ' , ' two ' ])
-> description ( ' Select option 2 ' )
-> image ( ' https://picsum.photos/48/48 ' )
)
);
사용자가 선택한 옵션을 캡처하려면 actions_intent_OPTION
이벤트를 사용하여 Dialogflow 인텐트를 만듭니다. 의도 이름을 Get Option
으로 지정한다고 가정하면 다음과 같이 인수를 얻을 수 있습니다.
if ( ' Get Option ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ option = $ conv -> getArguments ()-> get ( ' OPTION ' );
switch ( $ option ) {
case ' OPTION_1 ' :
$ conv -> close ( ' You choose option 1 ' );
break ;
case ' OPTION_2 ' :
$ conv -> close ( ' You choose option 2 ' );
break ;
default :
$ conv -> close ( ' Sorry, i do not understand ' );
break ;
}
}
여기에서 설명서를 참조하세요.
캐러셀은 가로로 스크롤되며 하나의 항목을 선택할 수 있습니다. 목록 선택기에 비해 타일이 커서 더 풍부한 콘텐츠를 허용합니다. 캐러셀을 구성하는 타일은 이미지가 포함된 기본 카드와 유사합니다. 캐러셀에서 항목을 선택하면 목록 선택기와 마찬가지로 응답으로 채팅 풍선이 생성됩니다.
use Dialogflow Action Questions Carousel ;
use Dialogflow Action Questions Carousel Option ;
$ conv -> ask ( ' Please choose below ' );
$ conv -> ask (
Carousel :: create ()
-> Option (
Option :: create ()
-> key ( ' OPTION_1 ' )
-> title ( ' Option 1 ' )
-> synonyms ([ ' option one ' , ' one ' ])
-> description ( ' Select option 1 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> Option (
Option :: create ()
-> key ( ' OPTION_2 ' )
-> title ( ' Option 2 ' )
-> synonyms ([ ' option two ' , ' two ' ])
-> description ( ' Select option 2 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> Option (
Option :: create ()
-> key ( ' OPTION_3 ' )
-> title ( ' Option 3 ' )
-> synonyms ([ ' option three ' , ' three ' ])
-> description ( ' Select option 3 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> Option (
Option :: create ()
-> key ( ' OPTION_4 ' )
-> title ( ' Option 4 ' )
-> synonyms ([ ' option four ' , ' four ' ])
-> description ( ' Select option 4 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
);
사용자가 정보를 부여했는지 확인한 다음 데이터에 액세스하려면 actions_intent_OPTION
이벤트를 사용하여 Dialogflow 인텐트를 만듭니다. 의도 이름을 Get Option
으로 지정한다고 가정하면 다음과 같이 인수를 얻을 수 있습니다.
if ( ' Get Option ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ option = $ conv -> getArguments ()-> get ( ' OPTION ' );
switch ( $ option ) {
case ' OPTION_1 ' :
$ conv -> close ( ' You choose option 1 ' );
break ;
case ' OPTION_2 ' :
$ conv -> close ( ' You choose option 2 ' );
break ;
case ' OPTION_3 ' :
$ conv -> close ( ' You choose option 3 ' );
break ;
case ' OPTION_4 ' :
$ conv -> close ( ' You choose option 4 ' );
break ;
default :
$ conv -> close ( ' Sorry, i do not understand ' );
break ;
}
}
여기에서 설명서를 참조하세요.
탐색 캐러셀은 수평으로 스크롤하고 사용자가 타일을 선택할 수 있도록 하는 캐러셀 응답과 유사한 풍부한 응답입니다. 탐색 캐러셀은 웹 브라우저(또는 모든 타일이 AMP 지원인 경우 AMP 브라우저)에서 선택한 타일을 열어 웹 콘텐츠용으로 특별히 설계되었습니다. 탐색 캐러셀은 나중에 탐색할 수 있도록 사용자의 어시스턴트 화면에도 유지됩니다.
use Dialogflow Action Responses BrowseCarousel ;
use Dialogflow Action Responses BrowseCarousel Option ;
$ conv -> ask ( ' Please choose below ' );
$ conv -> ask (
BrowseCarousel :: create ()
-> imageDisplayOptions ( ' CROPPED ' )
-> addOption (
Option :: create ()
-> title ( ' Title of item 1 ' )
-> description ( ' Description of item 1 ' )
-> footer ( ' Item 1 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> addOption (
Option :: create ()
-> title ( ' Title of item 2 ' )
-> description ( ' Description of item 2 ' )
-> footer ( ' Item 2 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> addOption (
Option :: create ()
-> title ( ' Title of item 3 ' )
-> description ( ' Description of item 3 ' )
-> footer ( ' Item 3 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> addOption (
Option :: create ()
-> title ( ' Title of item 4 ' )
-> description ( ' Description of item 4 ' )
-> footer ( ' Item 4 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
);
캐러셀이 브라우저 핸드오프를 처리하므로 캐러셀 항목 찾아보기와의 사용자 상호 작용에는 후속 처리가 필요하지 않습니다.
여기에서 설명서를 참조하세요.
use Dialogflow Action Responses LinkOutSuggestion ;
use Dialogflow Action Responses Suggestions ;
$ conv -> ask ( ' Please choose ' );
$ conv -> ask ( new Suggestions ([ ' Suggestion 1 ' , ' Suggestion 2 ' ]));
$ conv -> ask ( new Suggestions ( ' Suggestion 3 ' ));
$ conv -> ask ( new LinkOutSuggestion ( ' Website ' , ' http://www.example.com ' ));
여기에서 설명서를 참조하세요.
미디어 응답을 사용하면 작업이 SSML의 120초 제한보다 긴 재생 시간으로 오디오 콘텐츠를 재생할 수 있습니다. 미디어 응답의 주요 구성 요소는 단일 트랙 카드입니다.
use Dialogflow Action Responses MediaObject ;
use Dialogflow Action Responses MediaResponse ;
use Dialogflow Action Responses Suggestions ;
$ conv -> ask ( ' Here you go ' );
$ conv -> ask (
new MediaResponse (
MediaObject :: create ( ' http://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3 ' )
-> name ( ' Jazz in Paris ' )
-> description ( ' A funky Jazz tune ' )
-> icon ( ' http://storage.googleapis.com/automotive-media/album_art.jpg ' )
-> image ( ' http://storage.googleapis.com/automotive-media/album_art.jpg ' )
)
);
$ conv -> ask ( new Suggestions ([ ' Pause ' , ' Stop ' , ' Start over ' ]));
여기에서 설명서를 참조하세요.
use Dialogflow Action Questions Permission ;
$ conv -> ask ( Permission :: create ( ' To address you by name and know your location ' , [ ' NAME ' , ' DEVICE_PRECISE_LOCATION ' ]));
사용자가 정보를 부여했는지 확인한 다음 데이터에 액세스하려면 actions_intent_PERMISSION
이벤트를 사용하여 Dialogflow 인텐트를 만듭니다. 의도 이름을 Get Permission
으로 지정한다고 가정하면 다음과 같은 정보를 얻을 수 있습니다.
if ( ' Get Permission ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ approved = $ conv -> getArguments ()-> get ( ' PERMISSION ' );
if ( $ approved ) {
$ name = $ conv -> getUser ()-> getName ()-> getDisplay ();
$ latlng = $ conv -> getDevice ()-> getLocation ()-> getCoordinates ();
$ lat = $ latlng -> getLatitude ();
$ lng = $ latlng -> getLongitude ();
$ conv -> close ( ' Got it, your name is ' . $ name . ' and your coordinates are ' . $ lat . ' , ' . $ lng );
} else {
$ conv -> close ( ' Never mind then ' );
}
}
여기에서 설명서를 참조하세요.
use Dialogflow Action Questions DateTime ;
$ conv -> ask ( new DateTime ( ' When do you want to come in? ' , ' What is the best date to schedule your appointment? ' , ' What time of day works best for you? ' ));
사용자에게 액세스 권한이 부여되었는지 확인한 다음 데이터에 액세스하려면 actions_intent_DATETIME
이벤트를 사용하여 Dialogflow 인텐트를 만듭니다. 의도 이름을 Get Date Time
으로 가정하면 다음과 같은 정보를 얻을 수 있습니다.
if ( ' Get Date Time ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ date = $ conv -> getArguments ()-> get ( ' DATETIME ' );
if ( $ date ) {
$ conv -> close ( ' Ok, got it, i will see you at ' . $ date -> format ( ' r ' ));
} else {
$ conv -> close ( ' Never mind then ' );
}
}
여기에서 설명서를 참조하세요.
use Dialogflow Action Questions Place ;
$ conv -> ask ( new Place ( ' Where do you want to have lunch? ' , ' To find lunch locations ' ));
사용자에게 액세스 권한이 부여되었는지 확인한 다음 데이터에 액세스하려면 actions_intent_PLACE
이벤트를 사용하여 Dialogflow 인텐트를 만듭니다. 인텐트 이름을 Get Place
라고 가정하면 다음과 같은 정보를 얻을 수 있습니다.
if ( ' Get Place ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ place = $ conv -> getArguments ()-> get ( ' PLACE ' );
if ( $ place ) {
$ conv -> close ( ' Ok, got it, we ' ll meet at ' . $ place -> getFormattedAddress ());
} else {
$ conv -> close ( ' Never mind then ' );
}
}
여기에서 설명서를 참조하세요.
use Dialogflow Action Questions Confirmation ;
$ conv -> ask ( new Confirmation ( ' Can you confirm? ' ));
사용자의 확인 여부를 확인하려면 actions_intent_CONFIRMATION
이벤트를 사용하여 Dialogflow 인텐트를 만듭니다. Intent 이름을 Get Confirmation
으로 가정하면 다음과 같은 정보를 얻을 수 있습니다.
if ( ' Get Confirmation ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ confirmed = $ conv -> getArguments ()-> get ( ' CONFIRMATION ' );
if ( $ confirmed ) {
$ conv -> close ( ' Ok, it is confirmed ' );
} else {
$ conv -> close ( ' Alright then, it is canceled ' );
}
}
Google 어시스턴트는 오디오 및 디스플레이 환경을 지원하는 모바일 기기나 오디오 전용 환경을 지원하는 Google Home 기기 등 다양한 표면에서 사용할 수 있습니다.
모든 표면에서 잘 작동하는 대화를 디자인하고 구축하려면 표면 기능을 사용하여 대화를 적절하게 제어하고 범위를 지정하세요.
$ surface = $ conv -> getSurface ();
if ( $ surface -> hasScreen ()) {
// surface has screen
} elseif ( $ surface -> hasAudio ()) {
// surface has audio
} elseif ( $ surface -> hasMediaPlayback ()) {
// surface can play audio
} elseif ( $ surface -> hasWebBrowser ()) {
// user can interact with the content in a web browser
}