SlideShare a Scribd company logo
1 of 41
Download to read offline
Tworzenie chatbotów
z BotMan
Adam Matysiak
CTO / Team Leader
adam@highsolutions.pl
Czym są chatboty?
Definicja:
“Konwersacyjny interfejs
użytkownika służący do interakcji
z programem komputerowym”
Do czego możemy je wykorzystać?
- Automatyczne/interaktywne deploymenty
- Działania DevOps
- Wsparcie sprzedaży (E-commerce)
- Wsparcie działu obsługi klienta
- Brand marketing
- Promocja bloga/treści
- Usługi typu self-service
- Fun
- … ?
Przykłady zastosowań
https://highsolutions.pl/blog/wpis/7-zastosowan-chatbota-
o-ktorych-musisz-wiedziec-prowadzac-biznes
Czy to już czas?
“Chatbot Market Size Is About To
Reach $1.25 Billion By 2025”
GrandViewResearch, sierpień 2017
Skuteczność
Źródło danych: https://neilpatel.com/blog/open-rates-facebook-messenger
BotMan
composer create-project --prefer-dist botman/studio your-awesome-bot
Wymagania: PHP >= 7.0
● https://botman.io/ - Dokumentacja / Demo
● https://buildachatbot.io/ - Kurs video
● https://playground.botman.io/ - On-line IDE
● https://christoph-rumpel.com/build-chatbots-with-php - E-book
Dostępne usługi
- Amazon Alexa
- Cisco Spark
- Facebook Messenger
- HipChat
- Kik
- Microsoft Bot Framework
- Nexmo
- Slack
- Telegram
- Twilio
- WeChat
Podstawy działania
1. Słuchanie
2. Przetwarzanie
3. Odpowiadanie
OK, to jak działa chatbot?
Usłysz i odpowiedz...
plik botman.php w katalogu routes
$botman->hears('Kto dziś wygra mecz?', function ($bot) {
$bot->reply('LECH!');
});
// Process incoming message
$botman->listen();
Przesłanie do kontrolera
$botman->hears('Kto dziś wygra mecz?', 'SomeNamespaceLechController@respondAboutWinningToday');
class LechController {
public function respondAboutWinningToday($bot) {
$bot->reply('Oczywiście, że KKS!');
}
}
Parametry i wyrażenia regularne
$botman->hears('lubię {team}', function ($bot, $team) {
$bot->reply('Twoja ulubiona drużyna to: '. $team);
});
$botman->hears('.*(KKS|Lech|Poznań|Kolejorz).*', function ($bot) {
$bot->reply('Zdobyte mistrzostwa Polski: 1983, 1984, 1990, 1992, 1993, 2010, 2015');
});
$botman->hears('Chcę kupić ([0-9]+) bilet(y|ów)', function ($bot, $number) {
$bot->reply($number .' - tyle biletów zamawiam dla Ciebie. Proszę czekać...');
});
Można też przyjmować załączniki
$bot->receivesImages(function($bot, $images) {
foreach ($images as $image) {
$url = $image->getUrl(); // The direct url
$title = $image->getTitle(); // The title, if available
$payload = $image->getPayload(); // The original payload
}
});
Odpowiadanie
$botman->hears('Kto dziś wygra ważny mecz?', function (BotMan $bot) {
$bot->reply("LECH!");
$bot->reply("Kto?");
$bot->typesAndWaits(2); // 2 sekundy pokazuje, że pisze...
$bot->reply("LECH!");
});
Odpowiadanie obrazkiem
use BotManBotManMessagesAttachmentsImage;
use BotManBotManMessagesOutgoingOutgoingMessage;
$botman->hears('Pokaż herb', function (BotMan $bot) {
// Create attachment
$attachment = new Image('https://www.lechpoznan.pl/view/basic/images/favicon/facebook_200x200.png');
// Build message object
$message = OutgoingMessage::create('Herb Lecha Poznań')
->withAttachment($attachment);
// Reply message object
$bot->reply($message);
});
Konwersacje
$botman->hears('Chcę założyć kartę kibica', function($bot) {
$bot->startConversation(new AccountRegisterConversation);
});
Konwersacje
class AccountRegisterConversation extends Conversation
{
protected $name;
protected $email;
public function run()
{
$this->askName();
}
public function askName()
{
$this->ask('OK, jak się nazywasz?', function(Answer $answer) {
$this->name = $answer->getText();
$this->say('Dziękuję za odpowiedź: '. $this->name);
$this->askEmail();
});
}
public function askEmail()
{
$this->ask('Podaj proszę adres e-mail by dokończyć rejestrację', function(Answer $answer) {
$this->email = $answer->getText();
// ... sending e-mail
$this->say('Dziękuję. Mail z potwierdzeniem został wysłany na: '. $this->email);
});
}
}
Pytania
public function askWhoWillWinNextMatch()
{
$this->ask('Kto w niedzielę wygra mecz?', function (Answer $response) {
$this->say('Świetnie, Twoja odpowiedź to - ' . $response->getText());
});
}
Pytania z opcjami wyboru
public function askForNextMatchWinner()
{
$question = Question::create('Kto wygra mecz w niedzielę?')
->fallback('Nie udało się odpowiedzieć...')
->callbackId('who_will_win_next_match')
->addButtons([
Button::create('Lech')->value('lech'),
Button::create('Jagiellonia')->value('jaga'),
]);
$this->ask($question, function (Answer $answer) {
// Detect if button was clicked:
if ($answer->isInteractiveMessageReply()) {
$selectedValue = $answer->getValue(); // will be either 'lech' or 'jaga'
$selectedText = $answer->getText(); // will be either 'Lech' or 'Jagiellonia'
}
});
}
Pytania ze wzorcami
public function askWhoWillWinNextMatch()
{
$this->ask('Kto w niedzielę wygra mecz? Lech czy Jagiellonia?', [
[
'pattern' => 'kks|lech|poznań|kolejorz',
'callback' => function () {
$this->say('Świetnie, że nadal w nas wierzysz!');
}
],
[
'pattern' => 'jagiellonia|białystok|jaga',
'callback' => function () {
$this->say(':(. Nadzieja umiera ostatnia!');
}
]
]);
}
Dane użytkownika
/**
* Retrieve User information.
* @param IncomingMessage $matchingMessage
* @return UserInterface
*/
public function getUser(IncomingMessage $matchingMessage)
{
return new User($matchingMessage->getSender());
}
// Access user
$user = $bot->getUser();
Cache
$storage = $botman->userStorage();
$storage = $botman->channelStorage();
$storage = $botman->driverStorage();
$bot->userStorage()->save([
'name' => $name
]);
$bot->userStorage()->all();
$userInformation = $bot->userStorage()->find($id);
$name = $userInformation->get('name');
$bot->userStorage()->delete();
NLP
Hej, w niedzielę idę na mecz Lech - Jagiellonia o 18:00.
{
"intent": "create_meeting",
"entities": {
"name" : "Mecz Lech - Jagiellonia",
"invitees" : [],
"time": "2017-02-11 18:00:00"
}
}
Middleware
Testowanie
/** @test */
public function test_simple_reply()
{
$this->bot
->receives('Kto dziś wygra mecz?')
->assertReply('LECH!');
}
/** @test */
public function test_image_reply()
{
$this->bot
->receivesImage(['https://www.lechpoznan.pl/view/basic/images/favicon/facebook_200x200.png'])
->assertReply('To jest logo Lecha Poznań');
}
Testowanie
/** @test */
public function test_conversation()
{
$this->bot
->receives('Kto dziś wygra ważny mecz?')
->assertReplies([
'LECH!',
'Kto?',
])->receives('LECH')
->assertReply('Alleluja, alleluja...');
}
Web driver
Web widget
NLP model
Messenger / Button Template
$bot->reply(ButtonTemplate::create('Jakie wpisy chcesz zobaczyć?')
->addButton(ElementButton::create('Biznes')->type('postback')->payload('biznes'))
->addButton(ElementButton::create('IT')->url('https://highsolutions.pl/blog/kategoria/it'))
->addButton(ElementButton::create('PM i UX')->type('postback')->payload('pm-ux'))
);
Messenger / Generic Template
$bot->reply(GenericTemplate::create()
->addElements([
Element::create('BotMan Documentation')
->subtitle('All about BotMan')
->image('http://botman.io/img/botman-body.png')
->addButton(ElementButton::create('visit')
->url('http://botman.io')
)
->addButton(ElementButton::create('tell me more')
->payload('tellmemore')
->type('postback')
),
Element::create('BotMan Laravel Starter')
->subtitle('This is the best way to start...')
->image('http://botman.io/img/botman-body.png')
->addButton(ElementButton::create('visit')
->url('https://github.com/botman/botman')
),
])
);
Messenger / List Template
$bot->reply(ListTemplate::create()
->useCompactView()
->addGlobalButton(ElementButton::create('view more')->url('http://buildachatbot.io'))
->addElement(
Element::create('BotMan Documentation')
->subtitle('All about BotMan')
->image('http://botman.io/img/botman-body.png')
->addButton(ElementButton::create('tell me more')
->payload('tellmemore')->type('postback'))
)
->addElement(
Element::create('BotMan Laravel Starter')
->subtitle('This is the best way to start...')
->image('http://botman.io/img/botman-body.png')
->addButton(ElementButton::create('visit')
->url('http://botman.io')
)
)
);
Messenger / Media Template
$bot->reply(MediaTemplate::create()
->element(MediaAttachmentElement::create('image')
->addButton(ElementButton::create('Tell me more')
->type('postback')
->payload('Tell me more'))
->addButton(ElementButton::create('Documentation')
->url('https://botman.io/'))));
Messenger Demo Viewer
BotMan Playground
https://buildachatbot.io/playground/your-firs
t-playground
Nagroda specjalna
Dostęp do BotMan Playground
Pytania?
adam@highsolutions.pl
@AdamMatysiak
chatbot.highsolutions.pl

