Не нужно завязывать узелок на память. С помощью Node.js, Firebase и Twilio вы можете создать собственное приложение для ежедневных SMS-напоминаний.
Для создания этого приложения мы будем использовать несколько инструментов. Убедитесь, что они настроены перед продолжением:
— Twilio: Для отправки и получения SMS-сообщений. Нет аккаунта в Twilio? Зарегистрируйтесь бесплатно.
— Firebase: API для работы с базой данных в реальном времени. Мы будем использовать его для хранения информации о пользователях, подписавшихся на нашу услугу.
— Node.js: Платформа, построенная на базе JavaScript-движка Chrome, для простого создания быстрых и масштабируемых сетевых приложений.
Для начала установим несколько пакетов npm. Мы будем использовать пакет twilio для отправки текстовых сообщений и пакет cron для планирования времени отправки сообщений. Установите их, выполнив следующие команды:
Создайте новый файл app.js и подключите пакеты twilio и cron:
Давайте напишем код, который будет отправлять текстовое сообщение каждый день в 18:00:
Возможно, вы задаетесь вопросом, что означает строка, передаваемая в качестве первого аргумента в cronJob. Это формат cron, который позволяет задать время и частоту выполнения задачи. В данном случае — в 0 минут 18 часов каждый день. В этой статье хорошо объясняется формат cron.
В колбэке cronJob мы используем библиотеку клиента Twilio для отправки сообщения. Мы передаем номера получателя и отправителя, а также текст сообщения.
Запустите этот код и ждите SMS-сообщения. Если сейчас 10 утра, вам вряд ли захочется ждать 8 часов, чтобы проверить, работает ли код. Просто измените формат cron, чтобы отправка происходила раньше. Вот подсказка: чтобы отправить сообщение в 10:13, используйте формат: «13 10 * * *».
Теперь у вас есть базовая версия приложения, но, скорее всего, вы не захотите отправлять сообщения только себе каждый день. Если это так — поздравляем! Вы закончили. Для остальных мы внесем небольшие изменения в код, чтобы отправлять сообщения на несколько номеров.
Сначала добавим новую переменную numbers, содержащую номера телефонов, на которые мы хотим отправлять сообщения:
Затем обновим код в textJob, чтобы он перебирал эти номера и отправлял на них сообщения:
Теперь, когда мы отправляем SMS на разные номера в нужное время, давайте обновим код, чтобы приложение знало, когда пользователь отправляет сообщение. Twilio использует вебхуки для уведомления вашего сервера о входящих сообщениях или звонках. Нам нужно настроить конечную точку, которую Twilio будет использовать для вебхука сообщений.
Мы будем использовать фреймворк Express для настройки веб-сервера на Node.js, чтобы принимать POST-запросы от Twilio, поэтому установим пакет express. Также нам понадобится модуль body-parser, его тоже установим:
В начале файла app.js подключим express и инициализируем его в переменной app. Также используем middleware bodyParser, чтобы упростить работу с данными, получаемыми в POST-запросе.
Добавим маршрут для /message, который будет отвечать с помощью TwiML. TwiML — это набор инструкций, с помощью которых можно указать Twilio, что делать при получении входящего звонка или SMS. Наш код будет выглядеть так:
Мы используем библиотеку Twilio для Node.js, чтобы создать новый объект TwimlResponse. Затем с помощью глагола Message задаем текст ответа. В данном случае мы ответим: «Спасибо за подписку!». Затем установим тип содержимого ответа как text/xml и отправим строковое представление созданного TwimlResponse.
Наконец, настроим сервер на прослушивание порта 3000.
Теперь запустим наше приложение:
Если вы запускаете его локально, убедитесь, что у вас запущен ngrok, прежде чем переходить к следующему шагу. Если вы не использовали ngrok раньше, мой хороший друг Кевин подготовил отличное руководство, чтобы помочь вам начать.
Теперь, когда наш сервер запущен, нужно указать Twilio использовать этот URL в качестве Message Request URL:
Отправьте SMS на ваш номер Twilio, и вы должны получить ответ. Если этого не произошло, посмотрите в Twilio App Monitor, чтобы понять, что пошло не так.
Мы настроили скрипт, который отправляет SMS в одно и то же время каждый день, и дали пользователям возможность отправлять сообщения в наше приложение. Осталось сделать последнее: сохранить информацию о пользователях, когда они отправляют SMS. Мы будем использовать Firebase в качестве хранилища данных, поэтому установим модуль firebase для Node.js:
Теперь, когда модуль Firebase установлен, подключим и инициализируем его в начале файла app.js:
При регистрации в Firebase вам предоставляется URL для вашего хранилища данных. Убедитесь, что вы заменили {FIREBASEURL} на этот URL.
Поскольку мы будем получать номера телефонов из Firebase, обновим переменную numbers, сделав её пустым массивом, а затем заполним её данными из базы. Firebase — это база данных реального времени, работающая на принципе подписки на события, а не на запросах по требованию. Мы подпишемся на событие обновления, когда будет добавлен новый пользователь:
Теперь нужно добавлять пользователей в нашу базу данных, когда они отправляют сообщение с текстом «subscribe». Вернемся к нашему маршруту message и внесем изменения:
Когда вебхук Twilio для сообщений инициирует новый POST-запрос на ваш сервер, он включает параметры запроса с информацией о сообщении. Мы будем использовать параметр Body для анализа текста сообщения и параметр From для определения номера отправителя. Если пользователь отправил слово «subscribe» и его номер ещё не в базе, мы используем функцию push нашей ссылки Firebase, чтобы добавить его.
Наше приложение готово к работе. Запустим его и попробуем:
Готово! Теперь, когда вы создали простое приложение для ежедневных SMS-напоминаний, вы можете настроить сообщение на своё усмотрение. Возможно, это будет случайная цитата Джека Хэнди, заголовок из The New York Times или ссылка на забавный гиф. Когда закончите, напишите мне в Twitter или по электронной почте и расскажите, что у вас получилось. Я бы с удовольствием подписался.