Сервис для
сео - оптимизаторов

Найди ошибки на сайте
Ошибки мешают продвижению сайта
Исправь ошибки на сайте
Сайт без ошибок продвигать легче
Получи новых клиентов
Новые клиенты принесут больше прибыль

Создание чата на Facebook с Node и Heroku

  1. Нужно ли знать ИИ, чтобы построить бота?
  2. Начиная
  3. Развертывание в Heroku
  4. Создание переменных среды
  5. Создать страницу Facebook и приложение
  6. Экран приветствия
  7. Настройка базы данных
  8. Настройка базы данных через веб-сайт mLab
  9. Определение класса модели
  10. Собираем все вместе
  11. Живой с вашим ботом чата Facebook
  12. Заключение

Создание бота на Facebook с Node и Heroku было проверено Джоан Инь а также Камило Рейес , Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Камило Рейес

На прошлогодней конференции F8 Facebook запустил Платформа Messenger предоставляя разработчикам возможность создавать ботов, которые могли бы общаться с людьми в Messenger или со страницы Facebook. С помощью ботов владельцы приложений могут лучше взаимодействовать со своими пользователями, предоставляя персонализированное и интерактивное общение, которое может масштабироваться для масс. С момента запуска компании и владельцы приложений проявили большой интерес к чат-ботам. Всего через три месяца после объявления было 11 000 ботов построен на платформе.

Компании и владельцы приложений не единственные, кто получает выгоду от чат-ботов. Пользователи этих ботов могут пользоваться множеством услуг, таких как:

В настоящее время интерес к чат-ботам и их привлекательность очевидны, и по мере совершенствования технологии искусственного интеллекта боты будут лучше взаимодействовать с пользователями.

В этой статье мы рассмотрим, как создать чат-бота Facebook, который может взаимодействовать с пользователями через Messenger от имени страницы Facebook. Мы создадим бота, который предоставит пользователю различные детали относительно фильма, который он указал.

Нужно ли знать ИИ, чтобы построить бота?

Навык в искусстве ИИ, безусловно, поможет, особенно в создании сложных ботов, но это не обязательно. Конечно, вы можете построить бот, не зная машинного обучения.

Есть два типа ботов, которые вы можете построить. Один основан на наборе правил, а другой использует машинное обучение. Первый ограничен во взаимодействиях, которые он может предложить. Он может отвечать только на конкретные команды. Это тот тип бота, который мы будем строить.

С ботами, которые используют машинное обучение, вы получаете лучшее взаимодействие с пользователем. Пользователь может взаимодействовать с ботом более естественным образом, как при взаимодействии человека с человеком, а не просто с помощью команд. Бот также становится умнее, поскольку он учится на разговорах с людьми. Мы оставим создание этого типа бота для будущей статьи. Тем не менее, знание машинного обучения не потребуется. К счастью для нас, есть такие услуги, как wit.ai а также Api.ai которые позволяют разработчикам интегрировать машинное обучение (в частности, Natural Language Processing - NLP) в свои приложения.

Начиная

Вы можете скачать код для готового демо-приложения Вот ,

Чтобы ваш чат-бот общался с пользователями Facebook, нам нужно настроить сервер, который будет принимать, обрабатывать и отправлять сообщения. Для этого сервер будет использовать API Graph Facebook. Graph API - это основной способ получения данных с платформы Facebook. У сервера должен быть URL-адрес конечной точки, доступный с серверов Facebook, поэтому развертывание веб-приложения на вашем локальном компьютере не будет работать, его нужно разместить в Интернете. Кроме того, начиная с версии 2.5 Graph API, новые подписки на службу должны использовать защищенный URL-адрес обратного вызова HTTPS. В этом руководстве мы развернем приложение в Heroku, так как все домены appname.herokuapp.com по умолчанию уже поддерживают SSL. Мы будем использовать Node.js для создания веб-приложения.

Чтобы начать, сначала убедитесь, что Узел установлен на вашем компьютере. Вы можете проверить это, набрав узел -v в Терминале. Если установлено, будет выведен номер версии. затем установить интерфейс командной строки Heroku (CLI). Мы будем использовать это позже, чтобы отправить приложение в Heroku. Используйте heroku --version, чтобы убедиться, что CLI установлен.

Создайте каталог проекта и инициализируйте файл package.json с помощью следующих команд.

$ mkdir spbot $ cd spbot $ npm init

Следуйте инструкциям, чтобы установить свои предпочтения для проекта.

После того, как файл package.json создан, откройте его и добавьте свойство start к объекту scripts. Это позволяет Heroku знать, какую команду выполнить для запуска приложения. Во время настройки проекта я определил app.js в качестве точки входа в приложение, поэтому я использую узел app.js в качестве значения start. Измените это в соответствии с настройками вашего проекта.

{"name": "spbot", "version": "1.0.0", "description": "SPBot Server", "main": "app.js", "scripts": {"test": "echo \ "Ошибка: тест не указан \" & amp; выход 1 "," запуск ":" node app.js "}," author ":" Joyce Echessa "," license ":" ISC "}

Установите следующие пакеты Node.

$ npm установить экспресс-запрос body-parser mongoose --save

Создайте файл .gitignore в корневом каталоге вашего проекта и включите папку node_modules, чтобы предотвратить его фиксацию.

node_modules

В корневом каталоге вашего проекта создайте файл с именем app.js (или index.js, если вы выбрали имя по умолчанию). Измените это как показано:

var express = require ("express"); var request = require ("request"); var bodyParser = require ("body-parser"); var app = express (); app.use (bodyParser.urlencoded ({extended: false})); app.use (bodyParser.json ()); app.listen ((process.env.PORT || 5000)); // Страница индекса сервера app.get ("/", function (req, res) {res.send ("Deployed!");}); // Facebook Webhook // Используется для проверки app.get ("/ webhook", function (req, res) {if (req.query ["hub.verify_token"] === "this_is_my_token") {console.log (" Verified webhook "); res.status (200) .send (req.query [" hub.challenge "]);} else {console.error (" Ошибка проверки. Токены не совпадают. "); Res.sendStatus ( 403);}});