More Related Content

Similar to Tworzenie Chatbotów z wykorzystaniem BotMan'a

AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawyApptension
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaMaciej Ziarko
 
Zhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP TrojmiastoZhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP Trojmiastosecman_pl
 
Zarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychZarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychMarcinStachniuk
 
HTML5 - now or later
HTML5 - now or laterHTML5 - now or later
HTML5 - now or laterKasia Drzyzga
 
WebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, TomorrowWebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, TomorrowMarcin Dembowski
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
Optymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETOptymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETBartlomiej Zass
 
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...Tomasz Kopacz
 
Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Bartlomiej Zass
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIThe Software House
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JSDawid Rusnak
 

Similar to Tworzenie Chatbotów z wykorzystaniem BotMan'a (14)

AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
 
Zhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP TrojmiastoZhakuj swojego Wordpressa, WordUP Trojmiasto
Zhakuj swojego Wordpressa, WordUP Trojmiasto
 
Zarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychZarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danych
 
HTML5 - now or later
HTML5 - now or laterHTML5 - now or later
HTML5 - now or later
 
WebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, TomorrowWebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, Tomorrow
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
Optymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NETOptymalizacja aplikacji ASP.NET
Optymalizacja aplikacji ASP.NET
 
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
 
Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)Programowanie aplikacji dla Windows 8 (WinRT)
Programowanie aplikacji dla Windows 8 (WinRT)
 
