Введение
Часто, когда я кодирую, я проголодался. И все знают, что лучшие разработчики ленивы, поэтому вместо того, чтобы делать покупки и готовить и уборку, я обычно использую приложение для доставки еды и просто заказываю вкусную еду.
Проблема в том, что слишком часто мои любимые рестораны не работают. Иногда они закрыты для работы; в других случаях они слишком заняты и перестают принимать онлайн-заказы.
Поэтому я вынужден ждать и не забыть проверить, снова ли они в сети, а затем открыть приложение и посмотреть, снова ли они в сети. А иногда проверяют снова, и снова, и снова. Это действительно вопиющая несправедливость 😆.
Должен быть лучший, более инновационный способ! К счастью, недавно я обнаружил, что у моего любимого приложения для доставки еды, Wolt, есть API, который позволяет мне узнать, есть ли ресторан в сети. Поэтому, используя Vonage Messages API, я создал бота Facebook Messenger, который предупредит меня, когда мой любимый ресторан вернется в сеть!
(Этот пример построен на примере использования доставки еды, но тот же код можно переназначить для создания бота Facebook, который будет оповещать пользователей о любых логических изменениях случая.)
Предпосылки
Для этого приложения требуется следующее:
Псевдокод:
Прежде чем приступить к какой-либо задаче кодирования, мне нравится продумывать логику. Давайте разберем шаги, необходимые для создания этого приложения:
- Настройка экспресс-сервера
- Подключиться к песочнице Vonage Messages API
- Вызов Wolt API для запрошенного ресторана
- Проверить, находится ли полученный ресторан в сети
- Отправить сообщение пользователю в зависимости от статуса ресторана
- Если ресторан офлайн, добавьте в список офлайн-ресторанов.
- Постоянно проверяйте список офлайн-ресторанов на предмет изменения статуса.
- Если ресторан переходит в онлайн, отправьте сообщение пользователю и удалите его из списка офлайн-ресторанов.
Настройте наш проект
Создайте приложение узла
Начнем с создания нашего проекта:
Затем перейдите в каталог проекта:
Инициализируйте проект узла:
Установите наши необходимые пакеты 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
должно выглядеть так:
Отправить сообщение пользователю на основе статуса ресторана
Объединив нашу новую функциональность, мы можем обновить наш простой обмен сообщениями в песочнице, чтобы сообщить пользователю, находится ли запрошенный ресторан в настоящее время в сети или нет.
Цикл, если ресторан не в сети
Теперь, когда мы создали логику, основанную на статусе ресторана, мы хотим продолжить проверку этого статуса, пока ресторан, наконец, не вернется в сеть. Итак, нам нужно построить последние три шага нашего псевдокода:
- Если ресторан офлайн, добавьте в список офлайн-ресторанов.
- Постоянно проверяйте список офлайн-ресторанов на предмет изменения статуса.
- Если ресторан переходит в онлайн, отправьте пользователю сообщение и удалите его из списка офлайн-ресторанов.
Создание базы данных автономных ресторанов в оперативной памяти
На данный момент мы будем использовать нашу библиотеку 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/