Привет, Хабр! Меня зовут Анастасия Иванова, я технический писатель МТС Exolve. В этой статье я расскажу, как можно реализовать автоматическое добавление номеров в чёрный список после нескольких входящих звонков в веб-приложении на NodeJS.

Мы привыкли видеть возможность контролировать и ограничивать нежелательные звонки и контакты повсюду. Многие маркетплейсы и приложения разрабатывают функции автоматического добавления номеров в чёрный список после нескольких звонков продавцам или пользователям. Такая опция помогает:
обеспечить пользователям защиту от нежелательных контактов: это может быть связано с маркетинговыми звонками, спамом или домогательством со стороны некоторых пользователей
защитить пользователей от потенциальных угроз со стороны мошенников: мошенники могут пытаться получить доступ к личным данным или финансовым счетам, представляясь различными организациями или услугами
сфокусироваться на значимых клиентах и улучшить опыт работы: позволяет избежать потери времени на нежелательные или назойливые контакты со стороны «потенциальных» покупателей, которые на самом деле не заинтересованы в покупке товара
Что нам понадобится
API-ключ приложения в аккаунте разработчика. Инструкции о том, как создать приложение и найти его API-ключ, вы можете найти в статьях «Создание приложения» и «API-ключ приложения»
Номер Exolve, на который можно позвонить. Инструкцию о том, как купить номер, вы можете найти в статье «Покупка номера»
Node.js и следующие библиотеки:
express (создание сервера веб-приложения)
body-parser (парсинг тела входящих HTTP-запросов, которые отправляет Exolve на Event URL во время входящих вызовов)
axios (отправка HTTP-запроса в Exolve API для добавления номера в чёрный список)
Установка библиотек
Установите библиотеки, необходимые для работы Node.js-приложения. Если у вас ещё нет Node.js, вы можете скачать его с официального сайта. Вместе с ним установится npm — пакетный менеджер для скачивания внешних библиотек.
Создайте проект для приложения. Для этого выполните команду инициализации в консоли:
npm init
После выполнения команды введите название приложения, описание, имя автора и другие данные. После ввода и подтверждения всех данных будет создан package.json-файл с информацией о приложении и зависимостях — сторонних библиотеках для его работы.
Установите библиотеки, которые понадобятся далее. Выполните следующую команду в консоли:
npm i -s express body-parser axios
Она установит библиотеки, указанные в пункте «Что нам понадобится». После успешной установки в package.json-файле должны появиться зависимости от библиотек. Пример файла:
{ "name": "blacklist", "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.4.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.
Добавление номера в чёрный список
Приложение будет добавлять номера телефонов в чёрный список. Для этого нужно отправить POST-запрос к Exolve Blacklist API, в котором понадобятся API-ключ, URL подключения и номер, который нужно заблокировать.
В «боевом» режиме API-ключ стоит хранить в переменных окружения для безопасности. Для простоты демонстрации в нашем примере мы объявим и URL, и API-ключ как константы в index.js-файле. Добавьте следующий код:
const url = 'https://api.exolve.ru/list/blacklist/v1/Add'; // Точка доступа Exolve API для добавления номера в чёрный список const apiKey = 'YOUR_API_KEY'; // API-ключ
Задача приложения — добавлять номер в чёрный список, если с него поступило определённое количество входящих звонков. Приложение должно выполнять следующие функции:
Получать и обрабатывать уведомления от МТС Exolve о входящих звонках.
Запоминать пару номер телефона и количество входящих вызовов с этого номера.
Добавлять номер в чёрный список, если количество звонков превышает установленное значение.
Настройка уведомлений о событиях в Личном кабинете МТС Exolve
МТС Exolve позволяет установить URL в Личном кабинете, на который вы будете получать уведомления (POST-запросы) с данными о входящих звонках. Чтобы установить URL:
В Личном кабинете откройте приложение, по номерам которого хотите получать уведомления.
Перейдите во вкладку «Настройки» в левом меню.
Активируйте настройку «Переадресация вхд. вызовов на URL» в блоке «Уведомления о событиях».
В появившемся поле нужно ввести точку доступа приложения, на которую Exolve будет отправлять POST-запрос с данными. Во время локальной разработки вам понадобится сервис, чтобы сделать ваш localhost доступным из интернета, например ngrok.
Ngrok и подобные сервисы создают туннель между вашим локальным сервером и удалённым сервером и предоставляет доступ к нему с уникального домена, который вы можете прописать в Личном кабинете Exolve, как URL для получения уведомлений.
Например, при запуске сервиса я получила URL https://d3da-88-201-206-8.ngrok-free.app, который переадресовывает HTTP-запросы на мой localhost:3001.
Сохранение пары номер телефона и количество входящих вызовов
В «боевом» режиме стоит сохранять пару номер телефона и количество входящих с него звонков в базу данных. Для простоты будем записывать данные в объект и добавлять в массив.
Создайте пустой массив callers:
var callers = []; // массив для хранения пар номер телефона + количество входящих звонков
Теперь добавьте функцию для сохранения объекта с н��мером телефона и количеством входящих звонков в массив:
function addCaller(phoneNumber) { // создаём объект для номера звонившего const caller = { phoneNumber: phoneNumber, numberOfCalls: 1, }; // Проверяем, есть ли в массиве callers объект с указанным номером callerIndex = callers.findIndex((el) => el.phoneNumber == phoneNumber); if (callerIndex == -1) { // Если нет, добавляем созданный объект в массив callers.push(caller); return 1; } else { // Если есть, увеличиваем количество звонков на 1 callers[callerIndex].numberOfCalls += 1; return callers[callerIndex].numberOfCalls; } }
Добавление номера в чёрный список
Далее напишите функцию для добавления номера в чёрный список c помощью библиотеки axios:
async function addToBlacklist(number) { // пробуем добавить номер в чёрный список try { await axios({ method: 'post', url: url, headers: { Authorization: 'Bearer ' + apiKey }, data: { numbers: [`${number}`], comment: 'calls limit exceeded', }, }).then((response) => { responseStatus = response.status; //записываем ответ от Exolve API в переменную }); } catch (error) { return error.response.data.error; // возвращаем текст ошибки, если номер не был добавлен в чёрный список } return responseStatus; // возвращаем ответ от Exolve API (200 OК — статус при успешном добавлении номера в чёрный список) }
Обработка POST-запроса от Exolve с данными о входящем звонке
Далее напишите функцию, которая будет обрабатывать POST-запрос от Exolve на URL приложения:
app.post('/', async (req, res) => { const phoneNumber = req.body.number_a; // Получаем номер звонящего из POST-запроса от Exolve const numberOfCalls = addCaller(phoneNumber); // Добавляем номер в массив данных / заменяем количество входящих звонков у существующего номера console.log(numberOfCalls); if (numberOfCalls == 2) { // Если количество звонков стало 2 (можно установить любое число по желанию) const isAdded = await addToBlacklist(phoneNumber); // Добавляем номер в чёрный список console.log(isAdded); } });
Таким образом мы реализовали функцию автоматического добавления номеров в чёрный список после определённого количества входящих звонков, что позволит обезопасить пользователей от нежелательных контактов. Полный код приложения вы можете найти на GitHub.
