Узнать, что думает клиент о товарах после покупки, об указанных услугах, включая доставку, выявить проблемы в обслуживании — вроде бы понятная задача бизнеса. В этой статье расскажем, как под такие задачи реализовать отправку автоматических опросов по SMS с помощью Node.js и Exolve SMS API.
Обратная связь играет важную роль в бизнесе, от маркетинга и дизайна продукта до управления клиентским опытом. Один из эффективных и удобных способов собрать мнения клиентов — отправка SMS-опросов.
Почти у каждого есть мобильное устройство, чтобы получать SMS-сообщения. Это означает высокую вероятность того, что клиент увидит опрос и примет участие в нем. Кроме того, исследования показывают, что люди обычно реагируют на SMS-сообщения намного быстрее и чаще, чем на другие виды коммуникации, такие как email или онлайн-анкеты.
Что понадобится
API-ключ приложения в аккаунте разработчика. Инструкции о том, как создать приложение и найти его API-ключ, вы можете найти в статьях «Создание приложения» и «API-ключ приложения»
Номер Exolve для отправки опросов и получения ответов от клиентов. Инструкцию о том, как купить номер, вы можете найти в статье «Покупка номера»
-
Node.js и следующие библиотеки:
express (создание сервера веб-приложения)
body-parser (парсинг тела входящих HTTP-запросов, которые отправляет Exolve на Event URL во время входящих вызовов)
axios (отправка HTTP-запроса в Exolve API для отправки SMS-сообщений)
Ngrok (или альтернативы) - сервис, который создает туннель между вашим локальным сервером и удалённым сервером, понадобится для получения вебхука о входящем SMS-сообщении от Exolve
Установите библиотеки, необходимые для работы Node.js-приложения. Если у вас ещё нет Node.js, вы можете скачать его с официального сайта. Вместе с ним установится npm — пакетный менеджер для скачивания внешних библиотек.
Создайте проект для приложения. Для этого выполните команду инициализации в консоли:
npm init
После выполнения команды введите название приложения, описание, имя автора и другие данные. После ввода и подтверждения всех данных будет создан package.json-файл с информацией о приложении и зависимостях — сторонних библиотеках для его работы.
Установите библиотеки, которые понадобятся далее. Выполните следующую команду в консоли:
npm i -s express body-parser axios
Она установит библиотеки, указанные в пункте «Что нам понадобится». После успешной установки в package.json-файле должны появиться зависимости от библиотек. Пример файла:
{
"name": "sms-survey",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Anastasia Ivanova",
"license": "ISC",
"dependencies": {
"axios": "^1.5.0",
"body-parser": "^1.20.2",
"express": "^4.18.2"
}
}
Основа Express.js сервера приложения
Создайте основу Express приложения:
Подключите установленные библиотеки и укажите, что приложение их использует.
Укажите порт приложения.
Укажите, что приложение слушает запросы на указанном порте, и сделайте вывод соответствующего сообщения в консоль.
Для этого создайте index.js-файл в корне проекта и добавьте туда следующий код:
// Подключение библиотек
const app = require('express')(); // приложение app работает на базе Express
const bodyParser = require("body-parser");
const axios = require('axios');
// Входящие HTTP-запросы обрабатываются библиотекой body-parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( {extended: false} ))
// Порт, на котором работает наше приложение
const port = 3001;
// Приложение будет слушать запросы на указанном выше порте
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`)
});
Сохраните изменения и запустите приложение. Для этого выполните в консоли команду:
node index.js
В консоли появится сообщение о том, что приложение доступно по адресу http://localhost:3001.
Настройка уведомлений о событиях в Личном кабинете МТС Exolve
SMS-опрос предполагает получение ответа от опрашиваемого. Exolve SMS API использует уведомления о событиях (вебхуки) для уведомления веб-приложений о входящих SMS-сообщениях на номера Exolve.
Нужно установить Event URL в Личном кабинете, на который вы будете получать уведомления (POST запросы) с ответами опрашиваемых. Чтобы установить URL:
В Личном кабинете откройте приложение, по номерам которого хотите получать уведомления.
Перейдите во вкладку «Настройки» в левом меню.
Активируйте настройку «SMS» в блоке «Уведомления о событиях».
В появившемся поле нужно ввести точку доступа приложения, на которую Exolve будет отправлять POST запрос с данными. Во время локальной разработки вам понадобится сервис, чтобы сделать ваш localhost доступным из интернета, например ngrok.
Ngrok и подобные сервисы создают туннель между вашим локальным сервером и удалённым сервером и предоставляют доступ к нему с уникального домена, который вы можете прописать в Личном кабинете Exolve, как URL для получения уведомлений.
Например, при запуске сервиса я получила URL https://8bef-88-201-206-130.ngrok-free.app, который переадресовывает HTTP запросы на мой localhost:3001:
Отправка опроса и получение ответов
Приложение будет делать SMS-рассылку с просьбой пройти опрос. Если получатель соглашается, то приложение будет отправлять SMS с вопросами и записывать ответы.
Для отправки SMS нужно отправить POST-запрос к Exolve SMS API, в котором понадобятся API-ключ, URL подключения, номер Exolve и номер получателя.
В «боевом» режиме API-ключ стоит хранить в переменных окружения для безопасности. Для простоты демонстрации в нашем примере мы объявим URL, API-ключ и номер Exolve как константы в index.js-файле. Добавьте следующий код:
// Данные для отправки SMS
const url = 'https://api.exolve.ru/messaging/v1/SendSMS';
const exolveNumber = 'EXOLVE_NUMBER';
const apiKey = 'YOUR_API_KEY';
Добавьте массив номеров, на которые хотите отправить SMS с предложением пройти опрос:
// Получатели рассылки
receivers = ['7924XXXXXXX', '7900XXXXXXX'];
Также добавьте пустой массив для записи номеров получателей, которые согласились пройти опрос, и их ответов.
// Согласившиеся пройти опрос и их ответы
respondents = [];
В «боевом» режиме стоит сохранять пару номер телефона и ответы в базу данных. Мы для простоты будем записывать данные в объект и добавлять в массив.
Добавьте список сообщений для SMS:
welcomeSMS = 'Вы хотели бы принять участие в опросе? Ответьте ДА, чтобы начать.';
surveyQuestions = ['Как вас зовут?', 'Какой ваш любимый цвет?'];
thanksSMS = 'Спасибо за участие в опросе!';
Отправка SMS-рассылки с предложением принять участие в опросе
Сначала напишите функцию для отправки SMS-сообщения с помощью библиотеки Axios:
function sendSMS(number, message) {
axios({
method: 'post',
url: url,
headers: { Authorization: 'Bearer ' + apiKey },
data: {
number: exolveNumber,
destination: number,
text: message,
},
}).then((response) => {
console.log(response.data); // выводим ID отправленного сообщения
});
}
Теперь добавьте функцию отправки SMS-сообщения всем получателям из массива receivers:
// Рассылка SMS сообщений с предложением пройти опрос
receivers.forEach((number) => {
sendSMS(number, welcomeSMS);
});
Обработка POST запроса от Exolve с данными о входящем SMS
Если получатели рассылки ответят на наше SMS-сообщение, приложение получит вебхук об этом и должно его обработать. Логика обработки вебхуков следующая:
Exolve отправляет вебхуки о входящих и исходящих SMS-сообщениях, поэтому приложение обрабатывает только вебхуки о входящих SMS в статусе «оплачено».
Получаете номер отправителя и текст его сообщения из POST запроса от Exolve.
Если отправитель соглашается на опрос, создаёте объект с данными отправителя (номер, ответы на вопросы, количество отвеченных вопросов) и отправляете SMS с первым вопросом.
Если отправитель уже участвует в опросе, записываете его ответ, и отправляете SMS со следующим вопросом.
Если вопросы закончились, благодарите отправителя за прохождение опроса.
Добавьте следующий код, чтобы реализовать эту логику:
app.post('/', async (req, res) => {
res.status(200).end();
// Фильтруем вебхуки (входящее сообщение в статусе "оплачено")
if (
req.body.direction === 'DIRECTION_INCOMING' &&
req.body.billing_status === 'BILLING_STATUS_BILLED'
) {
// Получаем номер отправителя и текст сообщения
const number = req.body.sender;
const message = req.body.text;
// Проверяем, если ли отправитель в массиве responders (получали ли мы от него SMS)
respondentIndex = respondents.findIndex((el) => el.number == number);
// Если нет и его первое сообщение "Да" (согласие на опрос)
if (respondentIndex == -1 && message.toLowerCase() === 'да') {
// Создаем объект с данными отправителя
const respondent = {
number: number,
answers: [],
surveyStep: 0, // получено ответов на вопросы опроса
};
respondents.push(respondent); // добавляем его в массив
sendSMS(number, surveyQuestions[respondent.surveyStep]); // отправляем SMS с первым вопросом
}
// Если отправитель есть в массиве (значит согласился на опрос и мы ему отправили первый вопрос)
else if (respondentIndex !== -1) {
respondents[respondentIndex].answers.push(message); // добавляем его ответ
respondents[respondentIndex].surveyStep += 1; // переход к следующему вопросу
console.log(respondents); // выводим данные о респондентах
// Если вопросы еще остались
if (respondents[respondentIndex].surveyStep < surveyQuestions.length) {
sendSMS(
number,
surveyQuestions[respondents[respondentIndex].surveyStep] // отправляем SMS со следующим вопросом
);
// Если вопросов больше нет
} else {
sendSMS(number, thanksSMS); // отправляем SMS с благодарностью
}
}
}
});
Запуск приложения
Перейдем к проверке. После запуска приложения при отправке SMS с предложением пройти опрос на один номер, вы должны получить подобный лог:
App listening at http://localhost:3001
{ message_id: '479035375021511347' } // ID SMS с предложением пройти опрос
{ message_id: '479035414078870195' } // ID SMS с первым вопросом
// данные респондентов
[
{ number: '7924XXXXXXX',
answers: [ 'Анастасия' ],
surveyStep: 1 }
]
{ message_id: '479035459662567508' } // ID SMS со следующим вопросом
// данные респондентов
[
{
number: '7924XXXXXXX',
answers: [ 'Анастасия', 'Фиолетовый' ],
surveyStep: 2
}
]
{ message_id: '479035482815124147' } // ID SMS с благодарностью
Как выглядит опрос на стороне респондента:
Таким образом мы написали Node.js приложение для рассылки автоматических SMS-опросов. Полный код приложения вы можете найти на GitHub.
Подписывайтесь на наш Хаб, следите за новыми гайдами и получайте приз
Каждый понедельник мы случайным образом выбираем победителей среди новых подписчиков нашего Хабр-канала и дарим крутые призы от МТС Exolve: стильные рюкзаки, лонгсливы и мощные беспроводные зарядки. Победители прошлых розыгрышей и правила.
achekalin
Ответ простой: быть готовым это мнение учесть!
Озону и авито примерно пофиг, тут js не поможет.