Первый обработчик GET предназначен для нашего собственного тестирования - чтобы узнать, было ли приложение успешно развернуто. Второй обработчик GET - это конечная точка, которую Facebook будет использовать для проверки приложения. Код должен искать valid_token и отвечать запросом, отправленным в запросе проверки.

Вы можете вставить свой собственный токен в код. Такие данные лучше всего сохранять в переменная окружения , что мы сделаем вскоре после создания проекта на Heroku.

Развертывание в Heroku

Чтобы платформа Facebook подключилась к нашему бэкэнд-приложению, нам сначала нужно подключить его к сети.

Создайте Git-репозиторий и зафиксируйте файлы проекта с помощью следующих команд:

$ git init $ git add. $ git commit -m "Начальный коммит"

Зарегистрируйтесь бесплатно Heroku аккаунт, если у вас его еще нет.

С вашего терминала войдите в Heroku и создайте приложение.

$ heroku login $ heroku create $ git push heroku master $ heroku открыть

При запуске команды heroku open в браузере по умолчанию будет открыта ссылка на запущенное приложение. Если все прошло хорошо, вы получите страницу с текстом Deployed! в теме.

Создание переменных среды

Прежде чем мы продолжим, давайте создадим переменную окружения в Heroku для хранения токена проверки приложения.

Открыть свой Heroku Dashboard и выберите приложение, которое вы только что развернули. Перейдите в настройки приложения и нажмите кнопку « Показать настройки» . Введите VERIFICATION_TOKEN в качестве ключа и свой токен в качестве значения и нажмите кнопку Добавить .

Введите VERIFICATION_TOKEN в качестве ключа и свой токен в качестве значения и нажмите кнопку Добавить

В своем коде измените строку токена ("this_is_my_token") на process.env.VERIFICATION_TOKEN. Зафиксируйте свои изменения и отправьте их в Heroku.

Создать страницу Facebook и приложение

После запуска и запуска сервера мы создадим приложение Facebook и страницу, с которой он будет связан. Вы можете создать новую страницу или использовать существующую.

Чтобы создать страницу Facebook, войдите в Facebook и перейдите к Создать страницу , Выберите тип страницы из предложенных вариантов. Я выбрал Развлечения .

Я выбрал Развлечения

Затем выберите категорию и имя для страницы.

Затем выберите категорию и имя для страницы

После нажатия кнопки «Начать» будет создана страница, и вам будет предложено узнать больше информации о вашем приложении (описание, веб-сайт, изображение профиля, целевая аудитория и т. Д.). Вы можете пропустить эти шаги настройки сейчас.

Вы можете пропустить эти шаги настройки сейчас

Чтобы создать приложение Facebook, перейдите к Добавить новое приложение нажмите на ссылку базовой настройки под другими вариантами платформы.

Чтобы создать приложение Facebook, перейдите к   Добавить новое приложение   нажмите на ссылку базовой настройки под другими вариантами платформы

Заполните необходимые детали. Выберите Приложения для страниц в качестве категории.

Выберите Приложения для страниц в качестве категории

При нажатии кнопки « Создать идентификатор приложения» откроется панель приложения.

При нажатии кнопки « Создать идентификатор приложения» откроется панель приложения

В разделе « Настройка продукта» справа нажмите « Начало работы» в разделе « Messenger ». После этого вы попадете на страницу настроек Messenger, показанную ниже.

После этого вы попадете на страницу настроек Messenger, показанную ниже

Чтобы получать сообщения и другие события, отправленные пользователями Messenger, приложение должно включать интеграцию с веб-крючками. Мы сделаем это дальше. Webhooks (ранее обновления в реальном времени ) позволяют подписываться на изменения, которые вы хотите отслеживать, и получать обновления в режиме реального времени без необходимости вызова API.

В разделе Webhooks нажмите Setup Webhooks

Введите URL-адрес обратного вызова, на который будут отправляться обновления (URL-адрес конечной точки, определенный в бэкэнд-приложении, т. Е. <Your-app-url> / webhook), введите Verify Token (токен, используемый в бэкэнд-приложении, т. Е. Значение, сохраненное в процессе .env.VERIFICATION_TOKEN) и установите все флажки. Они определяют, на какие события будет подписано приложение. Мы увидим, что они делают чуть позже.

Мы увидим, что они делают чуть позже

При успешном включении веб-хука вы должны увидеть « Завершено» в разделе «Веб-хуки» и список событий, на которые подписаны. Если вы получили сообщение об ошибке, убедитесь, что вы ввели правильный URL-адрес для конечной точки webhook (оканчивающийся на / webhook), а также убедитесь, что токен, используемый здесь, тот же, который вы использовали в приложении Node.

Если вы получили сообщение об ошибке, убедитесь, что вы ввели правильный URL-адрес для конечной точки webhook (оканчивающийся на / webhook), а также убедитесь, что токен, используемый здесь, тот же, который вы использовали в приложении Node

В разделе Token Generation выберите свою страницу из выпадающего меню. После аутентификации для вас будет сгенерирован токен доступа к странице.

После аутентификации для вас будет сгенерирован токен доступа к странице

Создайте в Heroku еще одну переменную среды и установите для ее ключа значение PAGE_ACCESS_TOKEN, а сгенерированный токен - в качестве значения . Обратите внимание, что сгенерированный токен не будет сохранен на текущей странице, на которой он отображается в Facebook. Каждый раз, когда вы переходите на эту веб-страницу, поле «Токен доступа к странице» будет пустым, и при выборе страницы «Facebook» в раскрывающемся меню «Страница» будет сгенерирован новый токен. Тем не менее, все предыдущие созданные токены будут продолжать работать. Поэтому убедитесь, что вы скопировали токен перед закрытием веб-страницы.

