Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FondBot - фреймворк для создания чат-ботов на PHP (DevConf 2017)

FondBot - фреймворк для создания чат-ботов на PHP (DevConf 2017)

На PHP сложно найти достойные библиотеки для создания ботов. Обычно предоставляется возможность задать взаимодействие с пользователем в формате вопрос-ответ. Но что, если нужен бот с грамотной архитектурой, кроссплатформенный, которого необходимо поддерживать? А так же требуется встроенная система диалогов!

Несколько месяцев назад я начал работать над библиотекой для создания ботов с современным подходом к разработке веб-приложений, которую можно интегрировать с любым фреймворком и с любой платформой (в виде драйверов).
В своём докладе я расскажу о текущем положении дел в проекте, покажу, что можно делать, и как FondBot может упростить жизнь разработчику.

E7950989364c6d7ce97f404763a607b6?s=128

Vladimir Yuldashev

June 17, 2017
Tweet

Transcript

  1. Фреймворк для создания чат-ботов на PHP

  2. Что такое "FondBot"? • PHP фреймворк для создания чат-ботов •

    Основан на компонентах "The PHP League", "Symfony" и др. • PHP 7.1 с использованием return types
  3. Основные возможности • Система диалогов • Асинхронная отправка сообщений •

    Драйвера • Dependency Injection • Filesystem, Cache, Queue • Toolbelt
  4. Установка ➜ / composer create-project fondbot/fondbot bot Installing fondbot/fondbot (v1.0.1)

    - Installing fondbot/fondbot (v1.0.1): Loading from cache Created project in bot > php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 63 installs, 0 updates, 0 removals - Installing ... Writing lock file Generating autoload files
  5. Структура проекта

  6. Конфигурация • Service Providers • Environment Variables (.env)

  7. Система диалогов • Все диалоги поделены на "Intent" и "Interaction"

    • Intent - желание пользователя и реакция бота на него • Interaction - взаимодействие с пользователем
  8. Система диалогов (Intent) ➜ bot php bin/toolbelt make:intent Weather [OK]

    Intent created.
  9. Система диалогов (Intent) class WeatherIntent extends Intent { public function

    activators(): array { return [ $this ->exact('/weather'), ]; } public function run(ReceivedMessage $message): void { // Send reply to user, jump to interaction or do something else ... } }
  10. Система диалогов (Intent) class WeatherIntent extends Intent { public function

    activators(): array { return [ $this ->exact('погода'), $this ->exact('погода на сегодня'), ]; } public function run(ReceivedMessage $message): void { // Получаем данные $guzzle = new Client; $response = $guzzle ->get(' ...'); $response = json_decode((string)$response ->getBody()); // Отправляем пользователю результат $this ->sendMessage($response ->weather ->description); } }
  11. Система диалогов (Intent) • Exact - точное совпадение текста •

    Contains - содержит одно из значений (слов) • Pattern - регулярное выражение • InArray - одно из значений • WithAttachment - в сообщении есть файл, возможно с заданным типом
  12. Система диалогов (Interaction) ➜ bot php bin/toolbelt make:interaction AskCity [OK]

    Interaction created.
  13. Система диалогов (Interaction) class AskCityInteraction extends Interaction { public function

    run(ReceivedMessage $message): void { // Здесь можно задать вопрос пользователю, показать клавиатуру или сделать что-то еще… } public function process(ReceivedMessage $reply): void { // Обработать ответ пользователя на то, что было задано в методе “run”. } }
  14. Система диалогов (Interaction) public function run(ReceivedMessage $message): void { $keyboard

    = (new Keyboard); foreach ($this ->cities as $city) { $button = (new Keyboard\ReplyButton) ->setLabel($city); $keyboard ->addButton($button); } $this ->sendMessage( 'В каком городе тебя интересует погода?', $keyboard ); }
  15. Система диалогов (Interaction) public function process(ReceivedMessage $reply): void { if(!in_array($reply

    ->getText(), $this ->cities)) { $this ->sendMessage('Извини, я не знаю погоду в этом городе.'); return; } // Получаем данные $guzzle = new Client; $response = $guzzle ->get(' ...'); $response = json_decode((string)$response ->getBody()); // Отправляем пользователю результат $this ->sendMessage($response ->weather ->description); }
  16. Система диалогов • Перезапустить Intent или Interaction $this ->restart(); •

    “Прыгнуть” в Interaction $this ->jump();
  17. Система диалогов • Сохранить данные в контекст $this ->remember('key', 'value');

    • Получить данные из контекста $this ->context('key');
  18. Драйвера ➜ bot php bin/toolbelt driver:list +----------------+------------------------+----------+ | Name |

    Package | Official | +----------------+------------------------+----------+ | telegram | fondbot/telegram | ✅ | | facebook | fondbot/facebook | ✅ | | vk-communities | fondbot/vk-communities | ✅ | +----------------+------------------------+----------+
  19. Драйвера ➜ bot php bin/toolbelt driver:install telegram Installing driver ...

    [OK] Driver installed.
  20. Каналы class ChannelServiceProvider extends BaseChannelServiceProvider { public function channels(): array

    { return [ 'telegram' => [ 'driver' => 'telegram', 'token' => env('TELEGRAM_TOKEN'), ], ]; } }
  21. Каналы ➜ bot php bin/toolbelt channel:list +----------+----------+--------------------+ | Name |

    Driver | Route | +----------+----------+--------------------+ | telegram | telegram | /channels/telegram | +----------+----------+--------------------+
  22. Dependency Injection • Constructor Injection • Хелпер resolve resolve(FondBot\Contracts\Cache ::class);

  23. Filesystem, Cache, Queue • Файловая система • Все адаптеры Flysystem

    (http://flysystem.thephpleague.com) • Кэш (Cache) • Filesystem • Очереди (Queue) • Синхронные - SyncAdapter • Beanstalkd - BeanstalkdAdapter
  24. Toolbelt ➜ bot php bin/toolbelt FondBot 1.0.5 Usage: command [options]

    [arguments] Options: ... Available commands: log Tail log channel channel:list List all channels driver driver:install Install driver driver:list Get list of all available drivers make make:intent Create a new intent class make:interaction Create a new interaction class queue queue:worker Run queue worker
  25. FondBot v1.1.0 • Переработаны драйвера • PSR-6 (Caching) • PSR-7

    (HTTP Message Interfaces) • Собственная реализация Asset Discovery
  26. Планы • Slack, Viber • Система событий (Events) • Каталог

    ботов • Аналитика (Chatbase, Botan.io, FondBot Analytics) • Конструктор диалогов • Хелперы для тестов • Интеграция с фреймворками (Laravel, Symfony и др.)
  27. Вопросы (Q&A) • Slack: https://fondbot.signup.team • Email: vladimir@fondbot.com • Telegram:

    https://t.me/vladimiryuldashev • GitHub: https://github.com/fondbot/fondbot • Сайт: https://fondbot.com • Документация: https://docs.fondbot.com