Узнать, что думает клиент о товарах после покупки, об указанных услугах, включая доставку, выявить проблемы в обслуживании — вроде бы понятная задача бизнеса. В этой статье расскажем, как под такие задачи реализовать отправку автоматических опросов по SMS с помощью Node.js и Exolve SMS API.

Обратная связь играет важную роль в бизнесе, от маркетинга и дизайна продукта до управления клиентским опытом. Один из эффективных и удобных способов собрать мнения клиентов — отправка SMS-опросов. 

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

Что понадобится 

  • Аккаунт разработчика в MTC Exolve

  • 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 приложения:

  1. Подключите установленные библиотеки и укажите, что приложение их использует.

  2. Укажите порт приложения.

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

Для этого создайте 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:

  1. В Личном кабинете откройте приложение, по номерам которого хотите получать уведомления. 

  2. Перейдите во вкладку «Настройки» в левом меню.

  3. Активируйте настройку «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-сообщение, приложение получит вебхук об этом и должно его обработать. Логика обработки вебхуков следующая:

  1. Exolve отправляет вебхуки о входящих и исходящих SMS-сообщениях, поэтому приложение обрабатывает только вебхуки о входящих SMS в статусе «оплачено».

  2. Получаете номер отправителя и текст его сообщения из POST запроса от Exolve.

  3. Если отправитель соглашается на опрос, создаёте объект с данными отправителя (номер, ответы на вопросы, количество отвеченных вопросов) и отправляете SMS с первым вопросом.

  4. Если отправитель уже участвует в опросе, записываете его ответ, и отправляете SMS со следующим вопросом.

  5. Если вопросы закончились, благодарите отправителя за прохождение опроса.

Добавьте следующий код, чтобы реализовать эту логику:

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: стильные рюкзаки, лонгсливы и мощные беспроводные зарядки. Победители прошлых розыгрышей и правила.

Комментарии (1)


  1. achekalin
    10.12.2024 06:29

    Ответ простой: быть готовым это мнение учесть!

    Озону и авито примерно пофиг, тут js не поможет.