Чтобы ваш webhook мог получать события для определенной страницы, вы должны подписать свое приложение на эту страницу. В разделе Webhooks выберите страницу для подписки.

Экран приветствия

Когда пользователь начинает новый разговор с вашим ботом, первое, что он увидит, это экран приветствия. Этот экран покажет название вашей страницы, описание, изображение профиля и фотографию обложки. Вы можете настроить экран, установив Текст приветствия это будет использоваться вместо описания страницы. Вы можете использовать это, чтобы установить вводное сообщение, которое сообщит пользователю, чего ожидать от вашего бота.

По умолчанию, чтобы начать разговор, именно пользователь отправляет первое сообщение вашему боту. Вы можете, однако, включить Кнопка «Начать» это позволит вашему боту отправить начальное сообщение. Кнопка отправит на ваш сервер событие, на которое вы сможете ответить.

Чтобы установить текст приветствия, откройте страницу и перейдите к ее настройкам .

Выберите « Сообщения» на левой панели, а затем включите « Показать приветствие Messenger» на правой панели. Установите сообщение по своему вкусу.

Чтобы включить кнопку «Начало работы», замените строку PAGE_ACCESS_TOKEN в следующей инструкции токеном и вставьте команду в Терминал.

curl -X POST -H "Content-Type: application / json" -d '{"setting_type": "call_to_actions", "thread_state": "new_thread", "call_to_actions": [{"payload": "Greeting"}] } '"https://graph.facebook.com/v2.6/me/thread_settings?access_token=PAGE_ACCESS_TOKEN"

Выше делается запрос к API Graph Facebook. Если запрос выполнен успешно, на экране приветствия нового разговора появится кнопка «Начать». Пользователь, нажав на кнопку, вызовет ответный обратный вызов. Ваш бот может ответить на этот постбэк.

Обратная передача может быть инициирована различными типами компонентов - кнопкой обратной передачи, кнопкой «Начало работы», постоянным меню или структурированным сообщением. Вы можете установить любую строку в качестве полезной нагрузки. На сервере мы будем использовать эту строку для идентификации обратной передачи, отправленной в результате нажатия кнопки «Начать». Чтобы получать сообщения обратной передачи, ваше приложение должно быть подписано на обратную передачу в вашем веб-крюке. Мы сделали это ранее, установив флажок messaging_postbacks при настройке webhook.

Если кнопка «Начало работы» успешно установлена, вы получите следующий ответ.

{"result": "Успешно добавлены CTA new_thread"}

Помните, что экран приветствия и кнопка « Начало работы» отображаются только для новых разговоров. При кодировании и тестировании вашего бота вы можете начать новый разговор, удалив текущий.

Чтобы обработать сообщение обратной передачи, вставьте следующее в приложение Node.

// Все обратные вызовы для Messenger будут POST-обработаны здесь app.post ("/ webhook", function (req, res) {// Убедитесь, что это подписка на страницу, если (req.body.object == "page") {// Итерация по каждой записи // Может быть несколько записей, если пакетная req.body.entry.forEach (function (entry) {// Итерация по каждому событию обмена сообщениями entry.messaging.forEach (function (event) {if (event) .postback) {processPostback (event);}});}); res.sendStatus (200);}}); function processPostback (event) {var senderId = event.sender.id; var payload = event.postback.payload; if (payload === "Greeting") {// Получить имя пользователя из API профиля пользователя // и включить его в приветственный запрос ({url: "https://graph.facebook.com/v2.6/ "+ senderId, qs: {access_token: process.env.PAGE_ACCESS_TOKEN, поля:" first_name "}, метод:" GET "}, функция (ошибка, ответ, тело) {varreeting =" "; if (error) {console .log ("Ошибка при получении имени пользователя:" + ошибка);} else {var bodyObj = JSON.parse (body); name = bodyObj.first_name ;reeting = "Hi" + name + ".";} var message = приветствие + «Меня зовут SP Movie Bot. Я могу рассказать вам различные подробности о фильмах. О каком фильме вы хотели бы знать?»; SendMessage (senderId, {text: message});}); }} // отправляет сообщение в пользовательскую функцию sendMessage (receientId, message) {request ({url: "https://graph.facebook.com/v2.6/me/messages", qs: {access_token: process.env. PAGE_ACCESS_TOKEN}, метод: "POST", json: {получатель: {id: receientId}, сообщение: сообщение,}}, функция (ошибка, ответ, тело) {if (ошибка) {console.log ("Ошибка отправки сообщения: "+ response.error);}}); }

Всякий раз, когда кто-то взаимодействует с вашим ботом или отправляет на вашу страницу сообщение, через вашу интеграцию с Webhook будет отправлено обновление. Чтобы получать сообщения, вы должны прослушивать POST-звонки на своем веб-крюке. Все обратные вызовы будут сделаны для этого webhook.

В описанном выше обработчике POST мы перебираем записи сообщений, отправляемых в приложение. Иногда сообщения группируются и отправляются вместе, поэтому запись может содержать несколько объектов. Затем мы перебираем событие сообщения каждой записи и проверяем его тип. Ниже показаны различные сообщения обратного вызова, которые можно отправить в приложение.

  • Обратный вызов полученного сообщения - Обратный вызов полученного сообщения отправляется, когда человек отправляет вашему боту сообщение. Вы должны были подписаться на событие сообщений при настройке вашего webhook.
  • Обратный вызов при получении ответа - Обратный вызов при получении ответа отправляется, когда человек нажимает кнопку, настроенную для отправки вам обратной передачи. Чтобы получить обратный вызов от постбэка, вы должны подписаться на событие messaging_postbacks при настройке вашего webhook.
  • Message Delivered callback - этот обратный вызов происходит, когда доставлено сообщение, отправленное страницей. Вы должны были подписаться на событие message_deliveries при настройке вашего webhook.
  • Аутентификационный обратный вызов - этот обратный вызов будет происходить, когда подключаемый модуль Send-to-Messenger был нажат. Вы должны были подписаться на событие messaging_optins при настройке вашего webhook.
  • Обратный вызов чтения сообщения - этот обратный вызов будет происходить, когда сообщение, отправленное отправленной страницей, было прочитано пользователем. Вы должны были подписаться на событие message_reads при настройке вашего webhook.
  • Message Echo callback - этот обратный вызов происходит, когда сообщение было отправлено вашей страницей. Вы можете получать текстовые сообщения или сообщения с вложениями (изображение, видео, аудио, шаблон или запасной вариант). Вы должны были подписаться на событие message_echoes при настройке вашего webhook.
  • Checkout Update callback (BETA) - этот обратный вызов будет происходить при использовании кнопки «Купить» с транзакцией с гибкой суммой. Это позволяет обновлять цены на основе адреса доставки человека. Вы должны были подписаться на событие messaging_checkout_updates при настройке вашего webhook. На данный момент, это не доступно за пределами США.
  • Оплата обратного вызова (BETA) - этот обратный вызов происходит, когда человек нажимает кнопку оплаты в диалоговом окне оформления заказа, отображаемом кнопкой «Купить». Вы должны были подписаться на событие messaging_payments при настройке вашего webhook. На данный момент, это не доступно за пределами США.

