Введение

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

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

Поэтому я вынужден ждать и не забыть проверить, снова ли они в сети, а затем открыть приложение и посмотреть, снова ли они в сети. А иногда проверяют снова, и снова, и снова. Это действительно вопиющая несправедливость 😆.

Должен быть лучший, более инновационный способ! К счастью, недавно я обнаружил, что у моего любимого приложения для доставки еды, Wolt, есть API, который позволяет мне узнать, есть ли ресторан в сети. Поэтому, используя Vonage Messages API, я создал бота Facebook Messenger, который предупредит меня, когда мой любимый ресторан вернется в сеть!

(Этот пример построен на примере использования доставки еды, но тот же код можно переназначить для создания бота Facebook, который будет оповещать пользователей о любых логических изменениях случая.)

Предпосылки

Для этого приложения требуется следующее:

Псевдокод:

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

  1. Настройка экспресс-сервера
  2. Подключиться к песочнице Vonage Messages API
  3. Вызов Wolt API для запрошенного ресторана
  4. Проверить, находится ли полученный ресторан в сети
  5. Отправить сообщение пользователю в зависимости от статуса ресторана
  6. Если ресторан офлайн, добавьте в список офлайн-ресторанов.
  7. Постоянно проверяйте список офлайн-ресторанов на предмет изменения статуса.
  8. Если ресторан переходит в онлайн, отправьте сообщение пользователю и удалите его из списка офлайн-ресторанов.

Настройте наш проект

Создайте приложение узла

Начнем с создания нашего проекта:

Затем перейдите в каталог проекта:

Инициализируйте проект узла:

Установите наши необходимые пакеты Node:

И, наконец, создайте файлы, в которых будет жить наш код:

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

Чтобы настроить наш сервер, нам понадобится некоторая информация из Панель инструментов разработчика Vonage. Во-первых, мы создадим новое приложение Vonage. Дайте ему красивое имя, например, isItDelivering. А затем нажмите Создать открытый и закрытый ключ.

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

На этом этапе ваш проект должен содержать файл индекса, модули узла, package.json и файл ENV. Если вы запустите команду ls, ваш проект должен выглядеть так:

Как видите, наше приложение Vonage позволяет нам включать/выключать различные возможности через различные API-интерфейсы Vonage. Мы хотим включить возможности сообщений. Теперь нас попросят указать два URL-адреса, соответствующие веб-перехватчикам, которые API сообщений будет использовать для взаимодействия с нашим бот-приложением.

Подключиться к внешнему миру

Настройка нгрока

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

Для наших целей нам просто нужно запустить его и скопировать URL-адрес, который он нам предоставляет.

После установки ngrok на вашем компьютере нам нужно будет его запустить. Чтобы запустить ngrok, откройте новое окно терминала и выполните в командной строке следующее:

Теперь вы увидите интерфейс ведения журнала ngrok в окне терминала. В верхней части интерфейса находится строка, начинающаяся с Forwarding и содержащая два URL-адреса. Первый — это доступный извне URL-адрес ngrok, который заканчивается на ngrok.io, за которым следует http://localhost:3000, что означает ваш локальный сервер разработки. Теперь, когда вы или Vonage свяжетесь с URL-адресом ngrok.io, он перенаправит его на ваш локальный сервер.

Теперь в нашей панели инструментов Vonage мы добавим наши URL-адреса ngrok и добавим соответствующие маршруты URL-адресов. Как только ваши URL-адреса будут выглядеть так, вы можете нажать кнопку «Создать новое приложение».

Свяжитесь с Vonage

Подключите свою учетную запись Vonage

В вашем файле ENV в вашем проекте вам нужно будет добавить 3 переменные среды; API_KEY , API_SECRET и APP_ID.

Вы можете найти свои API_KEY и API_SECRET на главной странице панели инструментов Vonage:

Ваш APP_ID находится на странице конфигурации созданного вами приложения. Вы найдете свое приложение под Your Applications на левой панели навигации. Ваш APP_ID будет выглядеть так:

После того, как вы скопировали/вставили их в свой проект, ваш файл ENV должен выглядеть примерно так:

Начало работы с песочницей Messages API

Добавление пользователей в вашу песочницу

Мы будем использовать песочницу Vonage Facebook. Вы можете найти Песочницу на панели инструментов Vonage на вкладке Сообщения и рассылка слева или нажать здесь. После того, как вы нажмете Add to Sandbox для вкладки Facebook Messenger, ваш экран должен выглядеть следующим образом:

Песочница Messages API позволяет быстро тестировать приложения, не дожидаясь одобрения бизнес-аккаунта. Песочница использует подход белого списка для разрешения тестовых пользователей. Вы можете пригласить дополнительных пользователей в белый список через Send invite email button или отправив им гиперссылку click this link. Ссылка откроет сеанс Facebook Messenger. Затем пользователю нужно будет отправить парольную фразу для добавления в белый список. Полную информацию можно найти здесь.

Подключение вашего приложения к вашей песочнице

Теперь нам нужно указать нашей песочнице прослушивать запросы от нашего приложения и доставлять их в Facebook Messenger. Это делается с помощью наших URL-адресов ngrok. Нам нужно будет добавить те же URL-адреса ngrok, что и раньше, например:

Как только мы нажмем кнопку Save webhooks, мы закончим настройку и можем начать программировать!

Весь последующий код будет находиться в нашем файле index.js.

Настройка экспресс-сервера

Создайте шаблонный сервер с зависимостями

Во-первых, давайте настроим шаблонный сервер Express в нашем файле index.js, который будет импортировать необходимые библиотеки и просто работать на порту 3000:

Отправка основного сообщения Facebook

