Отправка SMS на JavaScript (Node.js): API библиотеки и практические примеры
В современном мире SMS-уведомления остаются одним из самых надежных способов связи с пользователями. Будь то подтверждение регистрации, код двухфакторной аутентификации или маркетинговые рассылки — возможность программно отправлять SMS-сообщения является критически важной для многих веб-приложений. В этой статье мы рассмотрим, как реализовать отправку SMS на JavaScript (Node.js) с использованием различных API и библиотек.
Выбор SMS-провайдера и получение API-ключа
Первый шаг — выбор сервиса для отправки SMS. Существует множество провайдеров, таких как Twilio, Nexmo (Vonage), Amazon SNS, ClickSend и другие. Для начала работы вам потребуется:
- Зарегистрироваться в выбранном сервисе.
- Пополнить баланс или подключить тестовый аккаунт.
- Получить API-ключ, SID и токен доступа (у каждого провайдера своя терминология).
- Настроить отправителя (Sender ID) — номер телефона или буквенное имя.
Установка необходимых библиотек
Для работы с API SMS-провайдеров в Node.js чаще всего используются официальные SDK. Рассмотрим установку на примере популярного сервиса Twilio и универсальной библиотеки axios для HTTP-запросов.
# Установка библиотеки Twilio
npm install twilio
# Установка axios для REST API запросов
npm install axios
Пример 1: Отправка SMS через Twilio SDK
Twilio предоставляет удобный SDK для Node.js. После установки создайте файл send-sms.js и добавьте следующий код:
const twilio = require('twilio');
// Ваши учетные данные из консоли Twilio
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = new twilio(accountSid, authToken);
async function sendSMS() {
try {
const message = await client.messages.create({
body: 'Привет! Это тестовое SMS из Node.js приложения.',
from: '+1234567890', // Номер, полученный от Twilio
to: '+79001234567' // Номер получателя
});
console.log('SMS отправлено. SID:', message.sid);
} catch (error) {
console.error('Ошибка отправки SMS:', error);
}
}
sendSMS();
Важно: Никогда не храните ключи в коде напрямую. Используйте переменные окружения (файл .env или системные настройки).
Пример 2: Отправка SMS через универсальное REST API
Если ваш провайдер не имеет официального SDK, вы можете использовать axios для отправки POST-запроса. Рассмотрим пример с абстрактным SMS-шлюзом:
const axios = require('axios');
const API_URL = 'https://api.sms-provider.com/v1/send';
const API_KEY = process.env.SMS_API_KEY;
async function sendSMSViaREST(phone, message) {
try {
const response = await axios.post(API_URL, {
apiKey: API_KEY,
phone: phone,
text: message,
sender: 'MyApp' // Имя отправителя
}, {
headers: {
'Content-Type': 'application/json'
}
});
console.log('Ответ сервера:', response.data);
} catch (error) {
console.error('Ошибка:', error.response ? error.response.data : error.message);
}
}
// Использование
sendSMSViaREST('+79001234567', 'Ваш код подтверждения: 1234');
Обработка ошибок и статусов доставки
При работе с SMS важно учитывать возможные ошибки:
- Неверный номер — проверяйте формат телефона (международный формат с +).
- Недостаточно средств — контролируйте баланс аккаунта.
- Ограничения провайдера — некоторые операторы блокируют массовые рассылки.
- Таймауты — используйте обработку ошибок и повторные попытки (retry).
Для проверки статуса доставки многие провайдеры предоставляют вебхуки (callback URL). Пример обработки входящего уведомления:
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook/sms-status', (req, res) => {
const { MessageSid, MessageStatus, To } = req.body;
console.log(`Статус SMS ${MessageSid} для номера ${To}: ${MessageStatus}`);
res.status(200).send('OK');
});
app.listen(3000, () => console.log('Сервер вебхуков запущен на порту Также в библиотеке
Конфигурация приложений на C++: библиотеки и инструменты для гибкой настройки
Swagger/OpenAPI генерация для Swift: инструменты и примеры кода
Redis клиент на Rust: полное руководство по работе с библиотекой redis-rs
CLI фреймворки для Go (Golang): полный обзор и сравнение