Если событие является Postback, мы вызываем функцию processPostback (), где мы проверяем значение полезной нагрузки. Помните, что мы установили Greeting в качестве полезной нагрузки кнопки Get Started, поэтому здесь мы сначала проверяем, было ли отправлено событие обмена сообщениями в результате нажатия этой кнопки. Если это так, мы используем API профиля пользователя, чтобы получить имя пользователя, и используем его для персонализации сообщения, которое будет отправлено ему обратно. Из API вы можете получить их имя, фамилию, изображение профиля, локаль, часовой пояс и пол.

Затем сообщение отправляется функции sendMessage (), которая отправляет его в Messenger Platform. Вернувшись в обработчик POST Webhook, мы возвращаем HTTP-ответ 200 OK.

Важно вернуть ответ 200 как можно быстрее. Facebook будет ждать 200, прежде чем отправить вам следующее сообщение. У ботов с большими объемами задержка возврата 200 может привести к значительным задержкам в доставке сообщений на ваш веб-крючок в Facebook.

Если ваш webhook возвращает ошибку (т.е. не в состоянии 2XX) или истекает время ожидания (т. Е. Для ответа требуется более 20 секунд), и он продолжает это делать более 15 минут, вы получите предупреждение.

Если веб-крючок продолжает выходить из строя в течение 8 часов, то Facebook отправит вам предупреждение, сообщающее, что веб-крючок отключен, тогда ваше приложение будет отписано. После того, как вы исправили проблемы, вы должны снова добавить свой веб-крючок и повторно подписать приложение на страницу.

Зафиксируйте изменения и отправьте их в Heroku.

Чтобы протестировать бота, вы можете начать беседу со своей страницей либо через facebook.com, мобильное приложение facebook, либо с помощью короткого URL-адреса Messenger https://m.me/PAGE_USERNAME (вскоре мы увидим, как создать имя пользователя) ,

В Facebook и мессенджере вы можете найти страницу, выполнив поиск по названию страницы.

В Facebook и мессенджере вы можете найти страницу, выполнив поиск по названию страницы

Как видно из вышесказанного, вы не всегда можете гарантировать, что имя страницы будет уникальным. Ваши пользователи могут выбрать не ту страницу. Чтобы предотвратить это, вы можете установить уникальное имя пользователя для страницы. Для этого перейдите на домашнюю страницу своей страницы и выберите « Изменить информацию о странице» в раскрывающемся меню «Дополнительно».

Для этого перейдите на домашнюю страницу своей страницы и выберите « Изменить информацию о странице» в раскрывающемся меню «Дополнительно»

Затем установите имя пользователя.

Затем установите имя пользователя

Теперь, если вы ищете @page_username, вы получите правильную страницу. Вы также можете перейти на https://m.me/PAGE_USERNAME, чтобы начать взаимодействие.

Ниже вы можете увидеть текст приветствия, который мы установили для экрана приветствия, а также кнопку « Начало работы» .

При нажатии на кнопку вы должны увидеть сообщение, отправленное с сервера.

Если вы введете какой-либо текст, вы не получите ответ. Мы позаботимся об этом дальше.

Настройка базы данных

Когда пользователь вводит название фильма, бот будет использовать API-интерфейс Open Movie Database чтобы узнать подробности фильма. Запрос API, который мы будем использовать, будет извлекать только первый соответствующий результат, поэтому возвращаемый фильм может не всегда соответствовать желаемому пользователю. Из-за этого бот сначала подтвердит пользователю, правильно ли он посмотрел фильм, и после этого пользователь может получить такие детали, как сюжет фильма, актеры, рейтинг IMDB и т. Д. Они также могут ввести другое название фильма и получить его детали вместо.

Из-за этого и обратно, бот должен будет помнить текущую запись фильма пользователя. Facebook не держит сеанс открытым с вашим веб-крюком, поэтому любые данные, которые вы сохраняете в объекте сеанса, будут потеряны при следующем запросе. Вместо этого мы сохраним эти данные в базе данных - точнее, MongoDB. Мы будем использовать MLAB-х дополнение к Heroku.

mLab - это база данных как услуга для MongoDB. На Heroku, хотя вы можете использовать бесплатный план mlab для песочницы, вам необходимо сохранить кредитную карту на Heroku для проверки. Если вы не хотите предоставлять данные своей карты, вы можете зарегистрировать учетную запись на веб-сайте mLab, создать там бесплатную базу данных песочницы и указать ссылку на нее в своем коде (подробнее об этом позже).

Чтобы использовать дополнение в Heroku, перейдите на панель инструментов приложения и выберите вкладку Ресурсы . Найдите mlab и выберите результат. В появившемся диалоговом окне выберите план «Песочница - бесплатно» из выпадающего меню и нажмите « Предоставление» . Вы должны увидеть подтверждение выбранного дополнения.