Bartek Dziamski - Kawaskrypty dom marchewki
Bartek Dziamski - Kawaskrypty dom marchewkiBartek Dziamski - Kawaskrypty dom marchewki
Bartek Dziamski - Kawaskrypty dom marchewki
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z API
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JS
 

More from Laravel Poland MeetUp

WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...Laravel Poland MeetUp
 
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) Laravel Poland MeetUp
 
Kilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentKilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentLaravel Poland MeetUp
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Laravel Poland MeetUp
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Laravel Poland MeetUp
 
Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Laravel Poland MeetUp
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravel Poland MeetUp
 
Przegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaPrzegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaLaravel Poland MeetUp
 
Laravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Poland MeetUp
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Poland MeetUp
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelWstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelLaravel Poland MeetUp
 

More from Laravel Poland MeetUp (20)

WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
 
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
 
Kilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentKilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w Eloquent
 
Licencje otwartego oprogramowania
Licencje otwartego oprogramowaniaLicencje otwartego oprogramowania
Licencje otwartego oprogramowania
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
 
Jak przemycić Shape Up do Scruma?
Jak przemycić Shape Up do Scruma?Jak przemycić Shape Up do Scruma?
Jak przemycić Shape Up do Scruma?
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
 
Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Przegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaPrzegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do Laravela
 
Walidacja w Laravelu
Walidacja w LaraveluWalidacja w Laravelu
Walidacja w Laravelu
 