Отправка сообщения Facebook из нашего приложения

Нам нужно инициализировать экземпляр Vonage, передав наши переменные ENV, а затем указать ему использовать песочницу Vonage в качестве хоста, используемого для выполнения HTTP-запросов. Мы можем скопировать следующий код в наш

Затем мы фактически используем этот объект Vonage для отправки запроса POST по нашему маршруту /inbound, и нам нужно указать минимальные параметры: type и text.

Итак, теперь во втором окне терминала, отдельном от нашего сервера ngrok, нам нужно запустить наш Express Server:

И мы можем взаимодействовать с нашим ботом Facebook!

Получение информации о ресторане из Wolt API

Выполнение HTTP-запроса

Используя конечную точку https://restaurant-api.wolt.com/v3/venues/slug/{restaurant}, мы знаем, что можем получать всевозможную информацию о ресторане. Возвращенный JSON выглядит так:

Мы видим, что внутри нулевого индекса есть свойство с именем name типа массив. По нулевому индексу name находится логическое значение online, которое дает текущий статус доставки в ресторане. Итак, мы можем создать функцию, которая берет название ресторана и возвращает объект ресторана из Wolt:

Проверьте, находится ли полученный ресторан в сети

Используя свойство online внутри объекта restaurant, мы хотим создать некоторую логику, которая будет определять, какое сообщение мы отправляем пользователю. Мы можем написать следующую функцию:

Функция firstStatusCheck абстрагировала наш код Vonage для отправки сообщения Facebook в функцию с именем sendFacebookMessage. Эта функция теперь может отправлять любое сообщение из нашей учетной записи Sandbox, если мы передаем ей два параметра text и recipient.

Мы можем использовать константную переменную SENDER для передачи информации об идентификаторе отправителя учетной записи Sandbox. Сначала объявим.

И затем мы назначаем его, когда получаем req от конечной точки /inbound:

Теперь sendFacebookMessage должно выглядеть так:

Отправить сообщение пользователю на основе статуса ресторана

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

Цикл, если ресторан не в сети

Теперь, когда мы создали логику, основанную на статусе ресторана, мы хотим продолжить проверку этого статуса, пока ресторан, наконец, не вернется в сеть. Итак, нам нужно построить последние три шага нашего псевдокода:

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

Создание базы данных автономных ресторанов в оперативной памяти

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

Во-первых, нам нужно включить Loki с другими нашими зависимостями:

Затем нам нужно создать экземпляр нашей базы данных:

Каждая запись ресторана будет содержать 4 точки данных: имя, онлайн-статус, получатель и ярлык. Name — это название ресторана. Online status — это логическое значение, указывающее, находится ли ресторан в данный момент в сети. Recipient — это информация о пользователе из Messages API, которая позволит нам отслеживать, кого нужно уведомлять. И, наконец, slug — это окончание URL-адреса, которое API Wolt использует для поиска ресторана.

Постоянно проверяйте изменения статуса

Теперь, когда у нас есть база данных, мы можем начать добавлять в нее наши офлайн-рестораны! Мы можем использовать следующую функцию, чтобы добавить рестораны в наш автономный список:

Теперь нам нужно обновить наш firstStatusCheck, чтобы добавить рестораны в автономный список.

Теперь, когда у нас есть список офлайн-ресторанов, мы хотим проверить, возвращаются ли они в онлайн. Поскольку мы хотим делать это регулярно и непрерывно, мы будем использовать встроенную функцию setInterval:

Константа INTERVAL сообщает setInterval, как часто следует запускать функцию offlineRestaurantLookup. Мы определяем это в верхней части файла рядом с SENDER. По умолчанию будем проверять каждые 60 секунд:

offlineRestaurantLookup извлечет все рестораны из автономной базы данных, а затем для каждого ресторана проверит, что ресторан все еще находится в автономном режиме.

Функция checkIsStill0ffline, в свою очередь, проверяет, находится ли сейчас ресторан в сети. Если ресторан перешел в онлайн, он сообщит правильному пользователю, а затем удалит этот ресторан из списка офлайн-ресторанов.

Теперь мы можем добавить функциональность setInterval ниже нашей логики обмена сообщениями в песочнице:

И теперь мы можем запустить программу, видя, что, когда ресторан находится в автономном режиме, мы получаем сообщение, уведомляющее об этом, а когда рестораны подключаются к сети, мы обновляемся до нового статуса. Я предлагаю попробовать приложение утром и увидеть, как рестораны внезапно открываются на обед. Забавно получать push-уведомления от Facebook Messenger на свой телефон!

Что дальше

  • В этом руководстве мы использовали функциональные возможности Facebook Messenger API сообщений, но мы могли бы расширить это приложение, чтобы обеспечить многоканальные возможности с помощью WhatsApp и SMS. Представьте себе очень срочный вариант использования (я имею в виду конкретный магазин рогаликов по субботам утром), когда вы хотели бы получать немедленное уведомление об изменении статуса; Многоканальные оповещения были бы полезны.
  • Мы могли бы расширить этот код, чтобы сделать оповещения более умными на основе графиков доставки, близости пользователей к ресторанам и многого другого. Мы также могли бы работать на нескольких работах.
  • Мы могли бы вывести приложение из «Песочницы» и подключить его к бизнес-аккаунту Facebook.

Окончательный код туториала можно найти на GitHub. Я хотел бы услышать, что вы создали с помощью Vonage Messages API! Пожалуйста, присоединяйтесь к обсуждению в нашем Community Slack и поделитесь своей историей!

Первоначально опубликовано на странице https://learn.vonage.com/blog/2021/11/10/restaurant-is-now-delivering-a-facebook-bot-in-node-js/