Вы должны увидеть подтверждение выбранного дополнения

Если вы проверите переменные окружения в Heroku, вы увидите переменную с уже установленным URI вашего MongoDB.

Если вы проверите переменные окружения в Heroku, вы увидите переменную с уже установленным URI вашего MongoDB

Настройка базы данных через веб-сайт mLab

Если вы предпочитаете настроить базу данных MongoDB на веб-сайте mLab, зарегистрируйтесь там и перейдите на страницу Создать новое развертывание стр. Измените параметр « План» на « Один узел», а затем выберите « Песочницу» в разделе « Стандартная линия ».

Задайте имя для своей базы данных и завершите процесс, нажав кнопку Создать новое развертывание MongoDB .

На следующей странице выберите базу данных, которую вы только что создали, из отображаемой таблицы. Откроется страница с инструкциями о том, как получить доступ к базе данных.

Выберите вкладку « Пользователи » и нажмите кнопку « Добавить пользователя базы данных» . Введите имя пользователя и пароль и нажмите « Создать» . Это создает новый набор учетных данных, которые вы можете использовать, чтобы разрешить вашему приложению доступ к БД.

В верхней половине страницы найдите и скопируйте URI базы данных - он будет выглядеть как mongodb: // <dbuser>: <dbpassword> @ dsxxxxxx.mlab.com: 55087 / spbot. Введите имя dbuser и пароль, которые вы только что создали. В Heroku создайте переменную среды с именем MONGODB_URI и вставьте в ее значение URI базы данных.

Определение класса модели

Вернувшись в приложение Node, создайте файл с названием movie.js и сохраните его в папке с названием модели. Вставьте следующее в файл:

var mongoose = require ("мангуст"); var Schema = mongoose.Schema; var MovieSchema = новая схема ({user_id: {type: String}, заголовок: {type: String}, сюжет: {type: String}, дата: {type: String}, время выполнения: {type: String}, директор: { type: String}, приведение: {type: String}, рейтинг: {type: String}, poster_url: {type: String}}); module.exports = mongoose.model ("Movie", MovieSchema);

Выше создается модель базы данных фильмов. User_id будет идентификатором пользователя, полученным из Messenger Platform, тогда как другие поля будут получены из API фильмов. Мы будем хранить только последний просмотренный фильм пользователя, поэтому в базе данных будет только одна запись на пользователя.

Мы могли бы опустить поле user_id и просто использовать идентификатор пользователя в качестве _id каждой созданной записи. Это сработало бы, поскольку идентификаторы пользователей являются уникальными для страницы Facebook. Если вы собираетесь это сделать, вы должны знать, что идентификаторы пользователей имеют объем страницы. Это означает, что идентификаторы пользователей являются уникальными для данной страницы, но пользователь может иметь разные идентификаторы для разных страниц.

Вам нужно знать об этом, только если ваш бот обслуживает разные страницы (да, бот может обслуживать несколько страниц ). Таким образом, если ваш бот обслуживает несколько страниц, возможно, будет неправильно идентифицировать пользователей только по их идентификаторам, а также будет неверно использовать идентификатор пользователя для поля _id записи, поскольку это должно быть уникальным, и вы не будете возможность гарантировать эту уникальность на всех страницах.

Собираем все вместе

Теперь, когда база данных и модель настроены, мы можем завершить чат-бота. Код будет представлен по частям, но если вы хотите вставить весь код в свой проект, вот ссылка в файл app.js.

Начните с настройки соединения с базой данных. Mongoose уже должен был быть установлен ранее с другими модулями.

var mongoose = require ("мангуст"); var db = mongoose.connect (process.env.MONGODB_URI); var Movie = require ("./ models / movie");

Измените обработчик POST webhook, как показано на рисунке.

// Все обратные вызовы для Messenger будут POST-обработаны здесь app.post ("/ webhook", function (req, res) {// Убедитесь, что это подписка на страницу, если (req.body.object == "page") {// Итерация по каждой записи // Может быть несколько записей, если пакетная req.body.entry.forEach (function (entry) {// Итерация по каждому событию обмена сообщениями entry.messaging.forEach (function (event) {if (event) .postback) {processPostback (event);} else if (event.message) {processMessage (event);}});}); res.sendStatus (200);}});

Мы добавили проверку событий типа сообщения, передав их в функцию processMessage ().