(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze
 
Laravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2E
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?
 
Laravel Jobs i PHP8
Laravel Jobs i PHP8Laravel Jobs i PHP8
Laravel Jobs i PHP8
 
Wszystko o Laravel Livewire
Wszystko o Laravel Livewire Wszystko o Laravel Livewire
Wszystko o Laravel Livewire
 
Laravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFamiLaravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFami
 
Action-based Laravel
Action-based LaravelAction-based Laravel
Action-based Laravel
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelWstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
 

Tworzenie Chatbotów z wykorzystaniem BotMan'a

  • 2. Adam Matysiak CTO / Team Leader adam@highsolutions.pl
  • 3. Czym są chatboty? Definicja: “Konwersacyjny interfejs użytkownika służący do interakcji z programem komputerowym”
  • 4. Do czego możemy je wykorzystać? - Automatyczne/interaktywne deploymenty - Działania DevOps - Wsparcie sprzedaży (E-commerce) - Wsparcie działu obsługi klienta - Brand marketing - Promocja bloga/treści - Usługi typu self-service - Fun - … ?
  • 6. Czy to już czas? “Chatbot Market Size Is About To Reach $1.25 Billion By 2025” GrandViewResearch, sierpień 2017
  • 8.
  • 9. BotMan composer create-project --prefer-dist botman/studio your-awesome-bot Wymagania: PHP >= 7.0 ● https://botman.io/ - Dokumentacja / Demo ● https://buildachatbot.io/ - Kurs video ● https://playground.botman.io/ - On-line IDE ● https://christoph-rumpel.com/build-chatbots-with-php - E-book
  • 10. Dostępne usługi - Amazon Alexa - Cisco Spark - Facebook Messenger - HipChat - Kik - Microsoft Bot Framework - Nexmo - Slack - Telegram - Twilio - WeChat
  • 11. Podstawy działania 1. Słuchanie 2. Przetwarzanie 3. Odpowiadanie
  • 12. OK, to jak działa chatbot?
  • 13. Usłysz i odpowiedz... plik botman.php w katalogu routes $botman->hears('Kto dziś wygra mecz?', function ($bot) { $bot->reply('LECH!'); }); // Process incoming message $botman->listen();
  • 14. Przesłanie do kontrolera $botman->hears('Kto dziś wygra mecz?', 'SomeNamespaceLechController@respondAboutWinningToday'); class LechController { public function respondAboutWinningToday($bot) { $bot->reply('Oczywiście, że KKS!'); } }
  • 15. Parametry i wyrażenia regularne $botman->hears('lubię {team}', function ($bot, $team) { $bot->reply('Twoja ulubiona drużyna to: '. $team); }); $botman->hears('.*(KKS|Lech|Poznań|Kolejorz).*', function ($bot) { $bot->reply('Zdobyte mistrzostwa Polski: 1983, 1984, 1990, 1992, 1993, 2010, 2015'); }); $botman->hears('Chcę kupić ([0-9]+) bilet(y|ów)', function ($bot, $number) { $bot->reply($number .' - tyle biletów zamawiam dla Ciebie. Proszę czekać...'); });
  • 16. Można też przyjmować załączniki $bot->receivesImages(function($bot, $images) { foreach ($images as $image) { $url = $image->getUrl(); // The direct url $title = $image->getTitle(); // The title, if available $payload = $image->getPayload(); // The original payload } });
  • 17. Odpowiadanie $botman->hears('Kto dziś wygra ważny mecz?', function (BotMan $bot) { $bot->reply("LECH!"); $bot->reply("Kto?"); $bot->typesAndWaits(2); // 2 sekundy pokazuje, że pisze... $bot->reply("LECH!"); });
  • 18. Odpowiadanie obrazkiem use BotManBotManMessagesAttachmentsImage; use BotManBotManMessagesOutgoingOutgoingMessage; $botman->hears('Pokaż herb', function (BotMan $bot) { // Create attachment $attachment = new Image('https://www.lechpoznan.pl/view/basic/images/favicon/facebook_200x200.png'); // Build message object $message = OutgoingMessage::create('Herb Lecha Poznań') ->withAttachment($attachment); // Reply message object $bot->reply($message); });
  • 19. Konwersacje $botman->hears('Chcę założyć kartę kibica', function($bot) { $bot->startConversation(new AccountRegisterConversation); });
  • 20. Konwersacje class AccountRegisterConversation extends Conversation { protected $name; protected $email; public function run() { $this->askName(); } public function askName() { $this->ask('OK, jak się nazywasz?', function(Answer $answer) { $this->name = $answer->getText(); $this->say('Dziękuję za odpowiedź: '. $this->name); $this->askEmail(); }); } public function askEmail() { $this->ask('Podaj proszę adres e-mail by dokończyć rejestrację', function(Answer $answer) { $this->email = $answer->getText(); // ... sending e-mail $this->say('Dziękuję. Mail z potwierdzeniem został wysłany na: '. $this->email); }); } }
  • 21. Pytania public function askWhoWillWinNextMatch() { $this->ask('Kto w niedzielę wygra mecz?', function (Answer $response) { $this->say('Świetnie, Twoja odpowiedź to - ' . $response->getText()); }); }
  • 22. Pytania z opcjami wyboru public function askForNextMatchWinner() { $question = Question::create('Kto wygra mecz w niedzielę?') ->fallback('Nie udało się odpowiedzieć...') ->callbackId('who_will_win_next_match') ->addButtons([ Button::create('Lech')->value('lech'), Button::create('Jagiellonia')->value('jaga'), ]); $this->ask($question, function (Answer $answer) { // Detect if button was clicked: if ($answer->isInteractiveMessageReply()) { $selectedValue = $answer->getValue(); // will be either 'lech' or 'jaga' $selectedText = $answer->getText(); // will be either 'Lech' or 'Jagiellonia' } }); }
  • 23. Pytania ze wzorcami public function askWhoWillWinNextMatch() { $this->ask('Kto w niedzielę wygra mecz? Lech czy Jagiellonia?', [ [ 'pattern' => 'kks|lech|poznań|kolejorz', 'callback' => function () { $this->say('Świetnie, że nadal w nas wierzysz!'); } ], [ 'pattern' => 'jagiellonia|białystok|jaga', 'callback' => function () { $this->say(':(. Nadzieja umiera ostatnia!'); } ] ]); }
  • 24. Dane użytkownika /** * Retrieve User information. * @param IncomingMessage $matchingMessage * @return UserInterface */ public function getUser(IncomingMessage $matchingMessage) { return new User($matchingMessage->getSender()); } // Access user $user = $bot->getUser();
  • 25. Cache $storage = $botman->userStorage(); $storage = $botman->channelStorage(); $storage = $botman->driverStorage(); $bot->userStorage()->save([ 'name' => $name ]); $bot->userStorage()->all(); $userInformation = $bot->userStorage()->find($id); $name = $userInformation->get('name'); $bot->userStorage()->delete();
  • 26. NLP Hej, w niedzielę idę na mecz Lech - Jagiellonia o 18:00. { "intent": "create_meeting", "entities": { "name" : "Mecz Lech - Jagiellonia", "invitees" : [], "time": "2017-02-11 18:00:00" } }
  • 28. Testowanie /** @test */ public function test_simple_reply() { $this->bot ->receives('Kto dziś wygra mecz?') ->assertReply('LECH!'); } /** @test */ public function test_image_reply() { $this->bot ->receivesImage(['https://www.lechpoznan.pl/view/basic/images/favicon/facebook_200x200.png']) ->assertReply('To jest logo Lecha Poznań'); }
  • 29. Testowanie /** @test */ public function test_conversation() { $this->bot ->receives('Kto dziś wygra ważny mecz?') ->assertReplies([ 'LECH!', 'Kto?', ])->receives('LECH') ->assertReply('Alleluja, alleluja...'); }
  • 33.
  • 34. Messenger / Button Template $bot->reply(ButtonTemplate::create('Jakie wpisy chcesz zobaczyć?') ->addButton(ElementButton::create('Biznes')->type('postback')->payload('biznes')) ->addButton(ElementButton::create('IT')->url('https://highsolutions.pl/blog/kategoria/it')) ->addButton(ElementButton::create('PM i UX')->type('postback')->payload('pm-ux')) );
  • 35. Messenger / Generic Template $bot->reply(GenericTemplate::create() ->addElements([ Element::create('BotMan Documentation') ->subtitle('All about BotMan') ->image('http://botman.io/img/botman-body.png') ->addButton(ElementButton::create('visit') ->url('http://botman.io') ) ->addButton(ElementButton::create('tell me more') ->payload('tellmemore') ->type('postback') ), Element::create('BotMan Laravel Starter') ->subtitle('This is the best way to start...') ->image('http://botman.io/img/botman-body.png') ->addButton(ElementButton::create('visit') ->url('https://github.com/botman/botman') ), ]) );
  • 36. Messenger / List Template $bot->reply(ListTemplate::create() ->useCompactView() ->addGlobalButton(ElementButton::create('view more')->url('http://buildachatbot.io')) ->addElement( Element::create('BotMan Documentation') ->subtitle('All about BotMan') ->image('http://botman.io/img/botman-body.png') ->addButton(ElementButton::create('tell me more') ->payload('tellmemore')->type('postback')) ) ->addElement( Element::create('BotMan Laravel Starter') ->subtitle('This is the best way to start...') ->image('http://botman.io/img/botman-body.png') ->addButton(ElementButton::create('visit') ->url('http://botman.io') ) ) );
  • 37. Messenger / Media Template $bot->reply(MediaTemplate::create() ->element(MediaAttachmentElement::create('image') ->addButton(ElementButton::create('Tell me more') ->type('postback') ->payload('Tell me more')) ->addButton(ElementButton::create('Documentation') ->url('https://botman.io/'))));
  • 40. Nagroda specjalna Dostęp do BotMan Playground