Отправка SMS на TypeScript: API библиотеки и интеграция

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка SMS на TypeScript: обзор API и библиотек

Современные веб-приложения и сервисы часто требуют интеграции с SMS-шлюзами для отправки уведомлений, подтверждений или маркетинговых сообщений. TypeScript, как надстройка над JavaScript, предоставляет строгую типизацию, что особенно полезно при работе с внешними API. В этой статье мы рассмотрим, как организовать отправку SMS из TypeScript-приложения, используя популярные библиотеки и сервисы.

Почему TypeScript для работы с SMS API?

TypeScript добавляет статическую типизацию, что снижает количество ошибок в рантайме. При работе с SMS-провайдерами это критично, так как запросы к API часто содержат сложные структуры данных (номера телефонов, текст, параметры отправки). Типы помогают избежать опечаток в названиях полей и гарантируют корректную передачу данных.

Основные библиотеки для отправки SMS

На рынке существует несколько популярных сервисов, предоставляющих HTTP API для отправки SMS. Рассмотрим два наиболее распространённых варианта для TypeScript.

1. Twilio (официальный SDK)

Twilio — один из лидеров рынка облачных коммуникаций. Официальный SDK для Node.js полностью совместим с TypeScript и поставляется с готовыми типами.

Установка:

npm install twilio
npm install @types/twilio --save-dev  // типы уже включены, но для старых версий

Пример отправки SMS:

import { Twilio } from 'twilio';

const accountSid = 'ВАШ_ACCOUNT_SID';
const authToken = 'ВАШ_AUTH_TOKEN';
const client = new Twilio(accountSid, authToken);

interface SmsParams {
  to: string;          // номер получателя в формате +71234567890
  from: string;        // номер отправителя (купленный в Twilio)
  body: string;        // текст сообщения
}

async function sendSms(params: SmsParams): Promise<void> {
  try {
    const message = await client.messages.create({
      body: params.body,
      from: params.from,
      to: params.to,
    });
    console.log(`SMS отправлено. SID: ${message.sid}`);
  } catch (error) {
    console.error('Ошибка отправки:', error);
  }
}

// Использование
sendSms({
  to: '+79001234567',
  from: '+15005550006',
  body: 'Привет! Это тестовое сообщение из TypeScript.',
});

2. SMS Aero (REST API через fetch/axios)

SMS Aero — российский сервис, популярный для локальных проектов. Официального SDK для TypeScript нет, но можно использовать типизированные обёртки над fetch или axios.

Установка:

npm install axios

Пример с типизированным запросом:

import axios, { AxiosResponse } from 'axios';

interface SmsAeroResponse {
  status: 'success' | 'error';
  id?: number;
  message?: string;
}

interface SmsAeroParams {
  to: string;
  from?: string;
  text: string;
  sign?: string; // подпись отправителя
}

const API_URL = 'https://gate.smsaero.ru/v2/sms/send';
const EMAIL = 'ваш_email@example.com';
const API_KEY = 'ваш_ключ';

async function sendSmsAero(params: SmsAeroParams): Promise<SmsAeroResponse> {
  const auth = Buffer.from(`${EMAIL}:${API_KEY}`).toString('base64');
  
  const response: AxiosResponse<SmsAeroResponse> = await axios.post(
    API_URL,
    {
      number: params.to,
      text: params.text,
      sign: params.sign || 'SMS Aero',
    },
    {
      headers: {
        'Authorization': `Basic ${auth}`,
        'Content-Type': 'application/json',
      },
    }
  );
  
  return response.data;
}

// Использование
sendSmsAero({
  to: '79001234567',
  text: 'Ваш код подтверждения: 1234',
  sign: 'MyApp',
}).then(res => console.log(res));

Создание универсальной TypeScript-обёртки

Для проектов, где может потребоваться смена провайдера, удобно создать абстрактный интерфейс и фабрику.

interface SmsProvider {
  send(params: SmsParams): Promise<boolean>;
}

class TwilioProvider implements SmsProvider {
  async send(params: SmsParams): Promise<boolean> {
    // реализация для Twilio
    return true;
  }
}

class SmsAeroProvider implements SmsProvider {
  async send(params: SmsParams): Promise<boolean> {
    // реализация для SMS Aero
    return true;
  }
}

function createSmsProvider(type: 'twilio' | 'smsaero'): SmsProvider {
  switch (type) {
    case 'twilio': return new TwilioProvider();
    case 'smsaero': return new SmsAeroProvider();
    default: throw new Error('Неизвестный провайдер');
  }
}

Рекомендаций