function processMessage (event) {if (! event.message.is_echo) {var message = event.message; var senderId = event.sender.id; console.log («Получено сообщение от senderId:» + senderId); console.log («Сообщение:» + JSON.stringify (сообщение)); // Вы можете получить текст или вложение, но не оба сразу if (message.text) {var formattedMsg = message.text.toLowerCase (). Trim (); // Если мы получим текстовое сообщение, проверьте, соответствует ли оно каким-либо специальным // ключевым словам, и отправьте обратно соответствующую информацию о фильме. // В противном случае ищите новый фильм. switch (formattedMsg) {case "plot": case "date": case "runtime": case "director": case "cast": case "rating": getMovieDetail (senderId, formattedMsg); перерыв; по умолчанию: findMovie (senderId, formattedMsg); }} else if (message.attachments) {sendMessage (senderId, {text: "Извините, я не понимаю ваш запрос."}); }}}

Здесь мы сначала проверяем, было ли сообщение отправлено с помощью функции обратного вызова. Этот обратный вызов произойдет, когда ваша страница отправит сообщение. Например, первое сообщение, которое мы отправили пользователю (приветствие), будет отправлено обратно в наш Webhook. Мы не хотим обрабатывать какие-либо из наших собственных сообщений, поэтому мы ставим проверку для этого.

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

function getMovieDetail (userId, field) {Movie.findOne ({user_id: userId}, function (err, movie) {if (err) {sendMessage (userId, {text: "Что-то пошло не так. Попробуйте снова"});} else {sendMessage (userId, {text: movie [field]});}}); }

Если запрос пользователя не соответствует ни одному из заданных ключевых слов, бот предполагает, что входные данные предназначены для запроса фильма, поэтому он передается в функцию findMovie (), которая вызывает API-интерфейс Open Movie Database с входными данными.

function findMovie (userId, movieTitle) {request ("http://www.omdbapi.com/?type=movie&amp;t=" + movieTitle, function (error, response, body) {if (! error & amp; & response .statusCode === 200) {var movieObj = JSON.parse (body); if (movieObj.Response === "True") {var query = {user_id: userId}; var update = {user_id: userId, title: movieObj.Title, сюжет: movieObj.Plot, дата: movieObj.Released, время выполнения: movieObj.Runtime, режиссер: movieObj.Director, актеры: movieObj.Actors, рейтинг: movieObj.imdbRating, poster_url: movieObj.Poster}; варианты вариантов = {upsert: true}; Movie.findOneAndUpdate (запрос, обновление, параметры, функция (err, mov) {if (err) {console.log ("Ошибка базы данных:" + err);} else {message = {attachment: { тип: "шаблон", полезная нагрузка: {template_type: "generic", элементы: [{title: movieObj.Title, подзаголовок: "Это фильм, который вы ищете?", image_url: movieObj.Poster === "N / A "?" Http://placehold.it/350x150 ": movieObj.Poster, кнопки: [{type:" postback ", заголовок:" Yes ", полезная нагрузка: "Correct"}, {type: "postback", title: "No", полезная нагрузка: "Неправильно"}]}]}}}; sendMessage (userId, message); }}); } else {console.log (movieObj.Error); sendMessage (userId, {text: movieObj.Error}); }} else {sendMessage (userId, {text: "Что-то пошло не так. Попробуйте еще раз."}); }}); }

Если фильм найден, его данные сохраняются вместе с идентификатором пользователя. Если запись с таким идентификатором пользователя была создана ранее, она будет обновлена. Затем мы создаем структурированное сообщение и отправляем его пользователю.

Помимо текста, Messenger Platform позволяет отправлять обратно изображения, видео, аудио, файлы и структурированные сообщения. Структурированные сообщения - это шаблоны, которые поддерживают различные варианты использования. Шаблон кнопки позволяет отправлять текст и кнопки. Общий шаблон позволяет определить изображение, заголовок, субтитры и кнопки. В нашем приложении мы используем общий шаблон.

Измените функцию processPostback (), как показано.

function processPostback (event) {var senderId = event.sender.id; var payload = event.postback.payload; if (payload === "Greeting") {// Получить имя пользователя из API профиля пользователя // и включить его в приветственный запрос ({url: "https://graph.facebook.com/v2.6/ "+ senderId, qs: {access_token: process.env.PAGE_ACCESS_TOKEN, поля:" first_name "}, метод:" GET "}, функция (ошибка, ответ, тело) {varreeting =" "; if (error) {console .log ("Ошибка при получении имени пользователя:" + ошибка);} else {var bodyObj = JSON.parse (body); name = bodyObj.first_name ;reeting = "Hi" + name + ".";} var message = приветствие + «Меня зовут SP Movie Bot. Я могу рассказать вам различные подробности о фильмах. О каком фильме вы хотели бы знать?»; SendMessage (senderId, {text: message});}); } else if (payload === "Correct") {sendMessage (senderId, {text: "Awesome! Что бы вы хотели узнать? Введите" plot "," date "," runtime "," Director ', "cast 'или' рейтинг 'для различных деталей. "}); } else if (payload === "Неправильно") {sendMessage (senderId, {text: "Упс! Извините. Попробуйте использовать точное название фильма"}); }}

Здесь мы добавляем две проверки для правильных и неправильных сообщений полезной нагрузки. Они будут прикреплены к кнопкам, которые пользователь будет использовать, чтобы сообщить боту, представил ли он правильный фильм.

Зафиксируйте свой код и отправьте его в Heroku, затем попробуйте отправить сообщения боту.

Когда вы отправляете запрос боту, если он находит фильм, он отправляет обратно структурированное сообщение, которое проверяет, был ли выбран правильный фильм.

В Интернете (и iOS) это выглядит немного иначе.

Структурированные сообщения могут иметь разные типы кнопок, как показано:

  • Кнопка URL : открыть URL в браузере приложения
  • Кнопка обратной передачи : отправьте обратную ссылку вашему веб-крюку, если вы хотите отправить действие своему боту
  • Кнопка вызова : вызов телефонного номера
  • Кнопка «Поделиться» : откройте диалоговое окно «Поделиться», чтобы сообщения могли быть переданы друзьям.
  • Кнопка "Купить" : открыть диалоговое окно оформления покупки

В нашем примере мы используем две кнопки обратной передачи и устанавливаем для их значений полезной нагрузки значения «правильный» и «неправильный». Если вы посмотрите на функцию processPostback (), вы увидите проверки для этих двух полезных нагрузок. Если нажать кнопку « Нет» , будет возвращено следующее сообщение:

Затем пользователь может сделать еще один запрос.

И после подтверждения, что это правильный фильм, они получат дальнейшие инструкции от бота о том, как действовать дальше.

Помните, мы проверяем эти ключевые слова в processMessage ().

Вы должны удостовериться, что вы отправили, правильно сформировано, иначе оно не будет показано пользователю. Я заметил, что некоторые API-интерфейсы возвращают фильмы, в которых отсутствуют некоторые детали в некоторых областях. В наших случаях значение поля не применимо. В нашем структурированном сообщении мы используем два поля из объекта, возвращаемого API - заголовок и постер (URL для постера фильма). Если фильм найден, у него всегда будет заголовок, поэтому нет необходимости подтверждать это, но если у фильма нет постера и вы не предоставили альтернативный URL для этого, структурированное сообщение не сможет быть показано. Поэтому убедитесь, что атрибуты в ваших структурированных сообщениях всегда имеют значения.

В нашем случае мы ссылаемся на изображение-заполнитель, если ни один из них не был возвращен.

Если по запросу пользователя не найдено ни одного фильма, бот сообщает об этом.

Если по запросу пользователя не найдено ни одного фильма, бот сообщает об этом

Живой с вашим ботом чата Facebook

Когда вы будете готовы опубликовать свое приложение для общественности, оно должно пройти процедуру одобрения. До утверждения приложения только вы и приглашенные вами тестеры смогут взаимодействовать с ним. Процесс отправки в группу обзора выходит за рамки данного руководства, но это руководство скажу вам, что вам нужно сделать.

Заключение

В этом уроке мы создали простой чат-бот Facebook, который может получать запросы от пользователей в Messenger и отвечать на них. Однако бот далеко не совершенен. Когда пользователь взаимодействует с ним, он ограничен строгим набором команд. Это не то, как люди разговаривают друг с другом. Бот может быть улучшен таким образом, чтобы пользователи могли взаимодействовать с ним более естественным образом, чем при общении между людьми, а не просто с помощью команд. Это может быть сделано путем интеграции обработки естественного языка в бот. Для этого вы можете создать свой собственный механизм НЛП или использовать такой сервис, как wit.ai который позволяет вам добавить НЛП в ваши приложения. wit.ai принадлежит Facebook и может свободно использоваться как для личных, так и для коммерческих проектов.

Что вы думаете о чат-ботах и ​​их возрастающем использовании? Если у вас есть страница в Facebook, подумаете ли вы о том, чтобы бот разрешил взаимодействие с вашими пользователями? Дайте мне знать, что вы думаете в комментариях.

Хотите узнать больше о ботах? Проверьте наш новый Премиум курс на создание бота Skype с помощью Microsoft Bot Framework !

Похожие

Считыватель отпечатков пальцев iPhone 5s: что нужно знать
Так что Apple объявила, что это здание считыватель отпечатков пальцев в свой новый флагманский смартфон, айфон 5с Называя эту технологию Touch ID. Вот что вам нужно знать об этом. Как работает сенсорный датчик Apple Touch ID?
Настройка виртуальной машины Windows 8
С запуском Windows 8's Consumer Preview Вам, наверное, не терпится потратить некоторое время на последнюю операционную систему Microsoft. Хотя вы, возможно, уже скачал ISO Спорим, некоторые из вас еще не решили, как вы собираетесь его установить. Учитывая, что вы только что встретились, мы
Создание и проверка будущего карты вашего клиента
... данных для развития персон, задавая правильные вопросы и выявляя конкретные пробелы в возможностях. Связанная статья: Используйте дизайн мышления, чтобы поставить себя на место ваших клиентов Ким Косака является директором по маркетингу в Alexa.com , чьи инструменты обеспечивают понимание
Защита SSH с помощью Fail2ban
SSH позволяет войти на удаленный компьютер или сервер и управлять им через интерфейс командной строки. Тем не менее, потому что SSH открыт для Интернета; Злоумышленники могут попытаться войти, используя различные комбинации имени пользователя и пароля. Хороший способ защитить SSH - запретить
Создание простого AI Chatbot с помощью Web Speech API и Node.js
Использование голосовых команд стало вездесущим в наши дни, поскольку все больше пользователей мобильных телефонов используют голосовых помощников, таких как Siri и Cortana, а устройства, такие как Amazon Echo и Google Home, вторгаются в наши жилые комнаты. Эти системы построены с программным обеспечением распознавания речи, которое позволяет их пользователям давать голосовые команды. Теперь наши веб-браузеры познакомятся с Web Speech API, который позволяет пользователям интегрировать
Приложение для веб-тестирования
Подготовка и подготовка веб-сайта - это длительный и сложный процесс, который не закончится, когда вы полностью подготовите веб-сайт. После разработки веб-сайта следует ряд строгих, но важных тестов, чтобы увидеть, готов ли веб-сайт функционировать вживую. Источник изображения:
Создайте план вашего сайта в 4 простых шага
За все годы создания веб-сайтов с клиентами я обнаружил, что единственным наиболее полезным шагом в подготовке создания веб-сайта является создание плана сайта. Кажется, многие люди, работающие самостоятельно, пропускают этот шаг, что является огромной ошибкой. Ничто не может ускорить создание вашего сайта, кроме продуманного плана сайта. Чтобы создать план сайта, вам нужно выполнить 4 основных шага. Шаг 1: Мозговой штурм идей для вашего сайта.
Функции систем управления базами данных (СУБД)
... данных относятся: непосредственное управление данными во внешней памяти; управления буферами оперативной памяти; управления транзакциями; ведение журнала или протокола выполненных операций в базе данных; поддержка языков баз данных. ⇑ 2. В чем заключается суть непосредственного
Как заменить Windows XP на Linux бесплатно
Пользователь XP, я говорю с вами. В апреле 2014 года ваша любимая операционная система остановился будучи официально поддерживаемым Microsoft. Теперь нет причин для паники, но это хорошая возможность начать рассматривать альтернативы. Не вдаваясь в подробности, бесплатный и захватывающий вариант - попробовать Linux. Сегодня мы продемонстрируем, как выполнить двойную загрузку существующей установки Windows
сайт недоступен
Hostinger на карте мира Хостинг-платформа мирового класса. Наша цель в том, чтоб позволить миллионам людей по всему миру использовать мощности интернета и ПРЕДОСТАВИТЬ им возможность учиться, создавать и расти. Выбирайте Свой Тариф Хостинга простой Хостинг 175,00 ₴ Экономия 89% 1 сайт 1 Email аккаунт 100 ГБ Трафик 1X Мощность процессор и память
Как выполнить сопряжение телефона с системой Acura RDX Bluetooth
Acura RDX оснащен технологией Bluetooth®, которая обеспечивает новый уровень связи для вас. Телефонные звонки в режиме громкой связи и отправка SMS-сообщений, а также потоковая передача всей вашей любимой музыки - ваши

Комментарии

Насколько индивидуальными или обширными являются требования к серверной отчетности и ведению журналов, и являются ли они неотъемлемой частью системы и требуют тестирования веб-приложения?
Насколько индивидуальными или обширными являются требования к серверной отчетности и ведению журналов, и являются ли они неотъемлемой частью системы и требуют тестирования веб-приложения? Ключевые моменты для страниц и макет страницы Страницы должны быть длиной 3-5 экранов, если контент не сфокусирован на одной теме. Если страница длиннее, укажите внутренние ссылки на странице Дизайн страницы
Samsung Galaxy Note 9: стоит ли обновлять систему на 512 ГБ за 1249,99 долларов США?
Samsung Galaxy Note 9: стоит ли обновлять систему на 512 ГБ за 1249,99 долларов США? Samsung Galaxy Note 9 - это мощный инструмент для повышения производительности бизнеса, который гигант бытовой электроники отчаянно хочет превратить в мейнстрим. Обновление зависит от того, хотите ли вы больше работать или играть. Samsung Galaxy
8. Для чего нужна журнализация или ведения протокола в базе данных?
8. Для чего нужна журнализация или ведения протокола в базе данных? Журнализация или ведения протокола выполненных команд необходима для восстановления последнего согласованного состояния БД после аппаратного или программного сбоя. Журнализация является необходимым для обеспечения надежности хранения данных во внешней памяти (на носителях информации). Аппаратные сбои возникают в результате: мгновенной остановки компьютера (например,
Чувствуете ли вы себя обязанным следовать на сайте призыв к действию ?
Является ли отпечаток пальца более безопасным, чем пароль? Отпечатки пальцев более и менее безопасны, чем коды доступа. Отпечаток пальца более безопасен, так как угадать его практически невозможно. Это может быть менее безопасно, потому что, если кто-то украдет это однажды, они украдут это для жизни. Это также зависит от того, как хранится отпечаток пальца. Если шаблон большой (например, более длинный, чем любой пароль, который вы когда-либо захотите запомнить),
Можно ли воспроизводить фильмы с ноутбука или ПК через DLNA?
Можно ли воспроизводить фильмы с ноутбука или ПК через DLNA? Можете ли вы транслировать фильмы и телепередачи через Netflix, Amazon Video, YouTube и другие? Есть ли щедрый портал приложений с другими интересными предложениями? У игроков, которые находятся в хорошем положении, есть хорошие шансы занять первое место в списке лидеров . Несмотря на это, хорошие 4K-плееры поддерживают различные форматы аудио, видео, видео и дисков. В дополнение
Есть ли проблема с настройкой?
Есть ли проблема с настройкой? 9,0 / 10 Безопасность и конфиденциальность Безопасность и конфиденциальность Как шифруются данные? И т. Д. 8,0 / 10 Программное обеспечение и дополнения Программное обеспечение и дополнительные функции Производитель устанавливает программное обеспечение? Предлагает ли система «дополнительные возможности» по сравнению с другими решениями? Информация о тестируемом продукте
Итак, что мне нужно?
Итак, что мне нужно? Немного! Вы, вероятно, хотите 1-2 ГБ оперативной памяти и 20-30 ГБ памяти, выделенной для виртуальной машины Windows 8. Вам нужен процессор, поддерживающий виртуализацию (в основном любой основной чип от Intel или AMD, выпущенный с 2006 года). Другими словами, вам нужен полу-современный компьютер. Сопровождая указанное оборудование, вам необходимо загрузить копию Windows 8 (32-разрядная или 64-разрядная версия будет работать нормально, но первая требует
Mercury Browser Pro - приложение для вас [iOS, бесплатно в течение ограниченного времени] Глядя на Ditch Mobile Safari?
Итак, что мне нужно? Немного! Вы, вероятно, хотите 1-2 ГБ оперативной памяти и 20-30 ГБ памяти, выделенной для виртуальной машины Windows 8. Вам нужен процессор, поддерживающий виртуализацию (в основном любой основной чип от Intel или AMD, выпущенный с 2006 года). Другими словами, вам нужен полу-современный компьютер. Сопровождая указанное оборудование, вам необходимо загрузить копию Windows 8 (32-разрядная или 64-разрядная версия будет работать нормально, но первая требует
Какое приложение вы используете для подключения по FTP?
Какое приложение вы используете для подключения по FTP? Дайте нам знать в комментариях ниже!
Так стоит ли это 139 долларов?
Так стоит ли это 139 долларов? В конце концов, он стоит рядом с AT & T Lumia 640 за 29 долларов США и Lumia 650 за 199 долларов США. Я намерен изучить это подробнее в этом обзоре. Спекуляции Четырехъядерный процессор 1,1 ГГц Snapdragon 210 GPU Adreno 304 Дисплей 4,7 ", 720p, 315 ppi, IPS Корпус ЖК-дисплея 136,1 x 67,8 x 9,9 мм, 141,9 г Камера 5 Мп, Передняя 2 Мп Видео 720p - 30 к / с, Передняя 720p - 30 к / с Диафрагма f / 2.4, передний f / 2.8 Размер сенсора 1/4 "Другие
Стоит ли цена?
Стоит ли цена? Как именно я покупаю и использую это? 5. Сенсорные точки. Точки касания охватывают каждое взаимодействие покупателя с брендом в течение жизненного цикла покупателя. Эти впечатления от бренда формируют настроение клиентов по отношению к бренду, что делает оптимизацию этого опыта абсолютно необходимой для получения лояльности к бренду. Точки соприкосновения могут включать веб-сайты, социальные сети, печатные СМИ (заработанные и оплаченные), вывески, взаимодействие

Нужно ли знать ИИ, чтобы построить бота?
Нужно ли знать ИИ, чтобы построить бота?
Me/thread_settings?
О каком фильме вы хотели бы знать?
Com/?
Title, подзаголовок: "Это фильм, который вы ищете?
Poster === "N / A "?
О каком фильме вы хотели бы знать?
Что бы вы хотели узнать?
Что вы думаете о чат-ботах и ​​их возрастающем использовании?